Fix Controllers Resultados
This commit is contained in:
		| @@ -247,7 +247,6 @@ export const getEstablecimientosPorMunicipio = async (municipioId: string): Prom | |||||||
| }; | }; | ||||||
|  |  | ||||||
| export const getPanelElectoral = async (eleccionId: number, ambitoId: string | null, categoriaId: number): Promise<PanelElectoralDto> => { | export const getPanelElectoral = async (eleccionId: number, ambitoId: string | null, categoriaId: number): Promise<PanelElectoralDto> => { | ||||||
|  |  | ||||||
|   // Construimos la URL base |   // Construimos la URL base | ||||||
|   let url = ambitoId |   let url = ambitoId | ||||||
|     ? `/elecciones/${eleccionId}/panel/${ambitoId}` |     ? `/elecciones/${eleccionId}/panel/${ambitoId}` | ||||||
|   | |||||||
| @@ -138,15 +138,13 @@ public class ResultadosController : ControllerBase | |||||||
|         var resultadosPorMunicipio = await _dbContext.ResultadosVotos |         var resultadosPorMunicipio = await _dbContext.ResultadosVotos | ||||||
|             .AsNoTracking() |             .AsNoTracking() | ||||||
|             .Include(r => r.AgrupacionPolitica) |             .Include(r => r.AgrupacionPolitica) | ||||||
|             .Where(r => r.EleccionId == eleccionId && r.AmbitoGeografico.NivelId == 30) // Nivel 30 = Municipio |             .Where(r => r.EleccionId == eleccionId && r.AmbitoGeografico.DistritoId == distritoId && r.AmbitoGeografico.NivelId == 30) // Nivel 30 = Municipio | ||||||
|             .ToListAsync(); |             .ToListAsync(); | ||||||
|  |  | ||||||
|         // Obtenemos TODOS los logos relevantes en una sola consulta |  | ||||||
|         var todosLosLogos = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking() |         var todosLosLogos = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking() | ||||||
|         .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) | ||||||
|         .ToListAsync(); |         .ToListAsync(); | ||||||
|  |  | ||||||
|         // --- 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 | ||||||
| @@ -155,7 +153,6 @@ public class ResultadosController : ControllerBase | |||||||
|             CategoriaNombre = estadosPorCategoria.ContainsKey(g.Key) ? estadosPorCategoria[g.Key].CategoriaElectoral.Nombre : "Desconocido", |             CategoriaNombre = estadosPorCategoria.ContainsKey(g.Key) ? estadosPorCategoria[g.Key].CategoriaElectoral.Nombre : "Desconocido", | ||||||
|             EstadoRecuento = estadosPorCategoria.GetValueOrDefault(g.Key), |             EstadoRecuento = estadosPorCategoria.GetValueOrDefault(g.Key), | ||||||
|             TotalVotosCategoria = g.Sum(r => r.CantidadVotos), |             TotalVotosCategoria = g.Sum(r => r.CantidadVotos), | ||||||
|             // Agrupamos por el ID de la agrupación, no por el objeto, para evitar duplicados |  | ||||||
|             ResultadosAgrupados = g.GroupBy(r => r.AgrupacionPoliticaId) |             ResultadosAgrupados = g.GroupBy(r => r.AgrupacionPoliticaId) | ||||||
|                                        .Select(partidoGroup => new |                                        .Select(partidoGroup => new | ||||||
|                                        { |                                        { | ||||||
| @@ -172,10 +169,7 @@ public class ResultadosController : ControllerBase | |||||||
|                 Resultados = g.ResultadosAgrupados |                 Resultados = g.ResultadosAgrupados | ||||||
|                           .Select(r => |                           .Select(r => | ||||||
|                           { |                           { | ||||||
|                               // --- USAMOS EL NUEVO MÉTODO HELPER --- |  | ||||||
|                               // Para el resumen provincial, el ámbito es siempre el de la provincia. |  | ||||||
|                               var logoUrl = GetLogoUrl(r.Agrupacion.Id, g.CategoriaId, provincia.Id, todosLosLogos); |                               var logoUrl = GetLogoUrl(r.Agrupacion.Id, g.CategoriaId, provincia.Id, todosLosLogos); | ||||||
|  |  | ||||||
|                               return new |                               return new | ||||||
|                               { |                               { | ||||||
|                                   Id = r.Agrupacion.Id, |                                   Id = r.Agrupacion.Id, | ||||||
| @@ -196,7 +190,6 @@ public class ResultadosController : ControllerBase | |||||||
|         return Ok(resultadosAgrupados); |         return Ok(resultadosAgrupados); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     [HttpGet("bancas-por-seccion/{seccionId}/{camara}")] |     [HttpGet("bancas-por-seccion/{seccionId}/{camara}")] | ||||||
|     public async Task<IActionResult> GetBancasPorSeccion([FromRoute] int eleccionId, string seccionId, string camara) |     public async Task<IActionResult> GetBancasPorSeccion([FromRoute] int eleccionId, string seccionId, string camara) | ||||||
|     { |     { | ||||||
| @@ -1011,52 +1004,47 @@ public class ResultadosController : ControllerBase | |||||||
|     [HttpGet("panel/{ambitoId?}")] |     [HttpGet("panel/{ambitoId?}")] | ||||||
|     public async Task<IActionResult> GetPanelElectoral(int eleccionId, string? ambitoId, [FromQuery] int categoriaId) |     public async Task<IActionResult> GetPanelElectoral(int eleccionId, string? ambitoId, [FromQuery] int categoriaId) | ||||||
|     { |     { | ||||||
|         // Caso 1: Sin ID -> Vista Nacional |  | ||||||
|         if (string.IsNullOrEmpty(ambitoId)) |         if (string.IsNullOrEmpty(ambitoId)) | ||||||
|         { |         { | ||||||
|             return await GetPanelNacional(eleccionId, categoriaId); |             return await GetPanelNacional(eleccionId, categoriaId); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Intenta interpretar el ambitoId como un ID numérico de municipio. |         bool esProvincia = await _dbContext.AmbitosGeograficos | ||||||
|  |             .AsNoTracking() | ||||||
|  |             .AnyAsync(a => a.NivelId == 10 && a.DistritoId == ambitoId); | ||||||
|  |  | ||||||
|  |         if (esProvincia) | ||||||
|  |         { | ||||||
|  |             return await GetPanelProvincial(eleccionId, ambitoId, categoriaId); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (int.TryParse(ambitoId, out int idNumerico)) |         if (int.TryParse(ambitoId, out int idNumerico)) | ||||||
|         { |         { | ||||||
|             // Consulta a la BD para verificar si existe un municipio (NivelId=30) con este ID. |  | ||||||
|             // Esta consulta es muy rápida y resuelve la ambigüedad. |  | ||||||
|             bool esMunicipio = await _dbContext.AmbitosGeograficos |             bool esMunicipio = await _dbContext.AmbitosGeograficos | ||||||
|  |                 .AsNoTracking() | ||||||
|                 .AnyAsync(a => a.Id == idNumerico && a.NivelId == 30); |                 .AnyAsync(a => a.Id == idNumerico && a.NivelId == 30); | ||||||
|  |  | ||||||
|             if (esMunicipio) |             if (esMunicipio) | ||||||
|             { |             { | ||||||
|                 // Si es un municipio válido, llama al método municipal. |  | ||||||
|                 return await GetPanelMunicipal(eleccionId, idNumerico, categoriaId); |                 return await GetPanelMunicipal(eleccionId, idNumerico, categoriaId); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         // Si no es un ID de municipio válido (o no es un número), |         return NotFound($"No se pudo encontrar un ámbito electoral válido para el ID '{ambitoId}'."); | ||||||
|         // se asume que es un distritoId provincial y se llama al método provincial. |  | ||||||
|         return await GetPanelProvincial(eleccionId, ambitoId, categoriaId); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private async Task<IActionResult> GetPanelMunicipal(int eleccionId, int ambitoId, int categoriaId) |     private async Task<IActionResult> GetPanelMunicipal(int eleccionId, int ambitoId, int categoriaId) | ||||||
|     { |     { | ||||||
|         // 1. Obtener la entidad del municipio y, a partir de ella, la de su provincia. |  | ||||||
|         var municipio = await _dbContext.AmbitosGeograficos.AsNoTracking() |         var municipio = await _dbContext.AmbitosGeograficos.AsNoTracking() | ||||||
|             .FirstOrDefaultAsync(a => a.Id == ambitoId && a.NivelId == 30); |             .FirstOrDefaultAsync(a => a.Id == ambitoId && a.NivelId == 30); | ||||||
|  |  | ||||||
|         if (municipio == null) return NotFound($"No se encontró el municipio con ID {ambitoId}."); |         if (municipio == null) return NotFound($"No se encontró el municipio con ID {ambitoId}."); | ||||||
|  |  | ||||||
|         var provincia = await _dbContext.AmbitosGeograficos.AsNoTracking() |         var provincia = await _dbContext.AmbitosGeograficos.AsNoTracking() | ||||||
|             .FirstOrDefaultAsync(a => a.DistritoId == municipio.DistritoId && a.NivelId == 10); |             .FirstOrDefaultAsync(a => a.DistritoId == municipio.DistritoId && a.NivelId == 10); | ||||||
|  |  | ||||||
|         // Si por alguna razón no encontramos la provincia, no podemos continuar. |  | ||||||
|         if (provincia == null) return NotFound($"No se pudo determinar la provincia para el municipio con ID {ambitoId}."); |         if (provincia == null) return NotFound($"No se pudo determinar la provincia para el municipio con ID {ambitoId}."); | ||||||
|  |  | ||||||
|         // 2. Cargar todos los overrides de candidatos y logos relevantes (igual que en la vista provincial). |         var todosLosOverrides = await _dbContext.CandidatosOverrides.AsNoTracking().Where(c => c.EleccionId == eleccionId || c.EleccionId == 0).ToListAsync(); | ||||||
|         var todosLosOverrides = await _dbContext.CandidatosOverrides.AsNoTracking() |         var todosLosLogos = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking().Where(l => l.EleccionId == eleccionId || l.EleccionId == 0).ToListAsync(); | ||||||
|             .Where(c => c.EleccionId == eleccionId || c.EleccionId == 0).ToListAsync(); |  | ||||||
|         var todosLosLogos = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking() |  | ||||||
|             .Where(l => l.EleccionId == eleccionId || l.EleccionId == 0).ToListAsync(); |  | ||||||
|  |  | ||||||
|         // 3. Obtener los votos solo para ESE municipio (esto no cambia). |  | ||||||
|         var resultadosCrudos = await _dbContext.ResultadosVotos.AsNoTracking() |         var resultadosCrudos = await _dbContext.ResultadosVotos.AsNoTracking() | ||||||
|             .Include(r => r.AgrupacionPolitica) |             .Include(r => r.AgrupacionPolitica) | ||||||
|             .Where(r => r.EleccionId == eleccionId && |             .Where(r => r.EleccionId == eleccionId && | ||||||
| @@ -1064,26 +1052,17 @@ public class ResultadosController : ControllerBase | |||||||
|                         r.AmbitoGeograficoId == ambitoId) |                         r.AmbitoGeograficoId == ambitoId) | ||||||
|             .ToListAsync(); |             .ToListAsync(); | ||||||
|  |  | ||||||
|         // El resto de la lógica es muy similar, pero ahora usamos los helpers con el ID de la provincia. |  | ||||||
|         if (!resultadosCrudos.Any()) |         if (!resultadosCrudos.Any()) | ||||||
|         { |         { | ||||||
|             return Ok(new PanelElectoralDto |             return Ok(new PanelElectoralDto { AmbitoNombre = municipio.Nombre, MapaData = new List<ResultadoMapaDto>(), ResultadosPanel = new List<AgrupacionResultadoDto>(), EstadoRecuento = new EstadoRecuentoDto() }); | ||||||
|             { |  | ||||||
|                 AmbitoNombre = municipio.Nombre, |  | ||||||
|                 MapaData = new List<ResultadoMapaDto>(), |  | ||||||
|                 ResultadosPanel = new List<AgrupacionResultadoDto>(), |  | ||||||
|                 EstadoRecuento = new EstadoRecuentoDto() |  | ||||||
|             }); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         var totalVotosMunicipio = (decimal)resultadosCrudos.Sum(r => r.CantidadVotos); |         var totalVotosMunicipio = (decimal)resultadosCrudos.Sum(r => r.CantidadVotos); | ||||||
|         var resultadosPanel = resultadosCrudos |         var resultadosPanel = resultadosCrudos | ||||||
|             .Select(g => |             .Select(g => | ||||||
|             { |             { | ||||||
|                 // 4. ¡LA CLAVE! Usamos el ID de la PROVINCIA para buscar el override. |  | ||||||
|                 var candidatoMatch = FindBestCandidatoMatch(todosLosOverrides, g.AgrupacionPolitica.Id, categoriaId, provincia.Id, eleccionId); |                 var candidatoMatch = FindBestCandidatoMatch(todosLosOverrides, g.AgrupacionPolitica.Id, categoriaId, provincia.Id, eleccionId); | ||||||
|                 var logoMatch = FindBestLogoMatch(todosLosLogos, g.AgrupacionPolitica.Id, categoriaId, provincia.Id, eleccionId); |                 var logoMatch = FindBestLogoMatch(todosLosLogos, g.AgrupacionPolitica.Id, categoriaId, provincia.Id, eleccionId); | ||||||
|  |  | ||||||
|                 return new AgrupacionResultadoDto |                 return new AgrupacionResultadoDto | ||||||
|                 { |                 { | ||||||
|                     Id = g.AgrupacionPolitica.Id, |                     Id = g.AgrupacionPolitica.Id, | ||||||
| @@ -1092,7 +1071,6 @@ public class ResultadosController : ControllerBase | |||||||
|                     Color = g.AgrupacionPolitica.Color, |                     Color = g.AgrupacionPolitica.Color, | ||||||
|                     Votos = g.CantidadVotos, |                     Votos = g.CantidadVotos, | ||||||
|                     Porcentaje = totalVotosMunicipio > 0 ? (g.CantidadVotos / totalVotosMunicipio) * 100 : 0, |                     Porcentaje = totalVotosMunicipio > 0 ? (g.CantidadVotos / totalVotosMunicipio) * 100 : 0, | ||||||
|                     // Asignamos los datos del override encontrado |  | ||||||
|                     NombreCandidato = candidatoMatch?.NombreCandidato, |                     NombreCandidato = candidatoMatch?.NombreCandidato, | ||||||
|                     LogoUrl = logoMatch?.LogoUrl |                     LogoUrl = logoMatch?.LogoUrl | ||||||
|                 }; |                 }; | ||||||
| @@ -1119,44 +1097,50 @@ public class ResultadosController : ControllerBase | |||||||
|         return Ok(respuesta); |         return Ok(respuesta); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Este método se ejecutará cuando la URL sea, por ejemplo, /api/elecciones/2/panel/02?categoriaId=2 |  | ||||||
|     private async Task<IActionResult> GetPanelProvincial(int eleccionId, string distritoId, int categoriaId) |     private async Task<IActionResult> GetPanelProvincial(int eleccionId, string distritoId, int categoriaId) | ||||||
|     { |     { | ||||||
|         var provincia = await _dbContext.AmbitosGeograficos.AsNoTracking() |         var provincia = await _dbContext.AmbitosGeograficos.AsNoTracking() | ||||||
|             .FirstOrDefaultAsync(a => a.DistritoId == distritoId && a.NivelId == 10); |             .FirstOrDefaultAsync(a => a.DistritoId == distritoId && a.NivelId == 10); | ||||||
|         if (provincia == null) return NotFound($"No se encontró la provincia con DistritoId {distritoId}."); |         if (provincia == null) return NotFound($"No se encontró la provincia con DistritoId {distritoId}."); | ||||||
|  |  | ||||||
|         // --- INICIO DE LA MODIFICACIÓN --- |  | ||||||
|         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(); | ||||||
|         // --- FIN DE LA MODIFICACIÓN --- |  | ||||||
|  |  | ||||||
|         // ... (la lógica de agregación de votos no cambia) |         var votosAgregados = await _dbContext.ResultadosVotos | ||||||
|         var resultadosAgregados = await _dbContext.ResultadosVotos.AsNoTracking() |             .AsNoTracking() | ||||||
|             .Where(r => r.EleccionId == eleccionId && r.CategoriaId == categoriaId && r.AmbitoGeografico.DistritoId == distritoId && r.AmbitoGeografico.NivelId == 30) |             .Where(r => r.EleccionId == eleccionId | ||||||
|             .GroupBy(r => r.AgrupacionPolitica) |                         && r.CategoriaId == categoriaId | ||||||
|             .Select(g => new { Agrupacion = g.Key, TotalVotos = g.Sum(r => r.CantidadVotos) }) |                         && r.AmbitoGeografico.DistritoId == distritoId | ||||||
|  |                         && r.AmbitoGeografico.NivelId == 30) | ||||||
|  |             .GroupBy(r => new { r.AgrupacionPoliticaId, r.AgrupacionPolitica.Nombre, r.AgrupacionPolitica.NombreCorto, r.AgrupacionPolitica.Color }) | ||||||
|  |             .Select(g => new | ||||||
|  |             { | ||||||
|  |                 AgrupacionId = g.Key.AgrupacionPoliticaId, | ||||||
|  |                 Nombre = g.Key.Nombre, | ||||||
|  |                 NombreCorto = g.Key.NombreCorto, | ||||||
|  |                 Color = g.Key.Color, | ||||||
|  |                 TotalVotos = g.Sum(r => r.CantidadVotos) | ||||||
|  |             }) | ||||||
|             .ToListAsync(); |             .ToListAsync(); | ||||||
|  |  | ||||||
|         var totalVotosProvincia = (decimal)resultadosAgregados.Sum(r => r.TotalVotos); |         var totalVotosProvincia = (decimal)votosAgregados.Sum(r => r.TotalVotos); | ||||||
|  |  | ||||||
|         var resultadosPanel = resultadosAgregados |         var resultadosPanel = votosAgregados | ||||||
|             .Select(g => |             .Select(g => | ||||||
|             { |             { | ||||||
|                 // Aplicamos la misma lógica de búsqueda de overrides |                 var candidatoMatch = FindBestCandidatoMatch(todosLosOverrides, g.AgrupacionId, categoriaId, provincia.Id, eleccionId); | ||||||
|                 var candidatoMatch = FindBestCandidatoMatch(todosLosOverrides, g.Agrupacion.Id, categoriaId, provincia.Id, eleccionId); |                 var logoMatch = FindBestLogoMatch(todosLosLogos, g.AgrupacionId, categoriaId, provincia.Id, eleccionId); | ||||||
|                 var logoMatch = FindBestLogoMatch(todosLosLogos, g.Agrupacion.Id, categoriaId, provincia.Id, eleccionId); |  | ||||||
|  |  | ||||||
|                 return new AgrupacionResultadoDto |                 return new AgrupacionResultadoDto | ||||||
|                 { |                 { | ||||||
|                     Id = g.Agrupacion.Id, |                     Id = g.AgrupacionId, | ||||||
|                     Nombre = g.Agrupacion.Nombre, |                     Nombre = g.Nombre, | ||||||
|                     NombreCorto = g.Agrupacion.NombreCorto, |                     NombreCorto = g.NombreCorto, | ||||||
|                     Color = g.Agrupacion.Color, |                     Color = g.Color, | ||||||
|                     Votos = g.TotalVotos, |                     Votos = g.TotalVotos, | ||||||
|                     Porcentaje = totalVotosProvincia > 0 ? (g.TotalVotos / totalVotosProvincia) * 100 : 0, |                     Porcentaje = totalVotosProvincia > 0 ? (g.TotalVotos / totalVotosProvincia) * 100 : 0, | ||||||
|                     NombreCandidato = candidatoMatch?.NombreCandidato, // <-- DATO AÑADIDO |                     NombreCandidato = candidatoMatch?.NombreCandidato, | ||||||
|                     LogoUrl = logoMatch?.LogoUrl // <-- DATO AÑADIDO |                     LogoUrl = logoMatch?.LogoUrl | ||||||
|                 }; |                 }; | ||||||
|             }) |             }) | ||||||
|             .OrderByDescending(r => r.Votos) |             .OrderByDescending(r => r.Votos) | ||||||
| @@ -1168,7 +1152,7 @@ public class ResultadosController : ControllerBase | |||||||
|         var respuesta = new PanelElectoralDto |         var respuesta = new PanelElectoralDto | ||||||
|         { |         { | ||||||
|             AmbitoNombre = provincia.Nombre, |             AmbitoNombre = provincia.Nombre, | ||||||
|             MapaData = new List<ResultadoMapaDto>(), // Se carga por separado |             MapaData = new List<ResultadoMapaDto>(), | ||||||
|             ResultadosPanel = resultadosPanel, |             ResultadosPanel = resultadosPanel, | ||||||
|             EstadoRecuento = new EstadoRecuentoDto |             EstadoRecuento = new EstadoRecuentoDto | ||||||
|             { |             { | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ using System.Reflection; | |||||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Api")] | [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Api")] | ||||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+99d56033b1a6c61db0f436c43e0d58d9a544cf53")] | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4cefb833d9fbf4d6fb71559bef4eefcea7222e86")] | ||||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Api")] | [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Api")] | ||||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Api")] | [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Api")] | ||||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | [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=","Of8nTYw5l\u002BgiAJo7z6XYIntG2tUtCFcILzHbTiiXn\u002Bw=","PDy\u002BTiayvNAoXXBEgwC/kCojpgOOMI6RQOIoSXs3LJc=","ePXrkee3hv3wHUr8S7aYmRVvXUTxQf76zApKGv3/l3o=","DXx5dQywLo3UsY2zQaUG\u002BbW4ObiYbybxPBWxeJD2bhk=","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=","QcSegZUKmWiZEM0Lb/6DeWnkj3Sf005BA6CwcKCfcn8=","BY4GeeFiQbYpWuSzb2XIY4JatmLNOZ6dhKs4ZT92nsM=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","fuuUBrp2adKb2JTGKx6DlNAi3cvFULSlaTZ159rWB7w="],"CachedAssets":{},"CachedCopyCandidates":{}} | {"GlobalPropertiesHash":"b5T/+ta4fUd8qpIzUTm3KyEwAYYUsU5ASo+CSFM3ByE=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["YB39loxHH43S4MF8aTOiogcIbBAIq5Qj3dlJkIfYVxI=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","PDy\u002BTiayvNAoXXBEgwC/kCojpgOOMI6RQOIoSXs3LJc=","ePXrkee3hv3wHUr8S7aYmRVvXUTxQf76zApKGv3/l3o=","DXx5dQywLo3UsY2zQaUG\u002BbW4ObiYbybxPBWxeJD2bhk=","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=","g/ml0bg3ScnSqw84EVi2DZNU8NSjt4OY/A5cmmU2l3E=","BY4GeeFiQbYpWuSzb2XIY4JatmLNOZ6dhKs4ZT92nsM=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","HXLaMFGPnNaMINcNCkJL5ARtLenvbHnfhtgZAZYkfU4="],"CachedAssets":{},"CachedCopyCandidates":{}} | ||||||
| @@ -1 +1 @@ | |||||||
| {"GlobalPropertiesHash":"tJTBjV/i0Ihkc6XuOu69wxL8PBac9c9Kak6srMso4pU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["YB39loxHH43S4MF8aTOiogcIbBAIq5Qj3dlJkIfYVxI=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","Of8nTYw5l\u002BgiAJo7z6XYIntG2tUtCFcILzHbTiiXn\u002Bw=","PDy\u002BTiayvNAoXXBEgwC/kCojpgOOMI6RQOIoSXs3LJc=","ePXrkee3hv3wHUr8S7aYmRVvXUTxQf76zApKGv3/l3o=","DXx5dQywLo3UsY2zQaUG\u002BbW4ObiYbybxPBWxeJD2bhk=","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=","QcSegZUKmWiZEM0Lb/6DeWnkj3Sf005BA6CwcKCfcn8=","BY4GeeFiQbYpWuSzb2XIY4JatmLNOZ6dhKs4ZT92nsM=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","fuuUBrp2adKb2JTGKx6DlNAi3cvFULSlaTZ159rWB7w="],"CachedAssets":{},"CachedCopyCandidates":{}} | {"GlobalPropertiesHash":"tJTBjV/i0Ihkc6XuOu69wxL8PBac9c9Kak6srMso4pU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["YB39loxHH43S4MF8aTOiogcIbBAIq5Qj3dlJkIfYVxI=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","PDy\u002BTiayvNAoXXBEgwC/kCojpgOOMI6RQOIoSXs3LJc=","ePXrkee3hv3wHUr8S7aYmRVvXUTxQf76zApKGv3/l3o=","DXx5dQywLo3UsY2zQaUG\u002BbW4ObiYbybxPBWxeJD2bhk=","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=","g/ml0bg3ScnSqw84EVi2DZNU8NSjt4OY/A5cmmU2l3E=","BY4GeeFiQbYpWuSzb2XIY4JatmLNOZ6dhKs4ZT92nsM=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","HXLaMFGPnNaMINcNCkJL5ARtLenvbHnfhtgZAZYkfU4="],"CachedAssets":{},"CachedCopyCandidates":{}} | ||||||
| @@ -13,7 +13,7 @@ using System.Reflection; | |||||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Core")] | [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Core")] | ||||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+99d56033b1a6c61db0f436c43e0d58d9a544cf53")] | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4cefb833d9fbf4d6fb71559bef4eefcea7222e86")] | ||||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Core")] | [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Core")] | ||||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Core")] | [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Core")] | ||||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ using System.Reflection; | |||||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Database")] | [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Database")] | ||||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+99d56033b1a6c61db0f436c43e0d58d9a544cf53")] | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4cefb833d9fbf4d6fb71559bef4eefcea7222e86")] | ||||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Database")] | [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Database")] | ||||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Database")] | [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Database")] | ||||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ using System.Reflection; | |||||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Infrastructure")] | [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Infrastructure")] | ||||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+99d56033b1a6c61db0f436c43e0d58d9a544cf53")] | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4cefb833d9fbf4d6fb71559bef4eefcea7222e86")] | ||||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Infrastructure")] | [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Infrastructure")] | ||||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Infrastructure")] | [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Infrastructure")] | ||||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user