Test Docker
This commit is contained in:
		| @@ -113,4 +113,78 @@ public class ResultadosController : ControllerBase | ||||
|  | ||||
|         return Ok(await Task.FromResult(respuestaSimulada)); | ||||
|     } | ||||
|  | ||||
|     [HttpGet("bancas/{seccionId}")] | ||||
|     public async Task<IActionResult> GetBancasPorSeccion(string seccionId) | ||||
|     { | ||||
|         // 1. Buscamos el ámbito de la sección electoral | ||||
|         var seccion = await _dbContext.AmbitosGeograficos | ||||
|             .AsNoTracking() | ||||
|             .FirstOrDefaultAsync(a => a.SeccionId == seccionId && a.NivelId == 4); // Nivel 4 = Sección Electoral | ||||
|  | ||||
|         if (seccion == null) | ||||
|         { | ||||
|             return NotFound(new { message = $"No se encontró la sección electoral con ID {seccionId}" }); | ||||
|         } | ||||
|  | ||||
|         // 2. Buscamos todas las proyecciones para ese ámbito, incluyendo el nombre de la agrupación | ||||
|         var proyecciones = await _dbContext.ProyeccionesBancas | ||||
|             .AsNoTracking() | ||||
|             .Include(p => p.AgrupacionPolitica) // Incluimos el nombre del partido | ||||
|             .Where(p => p.AmbitoGeograficoId == seccion.Id) | ||||
|             .Select(p => new | ||||
|             { | ||||
|                 // Creamos un objeto anónimo para la respuesta, más limpio que un DTO para este caso simple | ||||
|                 AgrupacionNombre = p.AgrupacionPolitica.Nombre, | ||||
|                 Bancas = p.NroBancas | ||||
|             }) | ||||
|             .OrderByDescending(p => p.Bancas) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         if (!proyecciones.Any()) | ||||
|         { | ||||
|             return NotFound(new { message = $"No se han encontrado proyecciones de bancas para la sección {seccion.Nombre}" }); | ||||
|         } | ||||
|  | ||||
|         // 3. Devolvemos un objeto que contiene el nombre de la sección y la lista de resultados | ||||
|         return Ok(new | ||||
|         { | ||||
|             SeccionNombre = seccion.Nombre, | ||||
|             Proyeccion = proyecciones | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     [HttpGet("mapa")] | ||||
|     public async Task<IActionResult> GetResultadosParaMapa() | ||||
|     { | ||||
|         // Esta consulta es mucho más eficiente y se traduce bien a SQL. | ||||
|         // Paso 1: Para cada ámbito, encontrar la cantidad máxima de votos. | ||||
|         var maxVotosPorAmbito = _dbContext.ResultadosVotos | ||||
|             .GroupBy(rv => rv.AmbitoGeograficoId) | ||||
|             .Select(g => new | ||||
|             { | ||||
|                 AmbitoId = g.Key, | ||||
|                 MaxVotos = g.Max(v => v.CantidadVotos) | ||||
|             }); | ||||
|  | ||||
|         // Paso 2: Unir los resultados originales con los máximos para encontrar el registro ganador. | ||||
|         // Esto nos da, para cada ámbito, el registro completo del partido que tuvo más votos. | ||||
|         var resultadosGanadores = await _dbContext.ResultadosVotos | ||||
|             .Join( | ||||
|                 maxVotosPorAmbito, | ||||
|                 voto => new { AmbitoId = voto.AmbitoGeograficoId, Votos = voto.CantidadVotos }, | ||||
|                 max => new { AmbitoId = max.AmbitoId, Votos = max.MaxVotos }, | ||||
|                 (voto, max) => voto // Nos quedamos con el objeto 'ResultadoVoto' completo | ||||
|             ) | ||||
|             .Include(rv => rv.AmbitoGeografico) // Incluimos el ámbito para obtener el MunicipioId | ||||
|             .Where(rv => rv.AmbitoGeografico.MunicipioId != null) | ||||
|             .Select(rv => new | ||||
|             { | ||||
|                 MunicipioId = rv.AmbitoGeografico.MunicipioId, | ||||
|                 AgrupacionGanadoraId = rv.AgrupacionPoliticaId | ||||
|             }) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         return Ok(resultadosGanadores); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,62 @@ | ||||
| using Elecciones.Core.DTOs.ApiResponses; | ||||
| using Elecciones.Database; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace Elecciones.Api.Controllers; | ||||
|  | ||||
| [ApiController] | ||||
| [Route("api/[controller]")] | ||||
| public class TelegramasController : ControllerBase | ||||
| { | ||||
|   private readonly EleccionesDbContext _dbContext; | ||||
|  | ||||
|   public TelegramasController(EleccionesDbContext dbContext) | ||||
|   { | ||||
|     _dbContext = dbContext; | ||||
|   } | ||||
|  | ||||
|   /// <summary> | ||||
|   /// Obtiene la lista de IDs de todos los telegramas que han sido totalizados y descargados. | ||||
|   /// </summary> | ||||
|   [HttpGet] | ||||
|   public async Task<IActionResult> GetListaTelegramas() | ||||
|   { | ||||
|     var ids = await _dbContext.Telegramas | ||||
|         .AsNoTracking() | ||||
|         .OrderBy(t => t.Id) | ||||
|         .Select(t => t.Id) | ||||
|         .ToListAsync(); | ||||
|  | ||||
|     return Ok(ids); | ||||
|   } | ||||
|  | ||||
|   /// <summary> | ||||
|   /// Obtiene el contenido completo de un telegrama específico, incluyendo la imagen en Base64. | ||||
|   /// </summary> | ||||
|   /// <param name="mesaId">El ID único de la mesa/telegrama (ej. "0200100001M").</param> | ||||
|   [HttpGet("{mesaId}")] | ||||
|   public async Task<IActionResult> GetTelegramaPorId(string mesaId) | ||||
|   { | ||||
|     var telegrama = await _dbContext.Telegramas | ||||
|         .AsNoTracking() | ||||
|         .FirstOrDefaultAsync(t => t.Id == mesaId); | ||||
|  | ||||
|     if (telegrama == null) | ||||
|     { | ||||
|       return NotFound(new { message = $"No se encontró el telegrama con ID {mesaId}" }); | ||||
|     } | ||||
|  | ||||
|     // Devolvemos todos los datos del telegrama | ||||
|     return Ok(new | ||||
|     { | ||||
|       telegrama.Id, | ||||
|       telegrama.AmbitoGeograficoId, | ||||
|       telegrama.ContenidoBase64, | ||||
|       telegrama.FechaEscaneo, | ||||
|       telegrama.FechaTotalizacion | ||||
|     }); | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user