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