Feat Agrupación de Partidos por Alianzas
- Se permite la agrupación por alianzas en las vistas Nación.
This commit is contained in:
		| @@ -73,7 +73,7 @@ export const DevAppLegislativas = () => { | ||||
|             <div style={sectionStyle}> | ||||
|                 <h2>Widget: Carrusel de Resultados Nación (Home)</h2> | ||||
|                 <p style={descriptionStyle}> | ||||
|                     Uso: <code style={codeStyle}><HomeCarouselNacionalWidget eleccionId={2} categoriaId={3} titulo="Diputados - Argentina" mapLinkUrl={''} /></code> | ||||
|                     Uso: <code style={codeStyle}><HomeCarouselNacionalWidget eleccionId={2} categoriaId={3} titulo="Diputados - Total País" mapLinkUrl={''} /></code> | ||||
|                 </p> | ||||
|                 <HomeCarouselNacionalWidget | ||||
|                     eleccionId={2} | ||||
| @@ -86,7 +86,7 @@ export const DevAppLegislativas = () => { | ||||
|             <div style={sectionStyle}> | ||||
|                 <h2>Widget: Carrusel de Resultados Nación (Home)</h2> | ||||
|                 <p style={descriptionStyle}> | ||||
|                     Uso: <code style={codeStyle}><HomeCarouselNacionalWidget eleccionId={2} categoriaId={2} titulo="Senadores - Argentina" /></code> | ||||
|                     Uso: <code style={codeStyle}><HomeCarouselNacionalWidget eleccionId={2} categoriaId={2} titulo="Senadores - Total País" /></code> | ||||
|                 </p> | ||||
|                 <HomeCarouselNacionalWidget | ||||
|                     eleccionId={2} | ||||
|   | ||||
| @@ -220,7 +220,7 @@ public class ResultadosController : ControllerBase | ||||
|             return NotFound(new { message = $"No se encontró la sección electoral con ID {seccionId}" }); | ||||
|         } | ||||
|  | ||||
|         // --- CAMBIO 3: Filtrar también por el cargo (cámara) --- | ||||
|         // --- Filtrar también por el cargo (cámara) --- | ||||
|         var proyecciones = await _dbContext.ProyeccionesBancas | ||||
|             .AsNoTracking() | ||||
|             .Include(p => p.AgrupacionPolitica) | ||||
| @@ -675,7 +675,7 @@ public class ResultadosController : ControllerBase | ||||
|             { | ||||
|                 // 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. | ||||
|                     // Agrupamos por el ID de la agrupación. | ||||
|                     .GroupBy(r => r.AgrupacionPolitica.Id) | ||||
|                     .Select(pg => new | ||||
|                     { | ||||
| @@ -871,7 +871,7 @@ public class ResultadosController : ControllerBase | ||||
|             var totalVotosSeccionCategoria = (decimal)resultadosCategoriaSeccion.Sum(r => r.CantidadVotos); | ||||
|  | ||||
|             return resultadosCategoriaSeccion | ||||
|                 // --- CAMBIO CLAVE: Agrupamos por el ID (string), no por el objeto --- | ||||
|                 // --- Agrupamos por el ID (string) --- | ||||
|                 .GroupBy(r => r.AgrupacionPolitica.Id) | ||||
|                 .Select(g => new | ||||
|                 { | ||||
| @@ -1004,7 +1004,7 @@ public class ResultadosController : ControllerBase | ||||
|     [HttpGet("panel/{ambitoId?}")] | ||||
|     public async Task<IActionResult> GetPanelElectoral(int eleccionId, string? ambitoId, [FromQuery] int categoriaId) | ||||
|     { | ||||
|         // Vista Nacional (sin cambios) | ||||
|         // Vista Nacional | ||||
|         if (string.IsNullOrEmpty(ambitoId)) | ||||
|         { | ||||
|             return await GetPanelNacional(eleccionId, categoriaId); | ||||
| @@ -1188,43 +1188,101 @@ public class ResultadosController : ControllerBase | ||||
|  | ||||
|     private async Task<IActionResult> GetPanelNacional(int eleccionId, int categoriaId) | ||||
|     { | ||||
|         // 1. Obtenemos todos los datos necesarios al inicio | ||||
|         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 mapeoNacional = await _dbContext.MapeoAgrupaciones.ToDictionaryAsync(m => m.IdAgrupacionProvincial); | ||||
|  | ||||
|         var resultadosAgregados = await _dbContext.ResultadosVotos.AsNoTracking() | ||||
|         var votosProvinciales = await _dbContext.ResultadosVotos.AsNoTracking() | ||||
|             .Include(r => r.AgrupacionPolitica) | ||||
|             .Where(r => r.EleccionId == eleccionId && r.CategoriaId == categoriaId) | ||||
|             .GroupBy(r => r.AgrupacionPolitica) | ||||
|             .Select(g => new { Agrupacion = g.Key, TotalVotos = g.Sum(r => r.CantidadVotos) }) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         // 2. Agrupamos los votos usando la tabla de mapeo | ||||
|         var resultadosAgregados = votosProvinciales | ||||
|             .Select(voto => | ||||
|             { | ||||
|                 if (mapeoNacional.TryGetValue(voto.AgrupacionPoliticaId, out var mapping)) | ||||
|                 { | ||||
|                     return new | ||||
|                     { | ||||
|                         Id = mapping.AgrupacionNacional, | ||||
|                         Nombre = mapping.AgrupacionNacional, | ||||
|                         NombreCorto = mapping.NombreCortoNacional, | ||||
|                         Color = mapping.ColorNacional, | ||||
|                         LogoUrl = mapping.LogoUrlNacional, | ||||
|                         OriginalId = voto.AgrupacionPoliticaId, | ||||
|                         CantidadVotos = voto.CantidadVotos | ||||
|                     }; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     return new | ||||
|                     { | ||||
|                         Id = voto.AgrupacionPolitica.Id, | ||||
|                         Nombre = voto.AgrupacionPolitica.Nombre, | ||||
|                         NombreCorto = voto.AgrupacionPolitica.NombreCorto, | ||||
|                         Color = voto.AgrupacionPolitica.Color, | ||||
|                         LogoUrl = (string?)null, | ||||
|                         OriginalId = voto.AgrupacionPolitica.Id, | ||||
|                         CantidadVotos = voto.CantidadVotos | ||||
|                     }; | ||||
|                 } | ||||
|             }) | ||||
|             .GroupBy(x => x.Id) | ||||
|             .Select(g => | ||||
|             { | ||||
|                 var first = g.First(); | ||||
|                 return new | ||||
|                 { | ||||
|                     Agrupacion = new | ||||
|                     { | ||||
|                         Id = first.Id, | ||||
|                         Nombre = first.Nombre, | ||||
|                         NombreCorto = first.NombreCorto, | ||||
|                         Color = first.Color, | ||||
|                         LogoUrl = first.LogoUrl, | ||||
|                         ProvincialIdFallback = first.OriginalId | ||||
|                     }, | ||||
|                     TotalVotos = g.Sum(item => item.CantidadVotos) | ||||
|                 }; | ||||
|             }) | ||||
|             .ToList(); | ||||
|  | ||||
|         var totalVotosNacional = (decimal)resultadosAgregados.Sum(r => r.TotalVotos); | ||||
|  | ||||
|         // 3. Construimos los resultados del panel con la lógica de fallback para el logo | ||||
|         var resultadosPanel = resultadosAgregados | ||||
|         .Select(g => | ||||
|         { | ||||
|             var candidatoMatch = FindBestCandidatoMatch(todosLosOverrides, g.Agrupacion.Id, categoriaId, null, eleccionId); | ||||
|             var logoMatch = FindBestLogoMatch(todosLosLogos, g.Agrupacion.Id, categoriaId, null, eleccionId); | ||||
|  | ||||
|             return new AgrupacionResultadoDto | ||||
|             .Select(g => | ||||
|             { | ||||
|                 Id = g.Agrupacion.Id, | ||||
|                 Nombre = g.Agrupacion.Nombre, | ||||
|                 NombreCorto = g.Agrupacion.NombreCorto, | ||||
|                 Color = g.Agrupacion.Color, | ||||
|                 Votos = g.TotalVotos, | ||||
|                 Porcentaje = totalVotosNacional > 0 ? (g.TotalVotos / totalVotosNacional) * 100 : 0, | ||||
|                 NombreCandidato = candidatoMatch?.NombreCandidato, | ||||
|                 LogoUrl = logoMatch?.LogoUrl | ||||
|             }; | ||||
|         }) | ||||
|         .OrderByDescending(r => r.Votos) | ||||
|         .ToList(); | ||||
|                 var candidatoMatch = FindBestCandidatoMatch(todosLosOverrides, g.Agrupacion.Id, categoriaId, null, eleccionId); | ||||
|                 var logoFinal = g.Agrupacion.LogoUrl ?? FindBestLogoMatch( | ||||
|                     todosLosLogos, | ||||
|                     g.Agrupacion.ProvincialIdFallback, | ||||
|                     categoriaId, | ||||
|                     null, | ||||
|                     eleccionId)?.LogoUrl; | ||||
|  | ||||
|         // Calculamos los totales nacionales sumando los datos de todas las provincias (NivelId = 10). | ||||
|                 return new AgrupacionResultadoDto | ||||
|                 { | ||||
|                     Id = g.Agrupacion.Id, | ||||
|                     Nombre = g.Agrupacion.Nombre, | ||||
|                     NombreCorto = g.Agrupacion.NombreCorto, | ||||
|                     Color = g.Agrupacion.Color, | ||||
|                     Votos = g.TotalVotos, | ||||
|                     Porcentaje = totalVotosNacional > 0 ? (g.TotalVotos / totalVotosNacional) * 100 : 0, | ||||
|                     NombreCandidato = candidatoMatch?.NombreCandidato, | ||||
|                     LogoUrl = logoFinal | ||||
|                 }; | ||||
|             }) | ||||
|             .OrderByDescending(r => r.Votos) | ||||
|             .ToList(); | ||||
|  | ||||
|         // El resto del método para calcular los totales de escrutinio permanece igual. | ||||
|         var totalesProvincialesAgregados = await _dbContext.EstadosRecuentosGenerales | ||||
|             .AsNoTracking() | ||||
|             .Where(e => e.EleccionId == eleccionId && e.CategoriaId == categoriaId && e.AmbitoGeografico.NivelId == 10) | ||||
|             .GroupBy(e => 1) // Agrupamos todo en una sola fila. | ||||
|             .GroupBy(e => 1) | ||||
|             .Select(g => new | ||||
|             { | ||||
|                 TotalVotantes = g.Sum(e => e.CantidadVotantes), | ||||
| @@ -1256,7 +1314,6 @@ public class ResultadosController : ControllerBase | ||||
|             ResultadosPanel = resultadosPanel, | ||||
|             EstadoRecuento = new EstadoRecuentoDto | ||||
|             { | ||||
|                 // Usamos los valores calculados. | ||||
|                 ParticipacionPorcentaje = participacionNacional, | ||||
|                 MesasTotalizadasPorcentaje = escrutadoNacional | ||||
|             } | ||||
| @@ -1665,15 +1722,81 @@ List<CandidatoOverride> overrides, string agrupacionId, int categoriaId, int? am | ||||
|     [FromQuery] int eleccionId, | ||||
|     [FromQuery] int categoriaId) | ||||
|     { | ||||
|         var votosAgregados = await _dbContext.ResultadosVotos.AsNoTracking() | ||||
|         // 1. OBTENER TODOS LOS DATOS NECESARIOS AL INICIO | ||||
|         var votosProvinciales = await _dbContext.ResultadosVotos.AsNoTracking() | ||||
|             .Include(r => r.AgrupacionPolitica) | ||||
|             .Where(r => r.EleccionId == eleccionId && r.CategoriaId == categoriaId) | ||||
|             .GroupBy(r => r.AgrupacionPolitica) | ||||
|             .Select(g => new { Agrupacion = g.Key, Votos = g.Sum(r => r.CantidadVotos) }) | ||||
|             .OrderByDescending(x => x.Votos) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         var mapeoNacional = await _dbContext.MapeoAgrupaciones | ||||
|             .ToDictionaryAsync(m => m.IdAgrupacionProvincial); | ||||
|  | ||||
|         // --- INICIO DE LA MODIFICACIÓN --- | ||||
|         // Añadimos la obtención de todos los logos de overrides | ||||
|         var todosLosLogos = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking() | ||||
|             .Where(l => l.EleccionId == eleccionId || l.EleccionId == 0) | ||||
|             .ToListAsync(); | ||||
|         // --- FIN DE LA MODIFICACIÓN --- | ||||
|  | ||||
|         var votosAgregados = votosProvinciales | ||||
|             .GroupBy(voto => | ||||
|             { | ||||
|                 if (mapeoNacional.TryGetValue(voto.AgrupacionPoliticaId, out var mapping)) | ||||
|                 { | ||||
|                     // Es un partido mapeado, usamos datos nacionales | ||||
|                     return new | ||||
|                     { | ||||
|                         Id = mapping.AgrupacionNacional, | ||||
|                         Nombre = mapping.AgrupacionNacional, | ||||
|                         NombreCorto = mapping.NombreCortoNacional, | ||||
|                         Color = mapping.ColorNacional, | ||||
|                         LogoUrl = mapping.LogoUrlNacional, | ||||
|                         // Guardamos el ID original para poder buscar overrides si es necesario | ||||
|                         OriginalId = voto.AgrupacionPoliticaId | ||||
|                     }; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     // Es un partido no mapeado, usamos sus propios datos | ||||
|                     return new | ||||
|                     { | ||||
|                         Id = voto.AgrupacionPolitica.Id, | ||||
|                         Nombre = voto.AgrupacionPolitica.Nombre, | ||||
|                         NombreCorto = voto.AgrupacionPolitica.NombreCorto, | ||||
|                         Color = voto.AgrupacionPolitica.Color, | ||||
|                         LogoUrl = (string?)null, // Lo buscaremos después | ||||
|                         OriginalId = voto.AgrupacionPolitica.Id | ||||
|                     }; | ||||
|                 } | ||||
|             }) | ||||
|             // Agrupamos por el Id del Key del grupo anónimo (Id nacional) | ||||
|             .GroupBy(g => g.Key.Id) | ||||
|             .Select(finalGroup => | ||||
|             { | ||||
|                 // Cada elemento de finalGroup es un IGrouping<anonKey, ResultadoVoto> | ||||
|                 // Tomamos el primer grupo y su Key para obtener los metadatos de la agrupación | ||||
|                 var firstKey = finalGroup.First().Key; | ||||
|                 return new | ||||
|                 { | ||||
|                     Agrupacion = new | ||||
|                     { | ||||
|                         Id = firstKey.Id, | ||||
|                         Nombre = firstKey.Nombre, | ||||
|                         NombreCorto = firstKey.NombreCorto, | ||||
|                         Color = firstKey.Color, | ||||
|                         LogoUrl = firstKey.LogoUrl, | ||||
|                         // Importante: Tomamos un ID provincial representativo para el fallback | ||||
|                         ProvincialIdFallback = firstKey.OriginalId | ||||
|                     }, | ||||
|                     // Sumamos todas las cantidades dentro de los grupos internos | ||||
|                     Votos = finalGroup.Sum(innerGroup => innerGroup.Sum(v => v.CantidadVotos)) | ||||
|                 }; | ||||
|             }) | ||||
|             .OrderByDescending(x => x.Votos) | ||||
|             .ToList(); | ||||
|  | ||||
|         // El resto de la lógica para calcular totales y porcentajes permanece igual. | ||||
|         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 categoriaInfo = await _dbContext.CategoriasElectorales.AsNoTracking().FirstOrDefaultAsync(c => c.Id == categoriaId); | ||||
|  | ||||
|         var totalesProvincialesAgregados = await _dbContext.EstadosRecuentosGenerales | ||||
| @@ -1729,7 +1852,16 @@ List<CandidatoOverride> overrides, string agrupacionId, int categoriaId, int? am | ||||
|             Resultados = votosAgregados.Select(r => | ||||
|             { | ||||
|                 var candidatoMatch = FindBestCandidatoMatch(todosLosOverrides, r.Agrupacion.Id, categoriaId, null, eleccionId); | ||||
|                 var logoMatch = FindBestLogoMatch(todosLosLogos, r.Agrupacion.Id, categoriaId, null, eleccionId); | ||||
|  | ||||
|                 // --- INICIO DE LA MODIFICACIÓN --- | ||||
|                 // Lógica de fallback para el logo | ||||
|                 var logoFinal = r.Agrupacion.LogoUrl ?? FindBestLogoMatch( | ||||
|                     todosLosLogos, | ||||
|                     r.Agrupacion.ProvincialIdFallback, // Usamos el ID provincial para la búsqueda de fallback | ||||
|                     categoriaId, | ||||
|                     null, | ||||
|                     eleccionId)?.LogoUrl; | ||||
|                 // --- FIN DE LA MODIFICACIÓN --- | ||||
|  | ||||
|                 return new ResultadoCandidatoDto | ||||
|                 { | ||||
| @@ -1740,7 +1872,7 @@ List<CandidatoOverride> overrides, string agrupacionId, int categoriaId, int? am | ||||
|                     Color = r.Agrupacion.Color, | ||||
|                     Votos = r.Votos, | ||||
|                     Porcentaje = totalVotosPositivos > 0 ? (r.Votos / totalVotosPositivos) * 100 : 0, | ||||
|                     FotoUrl = logoMatch?.LogoUrl | ||||
|                     FotoUrl = logoFinal // Usamos el logo obtenido con la lógica de fallback | ||||
|                 }; | ||||
|             }).ToList() | ||||
|         }; | ||||
|   | ||||
| @@ -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+1335b54d759c402b859b6d8338cd0c944cc70171")] | ||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8d7f5c1db6f69f3e6bee29c32b877e64080c45ed")] | ||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Api")] | ||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Api")] | ||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| {"GlobalPropertiesHash":"b5T/+ta4fUd8qpIzUTm3KyEwAYYUsU5ASo+CSFM3ByE=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["YB39loxHH43S4MF8aTOiogcIbBAIq5Qj3dlJkIfYVxI=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","muVh5sjH3sgdvuz4TbuTwTggX1uDnsWXgoosMKST/r4=","nrP5gSIA5vzgp8v12CAOr943QYLxU4Til6oiCcWSNI8=","yMd45U9BK07I3b3fBQ627PWTYyZ2ZjrmFc5VD\u002BQVx1Q=","xKskvcoJU0RVRN1a5dRqKRM7IP5vmmbraUaPFYjhnCc=","p7BjQw7aSZjfOCqmKm7/kPO9qegEQZBfirMjlOx/I1I=","MI0hVVLYavEhzHq/Z1UbajfrxanA1aET19aOH8G2ImI=","2dY8CqW9fAY8yN0foa\u002BZp2gc0RfPoPmB/tKSj1QoTw0=","79rfGLH4UjfTPvc//\u002BZjnBqdz585pUtYZ0/hwE2iEic=","PUqgvMdfTQkF5lpBVtHv2teQLV5WaEH0xMKTmINe2YQ=","\u002BFI0b4ppdxel/pby/y/xKImHrtdxo2g83OhskdREyIg=","jEESu6\u002BhbDvNMjLt/6OufuK\u002B9cHmzx\u002BTCIn4fWa9nSc=","UaCPJEvR4nVxxGCB5CUnRlJiw4drDW3Q3Nss\u002Bya2cv4=","ZqF13CT3rok/Gzl\u002BMsw3q9X1nf65bwEVD670efE3k\u002Bk=","gH3W7phPzBCY1DAVn4YnP4SA8Uaq73TpctS0yFSvzNM=","u5F4J4\u002BLHUIOCz5ze5NSF42mDeAaAfi\u002BKN3Ay3rKLY8=","GeUUID0ymF5rrBWdX7YHzWA5GiGkNWCNUog4sp4xL3c=","3BxX4I0JXoDqmE8m0BrRZhixBRlHEueS3jAlmUXE/I8=","IlET7uqumshgFxIEvfKRskON\u002BeAKZ7OfD/kCeAwn0PM=","NN2rS\u002B89ZAITWlNODPcF/lHIh3ZNmAHvUX4EjqSkX4s=","OE89N/FsYhRU1Dy5Ne83ehzSwlNc/RcxHrJpHxPHfqY=","QI7IL4TkYEqfUiIEXQiVCaZx4vrM9/wZlvOrhnUd4jQ=","UIntj4QoiyGr7bnJN8KK5PGrhQd89m\u002BLfh4T8VKPxAk=","J\u002Bfv/j3QyIW9bxolc46wDka8641F622/QgIllt0Re80=","Y/o0rakw9VYzEfz9M659qW77P9kvz\u002B2gTe1Lv3zgUDE=","8QWUReqP8upfOnmA5lMNgBxAfYJ1z3zv/WYBUXBEiog=","1L7p1HQI/Uoosqm7RyBuYjKbRFTycFgJEtHPSdlXWhU=","ZxPpBx5gkHuilHLcg/vcjvaXswvTqiUM0YaAEwbNSLI=","zSbNtRd32h6wCMWjU5ecl5a3ECd\u002BVBstFC3etkdk4s0=","urIQ/RlknPjR8\u002BeAcCsDIPiRjQGFfUdIC\u002BoT3wYB2dU=","ytyPPQGU70eGo9tCrHq5\u002BwXF3yVuqv9Z\u002Br1Zdf0XUCI=","scnW1D7e2F059zWPpwmOsIw6KIyloYSDqXXW70WAZpQ=","BY4GeeFiQbYpWuSzb2XIY4JatmLNOZ6dhKs4ZT92nsM=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","7Yl3qA5xr\u002BXUmuY\u002Bshj87a0l8dEYVlvjk253M66DWfo="],"CachedAssets":{},"CachedCopyCandidates":{}} | ||||
| {"GlobalPropertiesHash":"b5T/+ta4fUd8qpIzUTm3KyEwAYYUsU5ASo+CSFM3ByE=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["YB39loxHH43S4MF8aTOiogcIbBAIq5Qj3dlJkIfYVxI=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","yMd45U9BK07I3b3fBQ627PWTYyZ2ZjrmFc5VD\u002BQVx1Q=","xKskvcoJU0RVRN1a5dRqKRM7IP5vmmbraUaPFYjhnCc=","p7BjQw7aSZjfOCqmKm7/kPO9qegEQZBfirMjlOx/I1I=","MI0hVVLYavEhzHq/Z1UbajfrxanA1aET19aOH8G2ImI=","2dY8CqW9fAY8yN0foa\u002BZp2gc0RfPoPmB/tKSj1QoTw0=","79rfGLH4UjfTPvc//\u002BZjnBqdz585pUtYZ0/hwE2iEic=","PUqgvMdfTQkF5lpBVtHv2teQLV5WaEH0xMKTmINe2YQ=","\u002BFI0b4ppdxel/pby/y/xKImHrtdxo2g83OhskdREyIg=","jEESu6\u002BhbDvNMjLt/6OufuK\u002B9cHmzx\u002BTCIn4fWa9nSc=","UaCPJEvR4nVxxGCB5CUnRlJiw4drDW3Q3Nss\u002Bya2cv4=","ZqF13CT3rok/Gzl\u002BMsw3q9X1nf65bwEVD670efE3k\u002Bk=","gH3W7phPzBCY1DAVn4YnP4SA8Uaq73TpctS0yFSvzNM=","u5F4J4\u002BLHUIOCz5ze5NSF42mDeAaAfi\u002BKN3Ay3rKLY8=","GeUUID0ymF5rrBWdX7YHzWA5GiGkNWCNUog4sp4xL3c=","3BxX4I0JXoDqmE8m0BrRZhixBRlHEueS3jAlmUXE/I8=","IlET7uqumshgFxIEvfKRskON\u002BeAKZ7OfD/kCeAwn0PM=","NN2rS\u002B89ZAITWlNODPcF/lHIh3ZNmAHvUX4EjqSkX4s=","OE89N/FsYhRU1Dy5Ne83ehzSwlNc/RcxHrJpHxPHfqY=","QI7IL4TkYEqfUiIEXQiVCaZx4vrM9/wZlvOrhnUd4jQ=","UIntj4QoiyGr7bnJN8KK5PGrhQd89m\u002BLfh4T8VKPxAk=","J\u002Bfv/j3QyIW9bxolc46wDka8641F622/QgIllt0Re80=","Y/o0rakw9VYzEfz9M659qW77P9kvz\u002B2gTe1Lv3zgUDE=","8QWUReqP8upfOnmA5lMNgBxAfYJ1z3zv/WYBUXBEiog=","1L7p1HQI/Uoosqm7RyBuYjKbRFTycFgJEtHPSdlXWhU=","ZxPpBx5gkHuilHLcg/vcjvaXswvTqiUM0YaAEwbNSLI=","zSbNtRd32h6wCMWjU5ecl5a3ECd\u002BVBstFC3etkdk4s0=","urIQ/RlknPjR8\u002BeAcCsDIPiRjQGFfUdIC\u002BoT3wYB2dU=","ytyPPQGU70eGo9tCrHq5\u002BwXF3yVuqv9Z\u002Br1Zdf0XUCI=","jOi/jUJ7o3KWHJ\u002BTUu1vZl6Z/94v2iG7KCnN4hr9IxM=","EX3cE3dtzg9OULBi66wvzoTBda5oAAEkcAgb2vzAcRE=","i\u002BlquWEXQionduujlv277Sj/bnYmn0JtYjUAR5GjYbI=","BY4GeeFiQbYpWuSzb2XIY4JatmLNOZ6dhKs4ZT92nsM=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","iCYEGzjxtMCF9Bx2KuOz28eenE\u002Bzi818/JImx0MXYn0="],"CachedAssets":{},"CachedCopyCandidates":{}} | ||||
| @@ -1 +1 @@ | ||||
| {"GlobalPropertiesHash":"tJTBjV/i0Ihkc6XuOu69wxL8PBac9c9Kak6srMso4pU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["YB39loxHH43S4MF8aTOiogcIbBAIq5Qj3dlJkIfYVxI=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","muVh5sjH3sgdvuz4TbuTwTggX1uDnsWXgoosMKST/r4=","nrP5gSIA5vzgp8v12CAOr943QYLxU4Til6oiCcWSNI8=","yMd45U9BK07I3b3fBQ627PWTYyZ2ZjrmFc5VD\u002BQVx1Q=","xKskvcoJU0RVRN1a5dRqKRM7IP5vmmbraUaPFYjhnCc=","p7BjQw7aSZjfOCqmKm7/kPO9qegEQZBfirMjlOx/I1I=","MI0hVVLYavEhzHq/Z1UbajfrxanA1aET19aOH8G2ImI=","2dY8CqW9fAY8yN0foa\u002BZp2gc0RfPoPmB/tKSj1QoTw0=","79rfGLH4UjfTPvc//\u002BZjnBqdz585pUtYZ0/hwE2iEic=","PUqgvMdfTQkF5lpBVtHv2teQLV5WaEH0xMKTmINe2YQ=","\u002BFI0b4ppdxel/pby/y/xKImHrtdxo2g83OhskdREyIg=","jEESu6\u002BhbDvNMjLt/6OufuK\u002B9cHmzx\u002BTCIn4fWa9nSc=","UaCPJEvR4nVxxGCB5CUnRlJiw4drDW3Q3Nss\u002Bya2cv4=","ZqF13CT3rok/Gzl\u002BMsw3q9X1nf65bwEVD670efE3k\u002Bk=","gH3W7phPzBCY1DAVn4YnP4SA8Uaq73TpctS0yFSvzNM=","u5F4J4\u002BLHUIOCz5ze5NSF42mDeAaAfi\u002BKN3Ay3rKLY8=","GeUUID0ymF5rrBWdX7YHzWA5GiGkNWCNUog4sp4xL3c=","3BxX4I0JXoDqmE8m0BrRZhixBRlHEueS3jAlmUXE/I8=","IlET7uqumshgFxIEvfKRskON\u002BeAKZ7OfD/kCeAwn0PM=","NN2rS\u002B89ZAITWlNODPcF/lHIh3ZNmAHvUX4EjqSkX4s=","OE89N/FsYhRU1Dy5Ne83ehzSwlNc/RcxHrJpHxPHfqY=","QI7IL4TkYEqfUiIEXQiVCaZx4vrM9/wZlvOrhnUd4jQ=","UIntj4QoiyGr7bnJN8KK5PGrhQd89m\u002BLfh4T8VKPxAk=","J\u002Bfv/j3QyIW9bxolc46wDka8641F622/QgIllt0Re80=","Y/o0rakw9VYzEfz9M659qW77P9kvz\u002B2gTe1Lv3zgUDE=","8QWUReqP8upfOnmA5lMNgBxAfYJ1z3zv/WYBUXBEiog=","1L7p1HQI/Uoosqm7RyBuYjKbRFTycFgJEtHPSdlXWhU=","ZxPpBx5gkHuilHLcg/vcjvaXswvTqiUM0YaAEwbNSLI=","zSbNtRd32h6wCMWjU5ecl5a3ECd\u002BVBstFC3etkdk4s0=","urIQ/RlknPjR8\u002BeAcCsDIPiRjQGFfUdIC\u002BoT3wYB2dU=","ytyPPQGU70eGo9tCrHq5\u002BwXF3yVuqv9Z\u002Br1Zdf0XUCI=","scnW1D7e2F059zWPpwmOsIw6KIyloYSDqXXW70WAZpQ=","BY4GeeFiQbYpWuSzb2XIY4JatmLNOZ6dhKs4ZT92nsM=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","7Yl3qA5xr\u002BXUmuY\u002Bshj87a0l8dEYVlvjk253M66DWfo="],"CachedAssets":{},"CachedCopyCandidates":{}} | ||||
| {"GlobalPropertiesHash":"tJTBjV/i0Ihkc6XuOu69wxL8PBac9c9Kak6srMso4pU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["YB39loxHH43S4MF8aTOiogcIbBAIq5Qj3dlJkIfYVxI=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","yMd45U9BK07I3b3fBQ627PWTYyZ2ZjrmFc5VD\u002BQVx1Q=","xKskvcoJU0RVRN1a5dRqKRM7IP5vmmbraUaPFYjhnCc=","p7BjQw7aSZjfOCqmKm7/kPO9qegEQZBfirMjlOx/I1I=","MI0hVVLYavEhzHq/Z1UbajfrxanA1aET19aOH8G2ImI=","2dY8CqW9fAY8yN0foa\u002BZp2gc0RfPoPmB/tKSj1QoTw0=","79rfGLH4UjfTPvc//\u002BZjnBqdz585pUtYZ0/hwE2iEic=","PUqgvMdfTQkF5lpBVtHv2teQLV5WaEH0xMKTmINe2YQ=","\u002BFI0b4ppdxel/pby/y/xKImHrtdxo2g83OhskdREyIg=","jEESu6\u002BhbDvNMjLt/6OufuK\u002B9cHmzx\u002BTCIn4fWa9nSc=","UaCPJEvR4nVxxGCB5CUnRlJiw4drDW3Q3Nss\u002Bya2cv4=","ZqF13CT3rok/Gzl\u002BMsw3q9X1nf65bwEVD670efE3k\u002Bk=","gH3W7phPzBCY1DAVn4YnP4SA8Uaq73TpctS0yFSvzNM=","u5F4J4\u002BLHUIOCz5ze5NSF42mDeAaAfi\u002BKN3Ay3rKLY8=","GeUUID0ymF5rrBWdX7YHzWA5GiGkNWCNUog4sp4xL3c=","3BxX4I0JXoDqmE8m0BrRZhixBRlHEueS3jAlmUXE/I8=","IlET7uqumshgFxIEvfKRskON\u002BeAKZ7OfD/kCeAwn0PM=","NN2rS\u002B89ZAITWlNODPcF/lHIh3ZNmAHvUX4EjqSkX4s=","OE89N/FsYhRU1Dy5Ne83ehzSwlNc/RcxHrJpHxPHfqY=","QI7IL4TkYEqfUiIEXQiVCaZx4vrM9/wZlvOrhnUd4jQ=","UIntj4QoiyGr7bnJN8KK5PGrhQd89m\u002BLfh4T8VKPxAk=","J\u002Bfv/j3QyIW9bxolc46wDka8641F622/QgIllt0Re80=","Y/o0rakw9VYzEfz9M659qW77P9kvz\u002B2gTe1Lv3zgUDE=","8QWUReqP8upfOnmA5lMNgBxAfYJ1z3zv/WYBUXBEiog=","1L7p1HQI/Uoosqm7RyBuYjKbRFTycFgJEtHPSdlXWhU=","ZxPpBx5gkHuilHLcg/vcjvaXswvTqiUM0YaAEwbNSLI=","zSbNtRd32h6wCMWjU5ecl5a3ECd\u002BVBstFC3etkdk4s0=","urIQ/RlknPjR8\u002BeAcCsDIPiRjQGFfUdIC\u002BoT3wYB2dU=","ytyPPQGU70eGo9tCrHq5\u002BwXF3yVuqv9Z\u002Br1Zdf0XUCI=","jOi/jUJ7o3KWHJ\u002BTUu1vZl6Z/94v2iG7KCnN4hr9IxM=","EX3cE3dtzg9OULBi66wvzoTBda5oAAEkcAgb2vzAcRE=","i\u002BlquWEXQionduujlv277Sj/bnYmn0JtYjUAR5GjYbI=","BY4GeeFiQbYpWuSzb2XIY4JatmLNOZ6dhKs4ZT92nsM=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","iCYEGzjxtMCF9Bx2KuOz28eenE\u002Bzi818/JImx0MXYn0="],"CachedAssets":{},"CachedCopyCandidates":{}} | ||||
| @@ -13,7 +13,7 @@ using System.Reflection; | ||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Core")] | ||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1335b54d759c402b859b6d8338cd0c944cc70171")] | ||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8d7f5c1db6f69f3e6bee29c32b877e64080c45ed")] | ||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Core")] | ||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Core")] | ||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||
|   | ||||
| @@ -24,6 +24,7 @@ public class EleccionesDbContext(DbContextOptions<EleccionesDbContext> options) | ||||
|     public DbSet<Eleccion> Elecciones { get; set; } | ||||
|     public DbSet<BancaPrevia> BancasPrevias { get; set; } | ||||
|     public DbSet<Conurbano> Conurbano { get; set; } | ||||
|     public IQueryable<AgrupacionNacionalMapping> MapeoAgrupaciones => Set<AgrupacionNacionalMapping>(); | ||||
|  | ||||
|     protected override void OnModelCreating(ModelBuilder modelBuilder) | ||||
|     { | ||||
| @@ -31,6 +32,12 @@ public class EleccionesDbContext(DbContextOptions<EleccionesDbContext> options) | ||||
|  | ||||
|         modelBuilder.UseCollation("Modern_Spanish_CI_AS"); | ||||
|  | ||||
|         modelBuilder.Entity<AgrupacionNacionalMapping>(entity => | ||||
|         { | ||||
|             entity.HasNoKey(); | ||||
|             entity.ToView("MapeoAgrupacionesNacionales"); // O .ToTable("MapeoAgrupacionesNacionales") | ||||
|         }); | ||||
|  | ||||
|         modelBuilder.Entity<Eleccion>(entity => | ||||
|         { | ||||
|             // Le decimos a EF que proporcionaremos el valor de la clave primaria. | ||||
|   | ||||
| @@ -0,0 +1,14 @@ | ||||
| // src/Elecciones.Database/Entities/AgrupacionNacionalMapping.cs | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Elecciones.Database.Entities; | ||||
|  | ||||
| public class AgrupacionNacionalMapping | ||||
| { | ||||
|   [Key] | ||||
|   public string IdAgrupacionProvincial { get; set; } = null!; | ||||
|   public string AgrupacionNacional { get; set; } = null!; | ||||
|   public string? NombreCortoNacional { get; set; } | ||||
|   public string? ColorNacional { get; set; } | ||||
|   public string? LogoUrlNacional { get; set; } | ||||
| } | ||||
| @@ -13,7 +13,7 @@ using System.Reflection; | ||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Database")] | ||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1335b54d759c402b859b6d8338cd0c944cc70171")] | ||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8d7f5c1db6f69f3e6bee29c32b877e64080c45ed")] | ||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Database")] | ||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Database")] | ||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||
|   | ||||
| @@ -13,7 +13,7 @@ using System.Reflection; | ||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Infrastructure")] | ||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1335b54d759c402b859b6d8338cd0c944cc70171")] | ||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8d7f5c1db6f69f3e6bee29c32b877e64080c45ed")] | ||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Infrastructure")] | ||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Infrastructure")] | ||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user