Feat Visual en Producción
This commit is contained in:
		| @@ -2,7 +2,7 @@ | |||||||
| import React from 'react'; | import React from 'react'; | ||||||
| import ReactDOM from 'react-dom/client'; | import ReactDOM from 'react-dom/client'; | ||||||
| import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; | import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; | ||||||
|  | /* | ||||||
| import { BancasWidget } from './features/legislativas/provinciales/BancasWidget' | import { BancasWidget } from './features/legislativas/provinciales/BancasWidget' | ||||||
| import { CongresoWidget } from './features/legislativas/provinciales/CongresoWidget' | import { CongresoWidget } from './features/legislativas/provinciales/CongresoWidget' | ||||||
| import MapaBsAs from './features/legislativas/provinciales/MapaBsAs' | 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 { ConcejalesPorSeccionWidget } from './features/legislativas/provinciales/ConcejalesPorSeccionWidget' | ||||||
| import { ResultadosTablaDetalladaWidget } from './features/legislativas/provinciales/ResultadosTablaDetalladaWidget'; | import { ResultadosTablaDetalladaWidget } from './features/legislativas/provinciales/ResultadosTablaDetalladaWidget'; | ||||||
| import { ResultadosRankingMunicipioWidget } from './features/legislativas/provinciales/ResultadosRankingMunicipioWidget'; | import { ResultadosRankingMunicipioWidget } from './features/legislativas/provinciales/ResultadosRankingMunicipioWidget'; | ||||||
|  | */ | ||||||
| //import { DevApp } from './components/common/DevApp'; | //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 './index.css'; | ||||||
| import { DevAppLegislativas } from './features/legislativas/DevAppLegislativas'; | import { DevAppLegislativas } from './features/legislativas/DevAppLegislativas'; | ||||||
|  |  | ||||||
|  |  | ||||||
| const queryClient = new QueryClient(); | const queryClient = new QueryClient(); | ||||||
|  |  | ||||||
| // Mapeamos el nombre del widget (del atributo data) al componente de React | // Mapeamos el nombre del widget (del atributo data) al componente de React | ||||||
| const WIDGET_MAP: Record<string, React.ElementType> = { | const WIDGET_MAP: Record<string, React.ElementType> = { | ||||||
|     'resumen-senadores': SenadoresWidget, |     // Widgets Legislativas Provinciales BsAs 2025 | ||||||
|  |     /*'resumen-senadores': SenadoresWidget, | ||||||
|     'resumen-diputados': DiputadosWidget, |     'resumen-diputados': DiputadosWidget, | ||||||
|     'resumen-concejales': ConcejalesWidget, |     'resumen-concejales': ConcejalesWidget, | ||||||
|     'congreso-provincial': CongresoWidget, |     'congreso-provincial': CongresoWidget, | ||||||
| @@ -47,7 +53,12 @@ const WIDGET_MAP: Record<string, React.ElementType> = { | |||||||
|     'senadores-por-seccion': SenadoresPorSeccionWidget, |     'senadores-por-seccion': SenadoresPorSeccionWidget, | ||||||
|     'concejales-por-seccion': ConcejalesPorSeccionWidget, |     'concejales-por-seccion': ConcejalesPorSeccionWidget, | ||||||
|     'resultados-tabla-detallada-por-seccion' : ResultadosTablaDetalladaWidget, |     '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' | // Vite establece `import.meta.env.DEV` a `true` cuando ejecutamos 'npm run dev' | ||||||
|   | |||||||
| @@ -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 |         .Where(l => l.EleccionId == eleccionId || l.EleccionId == 0) // Trae los de la elección actual y los de fallback | ||||||
|         .ToListAsync(); |         .ToListAsync(); | ||||||
|  |  | ||||||
|         // --- LÓGICA DE AGRUPACIÓN Y CÁLCULO CORREGIDA --- |         // --- LÓGICA DE AGRUPACIÓN Y CÁLCULO --- | ||||||
|         var resultadosAgrupados = resultadosPorMunicipio |         var resultadosAgrupados = resultadosPorMunicipio | ||||||
|         .GroupBy(r => r.CategoriaId) |         .GroupBy(r => r.CategoriaId) | ||||||
|         .Select(g => new |         .Select(g => new | ||||||
| @@ -465,7 +465,6 @@ public class ResultadosController : ControllerBase | |||||||
|  |  | ||||||
|     private async Task<IActionResult> GetComposicionDesdeProyecciones(Dictionary<string, string> config, int eleccionId) |     private async Task<IActionResult> GetComposicionDesdeProyecciones(Dictionary<string, string> config, int eleccionId) | ||||||
|     { |     { | ||||||
|         // --- INICIO DE LA CORRECCIÓN --- |  | ||||||
|         // 1. Obtenemos el ID del ámbito provincial para usarlo en el filtro. |         // 1. Obtenemos el ID del ámbito provincial para usarlo en el filtro. | ||||||
|         var provincia = await _dbContext.AmbitosGeograficos.AsNoTracking() |         var provincia = await _dbContext.AmbitosGeograficos.AsNoTracking() | ||||||
|             .FirstOrDefaultAsync(a => a.NivelId == 10); |             .FirstOrDefaultAsync(a => a.NivelId == 10); | ||||||
| @@ -480,7 +479,6 @@ public class ResultadosController : ControllerBase | |||||||
|                 Senadores = new { Partidos = new List<object>() } |                 Senadores = new { Partidos = new List<object>() } | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|         // --- FIN DE LA CORRECCIÓN --- |  | ||||||
|  |  | ||||||
|         var bancasPorAgrupacion = await _dbContext.ProyeccionesBancas |         var bancasPorAgrupacion = await _dbContext.ProyeccionesBancas | ||||||
|             .AsNoTracking() |             .AsNoTracking() | ||||||
| @@ -490,7 +488,6 @@ public class ResultadosController : ControllerBase | |||||||
|             { |             { | ||||||
|                 AgrupacionId = g.Key.AgrupacionPoliticaId, |                 AgrupacionId = g.Key.AgrupacionPoliticaId, | ||||||
|                 CategoriaId = g.Key.CategoriaId, |                 CategoriaId = g.Key.CategoriaId, | ||||||
|                 // Ahora la suma es correcta porque solo considera los registros a nivel provincial |  | ||||||
|                 BancasTotales = g.Sum(p => p.NroBancas) |                 BancasTotales = g.Sum(p => p.NroBancas) | ||||||
|             }) |             }) | ||||||
|             .ToListAsync(); |             .ToListAsync(); | ||||||
| @@ -618,16 +615,12 @@ public class ResultadosController : ControllerBase | |||||||
|             return Ok(new { UltimaActualizacion = DateTime.UtcNow, Resultados = new List<object>() }); |             return Ok(new { UltimaActualizacion = DateTime.UtcNow, Resultados = new List<object>() }); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // --- INICIO DE LA CORRECCIÓN DE LOGOS --- |  | ||||||
|  |  | ||||||
|         // 1. Buscamos logos que sean para esta categoría Y que sean generales (ámbito null). |         // 1. Buscamos logos que sean para esta categoría Y que sean generales (ámbito null). | ||||||
|         var logosGenerales = await _dbContext.LogosAgrupacionesCategorias |         var logosGenerales = await _dbContext.LogosAgrupacionesCategorias | ||||||
|             .AsNoTracking() |             .AsNoTracking() | ||||||
|             .Where(l => l.CategoriaId == categoriaId && l.AmbitoGeograficoId == null) |             .Where(l => l.CategoriaId == categoriaId && l.AmbitoGeograficoId == null) | ||||||
|             .ToDictionaryAsync(l => l.AgrupacionPoliticaId); |             .ToDictionaryAsync(l => l.AgrupacionPoliticaId); | ||||||
|  |  | ||||||
|         // --- FIN DE LA CORRECCIÓN DE LOGOS --- |  | ||||||
|  |  | ||||||
|         var resultadosMunicipales = await _dbContext.ResultadosVotos |         var resultadosMunicipales = await _dbContext.ResultadosVotos | ||||||
|             .AsNoTracking() |             .AsNoTracking() | ||||||
|             .Include(r => r.AgrupacionPolitica) |             .Include(r => r.AgrupacionPolitica) | ||||||
| @@ -687,7 +680,6 @@ public class ResultadosController : ControllerBase | |||||||
|             .GroupBy(r => r.AmbitoGeografico.SeccionProvincialId) |             .GroupBy(r => r.AmbitoGeografico.SeccionProvincialId) | ||||||
|             .Select(g => |             .Select(g => | ||||||
|             { |             { | ||||||
|                 // --- INICIO DE LA CORRECCIÓN --- |  | ||||||
|                 // Para cada sección, encontramos al partido con más votos. |                 // Para cada sección, encontramos al partido con más votos. | ||||||
|                 var ganador = g |                 var ganador = g | ||||||
|                     // CAMBIO CLAVE: Agrupamos por el ID de la agrupación, no por el objeto. |                     // 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) |                     .OrderByDescending(x => x.TotalVotos) | ||||||
|                     .FirstOrDefault(); |                     .FirstOrDefault(); | ||||||
|                 // --- FIN DE LA CORRECCIÓN --- |  | ||||||
|  |  | ||||||
|                 // Buscamos el nombre de la sección |                 // Buscamos el nombre de la sección | ||||||
|                 var seccionInfo = _dbContext.AmbitosGeograficos |                 var seccionInfo = _dbContext.AmbitosGeograficos | ||||||
| @@ -1243,8 +1234,6 @@ public class ResultadosController : ControllerBase | |||||||
|     { |     { | ||||||
|         if (string.IsNullOrEmpty(distritoId)) |         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. |             // 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. |             // Esto crea una lista con los totales, que es mucho más pequeña que los datos crudos. | ||||||
|             var votosAgregadosPorProvincia = await _dbContext.ResultadosVotos |             var votosAgregadosPorProvincia = await _dbContext.ResultadosVotos | ||||||
| @@ -1285,7 +1274,7 @@ public class ResultadosController : ControllerBase | |||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             // --- VISTA PROVINCIAL (SIN CAMBIOS, YA ERA EFICIENTE) --- |             // --- VISTA PROVINCIAL --- | ||||||
|             var votosAgregadosPorMunicipio = await _dbContext.ResultadosVotos |             var votosAgregadosPorMunicipio = await _dbContext.ResultadosVotos | ||||||
|                 .AsNoTracking() |                 .AsNoTracking() | ||||||
|                 .Where(r => r.EleccionId == eleccionId |                 .Where(r => r.EleccionId == eleccionId | ||||||
| @@ -1462,12 +1451,8 @@ List<CandidatoOverride> overrides, string agrupacionId, int categoriaId, int? am | |||||||
|     ?? logos.FirstOrDefault(l => l.EleccionId == 0 && l.AgrupacionPoliticaId == agrupacionId && l.CategoriaId == categoriaId && l.AmbitoGeograficoId == ambitoId) |     ?? 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) |     // 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) |     ?? 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) |     // 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); |     ?? logos.FirstOrDefault(l => l.EleccionId == 0 && l.AgrupacionPoliticaId == agrupacionId && l.CategoriaId == 0 && l.AmbitoGeograficoId == null); | ||||||
|     // --- FIN DE LA CORRECCIÓN --- |  | ||||||
| } | } | ||||||
|  |  | ||||||
|     [HttpGet("resumen-por-provincia")] |     [HttpGet("resumen-por-provincia")] | ||||||
| @@ -1483,8 +1468,6 @@ List<CandidatoOverride> overrides, string agrupacionId, int categoriaId, int? am | |||||||
|         const int catSenadoresNac = 1; |         const int catSenadoresNac = 1; | ||||||
|  |  | ||||||
|         var provinciasQueRenuevanSenadores = new HashSet<string> { "01", "06", "08", "15", "16", "17", "22", "23" }; |         var provinciasQueRenuevanSenadores = new HashSet<string> { "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 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 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(); |         var todosLosLogos = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking().Where(l => l.EleccionId == eleccionId || l.EleccionId == 0).ToListAsync(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user