< Summary

Information
Class: FAU.API.Controllers.ProgramasController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/ProgramasController.cs
Line coverage
68%
Covered lines: 22
Uncovered lines: 10
Coverable lines: 32
Total lines: 111
Line coverage: 68.7%
Branch coverage
40%
Covered branches: 8
Total branches: 20
Branch coverage: 40%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ObtenerProgramas()100%11100%
CrearPrograma()50%12860%
ActualizarPrograma()33.33%301250%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/ProgramasController.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/[controller]")]
 11[Authorize]
 12[Produces("application/json")]
 13public class ProgramasController : ControllerBase
 14{
 15    private readonly IProgramaService _programaService;
 16    private readonly ILogger<ProgramasController> _logger;
 17
 718    public ProgramasController(IProgramaService programaService, ILogger<ProgramasController> logger)
 19    {
 720        _programaService = programaService;
 721        _logger = logger;
 722    }
 23
 24    /// <summary>
 25    /// Listar todos los programas vigentes
 26    /// GET /api/programas
 27    /// </summary>
 28    [HttpGet]
 29    [ProducesResponseType(typeof(ApiResponse<IEnumerable<ProgramaDto>>), StatusCodes.Status200OK)]
 30    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 31    public async Task<IActionResult> ObtenerProgramas()
 32    {
 33        try
 34        {
 335            var programas = await _programaService.ObtenerTodosAsync();
 236            return Ok(ApiResponse<IEnumerable<ProgramaDto>>.SuccessResult(programas));
 37        }
 138        catch (Exception ex)
 39        {
 140            _logger.LogError(ex, "Error al obtener programas");
 141            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 42        }
 343    }
 44
 45    /// <summary>
 46    /// Crear un nuevo programa
 47    /// POST /api/programas
 48    /// </summary>
 49    [HttpPost]
 50    [Authorize(Roles = "Administrador")]
 51    [ProducesResponseType(typeof(ApiResponse<ProgramaDto>), StatusCodes.Status201Created)]
 52    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 53    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status409Conflict)]
 54    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 55    public async Task<IActionResult> CrearPrograma([FromBody] CrearProgramaRequest request)
 56    {
 57        try
 58        {
 259            var (exito, resultado, error) = await _programaService.CrearAsync(request.Codigo, request.Denominacion, requ
 60
 261            if (!exito)
 62            {
 163                if (error?.Contains("ya existe", StringComparison.OrdinalIgnoreCase) == true)
 164                    return Conflict(ApiResponse<string>.ErrorResult(error));
 065                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al crear programa"));
 66            }
 67
 168            return CreatedAtAction(nameof(ObtenerProgramas), ApiResponse<ProgramaDto>.SuccessResult(resultado!, "Program
 69        }
 070        catch (Exception ex)
 71        {
 072            _logger.LogError(ex, "Error al crear programa");
 073            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 74        }
 275    }
 76
 77    /// <summary>
 78    /// Actualizar un programa existente
 79    /// PUT /api/programas/{id}
 80    /// </summary>
 81    [HttpPut("{id}")]
 82    [Authorize(Roles = "Administrador")]
 83    [ProducesResponseType(typeof(ApiResponse<ProgramaDto>), StatusCodes.Status200OK)]
 84    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status400BadRequest)]
 85    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status404NotFound)]
 86    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status409Conflict)]
 87    [ProducesResponseType(typeof(ApiResponse<string>), StatusCodes.Status500InternalServerError)]
 88    public async Task<IActionResult> ActualizarPrograma(long id, [FromBody] ActualizarProgramaRequest request)
 89    {
 90        try
 91        {
 292            var (exito, resultado, error) = await _programaService.ActualizarAsync(id, request.Codigo, request.Denominac
 93
 294            if (!exito)
 95            {
 196                if (error?.Contains("no encontrado", StringComparison.OrdinalIgnoreCase) == true)
 197                    return NotFound(ApiResponse<string>.ErrorResult(error));
 098                if (error?.Contains("ya existe", StringComparison.OrdinalIgnoreCase) == true)
 099                    return Conflict(ApiResponse<string>.ErrorResult(error));
 0100                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al actualizar programa"));
 101            }
 102
 1103            return Ok(ApiResponse<ProgramaDto>.SuccessResult(resultado!, "Programa actualizado exitosamente"));
 104        }
 0105        catch (Exception ex)
 106        {
 0107            _logger.LogError(ex, "Error al actualizar programa {Id}", id);
 0108            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 109        }
 2110    }
 111}