129 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			129 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using GestionIntegral.Api.Dtos.Distribucion; | ||
|  |  using GestionIntegral.Api.Services.Distribucion; | ||
|  |  using Microsoft.AspNetCore.Authorization; | ||
|  |  using Microsoft.AspNetCore.Mvc; | ||
|  |  using Microsoft.Extensions.Logging; | ||
|  |  using System; | ||
|  |  using System.Collections.Generic; | ||
|  |  using System.Security.Claims; | ||
|  |  using System.Threading.Tasks; | ||
|  | 
 | ||
|  |  namespace GestionIntegral.Api.Controllers.Distribucion | ||
|  |  { | ||
|  |      [Route("api/canillas/{idCanilla}/paradas")] // Anidado bajo canillas | ||
|  |      [ApiController] | ||
|  |      [Authorize] | ||
|  |      public class CambiosParadaController : ControllerBase | ||
|  |      { | ||
|  |          private readonly ICambioParadaService _paradaService; | ||
|  |          private readonly ILogger<CambiosParadaController> _logger; | ||
|  |          private const string PermisoGestionarParadas = "CG007"; | ||
|  | 
 | ||
|  |          public CambiosParadaController(ICambioParadaService paradaService, ILogger<CambiosParadaController> logger) | ||
|  |          { | ||
|  |              _paradaService = paradaService; | ||
|  |              _logger = logger; | ||
|  |          } | ||
|  | 
 | ||
|  |          private bool TienePermiso(string codAcc) => User.IsInRole("SuperAdmin") || User.HasClaim(c => c.Type == "permission" && c.Value == codAcc); | ||
|  |          private int? GetCurrentUserId() | ||
|  |          { | ||
|  |              if (int.TryParse(User.FindFirstValue(ClaimTypes.NameIdentifier) ?? User.FindFirstValue("sub"), out int userId)) return userId; | ||
|  |              _logger.LogWarning("No se pudo obtener el UserId del token JWT en CambiosParadaController."); | ||
|  |              return null; | ||
|  |          } | ||
|  | 
 | ||
|  |          // GET: api/canillas/{idCanilla}/paradas | ||
|  |          [HttpGet] | ||
|  |          [ProducesResponseType(typeof(IEnumerable<CambioParadaDto>), StatusCodes.Status200OK)] | ||
|  |          [ProducesResponseType(StatusCodes.Status403Forbidden)] | ||
|  |          public async Task<IActionResult> GetParadasPorCanilla(int idCanilla) | ||
|  |          { | ||
|  |              // Podría usarse CG001 (Ver Canilla) o CG007 para ver el historial de paradas | ||
|  |              if (!TienePermiso("CG001") && !TienePermiso(PermisoGestionarParadas)) return Forbid(); | ||
|  |               | ||
|  |              var paradas = await _paradaService.ObtenerPorCanillaAsync(idCanilla); | ||
|  |              return Ok(paradas); | ||
|  |          } | ||
|  | 
 | ||
|  |          // POST: api/canillas/{idCanilla}/paradas | ||
|  |          [HttpPost] | ||
|  |          [ProducesResponseType(typeof(CambioParadaDto), StatusCodes.Status201Created)] | ||
|  |          [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||
|  |          [ProducesResponseType(StatusCodes.Status403Forbidden)] | ||
|  |          public async Task<IActionResult> CreateParada(int idCanilla, [FromBody] CreateCambioParadaDto createDto) | ||
|  |          { | ||
|  |              if (!TienePermiso(PermisoGestionarParadas)) return Forbid(); | ||
|  |              if (!ModelState.IsValid) return BadRequest(ModelState); | ||
|  |              var userId = GetCurrentUserId(); | ||
|  |              if (userId == null) return Unauthorized(); | ||
|  | 
 | ||
|  |              var (paradaDto, error) = await _paradaService.CrearNuevaParadaAsync(idCanilla, createDto, userId.Value); | ||
|  |              if (error != null) return BadRequest(new { message = error }); | ||
|  |              if (paradaDto == null) return StatusCode(StatusCodes.Status500InternalServerError, "Error al crear la parada."); | ||
|  | 
 | ||
|  |              // La ruta para "GetById" podría estar en otro controlador si decides separar los endpoints de "paradas individuales" | ||
|  |              // Por ahora, asumimos que habrá un endpoint para obtener una parada por su ID de registro. | ||
|  |              return CreatedAtAction(nameof(GetParadaById), new { idCanilla = idCanilla, idRegistroParada = paradaDto.IdRegistro }, paradaDto); | ||
|  |          } | ||
|  |           | ||
|  |          // GET: api/canillas/{idCanilla}/paradas/{idRegistroParada} (o api/paradas/{idRegistroParada}) | ||
|  |          // Este endpoint es opcional, pero útil si necesitas obtener una parada específica por su ID de registro | ||
|  |          [HttpGet("{idRegistroParada:int}", Name = "GetParadaById")] | ||
|  |          [ProducesResponseType(typeof(CambioParadaDto), StatusCodes.Status200OK)] | ||
|  |          [ProducesResponseType(StatusCodes.Status403Forbidden)] | ||
|  |          [ProducesResponseType(StatusCodes.Status404NotFound)] | ||
|  |          public async Task<IActionResult> GetParadaById(int idCanilla, int idRegistroParada) // idCanilla es parte de la ruta base | ||
|  |          { | ||
|  |               if (!TienePermiso("CG001") && !TienePermiso(PermisoGestionarParadas)) return Forbid(); | ||
|  |               var parada = await _paradaService.ObtenerPorIdAsync(idRegistroParada); | ||
|  |               if (parada == null || parada.IdCanilla != idCanilla) return NotFound(new { message = "Registro de parada no encontrado para este canillita."}); | ||
|  |               return Ok(parada); | ||
|  |          } | ||
|  | 
 | ||
|  | 
 | ||
|  |          // PUT: api/paradas/{idRegistroParada}/cerrar (Ruta ejemplo para cerrar una parada) | ||
|  |          // O podrías usar PUT api/canillas/{idCanilla}/paradas/{idRegistroParada} y que el DTO solo tenga VigenciaH | ||
|  |          [HttpPut("~/api/paradas/{idRegistroParada}/cerrar")] // Ruta a nivel raíz para paradas si se edita por IdRegistro | ||
|  |          [ProducesResponseType(StatusCodes.Status204NoContent)] | ||
|  |          [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||
|  |          [ProducesResponseType(StatusCodes.Status403Forbidden)] | ||
|  |          [ProducesResponseType(StatusCodes.Status404NotFound)] | ||
|  |          public async Task<IActionResult> CerrarVigenciaParada(int idRegistroParada, [FromBody] UpdateCambioParadaDto updateDto) | ||
|  |          { | ||
|  |              if (!TienePermiso(PermisoGestionarParadas)) return Forbid(); | ||
|  |              if (!ModelState.IsValid) return BadRequest(ModelState); | ||
|  |              var userId = GetCurrentUserId(); | ||
|  |              if (userId == null) return Unauthorized(); | ||
|  | 
 | ||
|  |              var (exito, error) = await _paradaService.CerrarParadaAsync(idRegistroParada, updateDto, userId.Value); | ||
|  |              if (!exito) | ||
|  |              { | ||
|  |                  if (error != null && error.Contains("no encontrado")) return NotFound(new { message = error }); | ||
|  |                  return BadRequest(new { message = error }); | ||
|  |              } | ||
|  |              return NoContent(); | ||
|  |          } | ||
|  |           | ||
|  |          // DELETE: api/paradas/{idRegistroParada} | ||
|  |          [HttpDelete("~/api/paradas/{idRegistroParada}")] | ||
|  |          [ProducesResponseType(StatusCodes.Status204NoContent)] | ||
|  |          [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||
|  |          [ProducesResponseType(StatusCodes.Status403Forbidden)] | ||
|  |          [ProducesResponseType(StatusCodes.Status404NotFound)] | ||
|  |          public async Task<IActionResult> DeleteParada(int idRegistroParada) | ||
|  |          { | ||
|  |               if (!TienePermiso(PermisoGestionarParadas)) return Forbid(); | ||
|  |               var userId = GetCurrentUserId(); | ||
|  |               if (userId == null) return Unauthorized(); | ||
|  | 
 | ||
|  |               var (exito, error) = await _paradaService.EliminarParadaAsync(idRegistroParada, userId.Value); | ||
|  |               if (!exito) | ||
|  |               { | ||
|  |                  if (error != null && error.Contains("no encontrado")) return NotFound(new { message = error }); | ||
|  |                  return BadRequest(new { message = error }); | ||
|  |               } | ||
|  |               return NoContent(); | ||
|  |          } | ||
|  |      } | ||
|  |  } |