< Summary

Information
Class: FAU.API.Controllers.TablaPermanenciaController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/TablaPermanenciaController.cs
Line coverage
77%
Covered lines: 53
Uncovered lines: 15
Coverable lines: 68
Total lines: 186
Line coverage: 77.9%
Branch coverage
91%
Covered branches: 22
Total branches: 24
Branch coverage: 91.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetTablaPermanencia()100%1150%
GetById()100%2286.36%
Create()87.5%9876.92%
Update()91.66%141275%
Delete()100%2266.66%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/TablaPermanenciaController.cs

#LineLine coverage
 1using FAU.Logica.DTOs;
 2using FAU.Logica.Services;
 3using Microsoft.AspNetCore.Authorization;
 4using Microsoft.AspNetCore.Http;
 5using Microsoft.AspNetCore.Mvc;
 6
 7namespace FAU.API.Controllers;
 8
 9[ApiController]
 10[Route("api/tabla-permanencia")]
 11[Authorize]
 12[Produces("application/json")]
 13public class TablaPermanenciaController : ControllerBase
 14{
 15    private readonly ITablaPermanenciaService _service;
 16    private readonly ILogger<TablaPermanenciaController> _logger;
 17
 1218    public TablaPermanenciaController(
 1219        ITablaPermanenciaService service,
 1220        ILogger<TablaPermanenciaController> logger)
 21    {
 1222        _service = service;
 1223        _logger = logger;
 1224    }
 25
 26    /// <summary>
 27    /// Listar rangos de permanencia (paginado, filtrable por escalafón y grado).
 28    /// GET /api/tabla-permanencia?page=1&amp;pageSize=10&amp;escalafonId=1&amp;gradoId=2
 29    /// </summary>
 30    [HttpGet]
 31    [ProducesResponseType(typeof(ApiResponse<PagedResult<TablaPermanenciaDto>>), StatusCodes.Status200OK)]
 32    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 33    public async Task<IActionResult> GetTablaPermanencia(
 34        [FromQuery] int page = 1,
 35        [FromQuery] int pageSize = 10,
 36        [FromQuery] long? escalafonId = null,
 37        [FromQuery] long? gradoId = null)
 38    {
 39        try
 40        {
 141            var result = await _service.GetPagedAsync(page, pageSize, escalafonId, gradoId);
 142            return Ok(ApiResponse<PagedResult<TablaPermanenciaDto>>.SuccessResult(result));
 43        }
 044        catch (Exception ex)
 45        {
 046            _logger.LogError(ex, "Error al obtener tabla de permanencia");
 047            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 48        }
 149    }
 50
 51    /// <summary>
 52    /// Obtener un rango de permanencia por ID.
 53    /// GET /api/tabla-permanencia/{id}
 54    /// </summary>
 55    [HttpGet("{id}")]
 56    [ProducesResponseType(typeof(ApiResponse<TablaPermanenciaDto>), StatusCodes.Status200OK)]
 57    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status404NotFound)]
 58    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 59    public async Task<IActionResult> GetById(long id)
 60    {
 61        try
 62        {
 263            var item = await _service.GetByIdAsync(id);
 264            if (item == null)
 165                return NotFound(ApiResponse<string>.ErrorResult("Rango de permanencia no encontrado"));
 66
 167            var dto = new TablaPermanenciaDto
 168            {
 169                Id = item.Id,
 170                EscalafonId = item.EscalafonId,
 171                GradoId = item.GradoId,
 172                MesesDesde = item.MesesDesde,
 173                MesesHasta = item.MesesHasta,
 174                MontoFijo = item.MontoFijo,
 175                Porcentaje = item.Porcentaje,
 176                AplicaRiesgoVuelo = item.AplicaRiesgoVuelo,
 177                VigenteDesde = item.VigenteDesde,
 178                VigenteHasta = item.VigenteHasta,
 179                Activo = item.Activo
 180            };
 181            return Ok(ApiResponse<TablaPermanenciaDto>.SuccessResult(dto));
 82        }
 083        catch (Exception ex)
 84        {
 085            _logger.LogError(ex, "Error al obtener tabla de permanencia {Id}", id);
 086            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 87        }
 288    }
 89
 90    /// <summary>
 91    /// Crear un nuevo rango de permanencia.
 92    /// POST /api/tabla-permanencia
 93    /// </summary>
 94    [HttpPost]
 95    [Authorize(Roles = "Administrador")]
 96    [ProducesResponseType(typeof(ApiResponse<TablaPermanenciaDto>), StatusCodes.Status201Created)]
 97    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 98    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status409Conflict)]
 99    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 100    public async Task<IActionResult> Create([FromBody] CrearTablaPermanenciaRequest request)
 101    {
 102        try
 103        {
 3104            var (exito, resultado, error) = await _service.CreateAsync(request);
 105
 3106            if (!exito)
 107            {
 2108                if (error?.Contains("solapado", StringComparison.OrdinalIgnoreCase) == true)
 1109                    return Conflict(ApiResponse<string>.ErrorResult(error));
 1110                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al crear rango de permanencia"));
 111            }
 112
 1113            return CreatedAtAction(
 1114                nameof(GetById),
 1115                new { id = resultado!.Id },
 1116                ApiResponse<TablaPermanenciaDto>.SuccessResult(null!, "Rango de permanencia creado exitosamente"));
 117        }
 0118        catch (Exception ex)
 119        {
 0120            _logger.LogError(ex, "Error al crear rango de permanencia");
 0121            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 122        }
 3123    }
 124
 125    /// <summary>
 126    /// Actualizar un rango de permanencia existente.
 127    /// PUT /api/tabla-permanencia/{id}
 128    /// </summary>
 129    [HttpPut("{id}")]
 130    [Authorize(Roles = "Administrador")]
 131    [ProducesResponseType(typeof(ApiResponse<TablaPermanenciaDto>), StatusCodes.Status200OK)]
 132    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 133    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status404NotFound)]
 134    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status409Conflict)]
 135    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 136    public async Task<IActionResult> Update(long id, [FromBody] ActualizarTablaPermanenciaRequest request)
 137    {
 138        try
 139        {
 4140            var (exito, resultado, error) = await _service.UpdateAsync(id, request);
 141
 4142            if (!exito)
 143            {
 3144                if (error?.Contains("no encontrado", StringComparison.OrdinalIgnoreCase) == true)
 1145                    return NotFound(ApiResponse<string>.ErrorResult(error));
 2146                if (error?.Contains("solapado", StringComparison.OrdinalIgnoreCase) == true)
 1147                    return Conflict(ApiResponse<string>.ErrorResult(error));
 1148                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al actualizar rango de permanencia"));
 149            }
 150
 1151            return Ok(ApiResponse<TablaPermanenciaDto>.SuccessResult(null!, "Rango de permanencia actualizado exitosamen
 152        }
 0153        catch (Exception ex)
 154        {
 0155            _logger.LogError(ex, "Error al actualizar rango de permanencia {Id}", id);
 0156            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 157        }
 4158    }
 159
 160    /// <summary>
 161    /// Eliminar (soft delete) un rango de permanencia.
 162    /// DELETE /api/tabla-permanencia/{id}
 163    /// </summary>
 164    [HttpDelete("{id}")]
 165    [Authorize(Roles = "Administrador")]
 166    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status200OK)]
 167    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status404NotFound)]
 168    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 169    public async Task<IActionResult> Delete(long id)
 170    {
 171        try
 172        {
 2173            var existe = await _service.GetByIdAsync(id);
 2174            if (existe == null)
 1175                return NotFound(ApiResponse<string>.ErrorResult("Rango de permanencia no encontrado"));
 176
 1177            await _service.DeleteAsync(id);
 1178            return Ok(ApiResponse<string>.SuccessResult("Rango de permanencia eliminado exitosamente"));
 179        }
 0180        catch (Exception ex)
 181        {
 0182            _logger.LogError(ex, "Error al eliminar rango de permanencia {Id}", id);
 0183            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 184        }
 2185    }
 186}