< Summary

Information
Class: FAU.API.Controllers.NovedadesPeriodoController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/NovedadesPeriodoController.cs
Line coverage
23%
Covered lines: 22
Uncovered lines: 71
Coverable lines: 93
Total lines: 216
Line coverage: 23.6%
Branch coverage
17%
Covered branches: 10
Total branches: 58
Branch coverage: 17.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetNovedades()100%210%
GetNovedad()0%2040%
CreateNovedad()25%481650%
UpdateNovedad()0%210140%
DeleteNovedad()0%7280%
ConfirmarNovedad()12.5%22840%
AplicarNovedad()62.5%16850%

File(s)

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

#LineLine coverage
 1using FAU.Entidades;
 2using FAU.Logica.DTOs;
 3using FAU.Logica.Services;
 4using Microsoft.AspNetCore.Authorization;
 5using Microsoft.AspNetCore.Mvc;
 6
 7namespace FAU.API.Controllers;
 8
 9[ApiController]
 10[Route("api/novedades-periodo")]
 11[Authorize(Roles = "Administrador,Operador")]
 12public class NovedadesPeriodoController : ControllerBase
 13{
 14    private readonly INovedadPeriodoService _novedadPeriodoService;
 15    private readonly ILogger<NovedadesPeriodoController> _logger;
 16
 417    public NovedadesPeriodoController(
 418        INovedadPeriodoService novedadPeriodoService,
 419        ILogger<NovedadesPeriodoController> logger)
 20    {
 421        _novedadPeriodoService = novedadPeriodoService;
 422        _logger = logger;
 423    }
 24
 25    [HttpGet]
 26    public async Task<IActionResult> GetNovedades(
 27        [FromQuery] int page = 1,
 28        [FromQuery] int pageSize = 10,
 29        [FromQuery] long? periodoId = null,
 30        [FromQuery] long? personaId = null,
 31        [FromQuery] string? tipo = null,
 32        [FromQuery] string? estado = null)
 33    {
 34        try
 35        {
 036            var resultado = await _novedadPeriodoService.GetPaginatedAsync(page, pageSize, periodoId, personaId, tipo, e
 37
 038            return Ok(ApiResponse<PagedResult<NovedadPeriodoDto>>.SuccessResult(resultado));
 39        }
 040        catch (Exception ex)
 41        {
 042            _logger.LogError(ex, "Error al obtener novedades de período");
 043            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 44        }
 045    }
 46
 47    [HttpGet("{id}")]
 48    public async Task<IActionResult> GetNovedad(long id)
 49    {
 50        try
 51        {
 052            var novedad = await _novedadPeriodoService.GetByIdAsync(id);
 053            if (novedad == null)
 54            {
 055                return NotFound(ApiResponse<string>.ErrorResult("Novedad de período no encontrada"));
 56            }
 57
 058            var response = new NovedadPeriodoDto
 059            {
 060                Id = novedad.Id,
 061                PeriodoId = novedad.PeriodoId,
 062                PersonaId = novedad.PersonaId,
 063                Tipo = novedad.Tipo,
 064                DiasAfectados = novedad.DiasAfectados,
 065                PorcentajeSubsidio = novedad.PorcentajeSubsidio,
 066                FechaDesde = novedad.FechaDesde ?? DateTime.MinValue,
 067                Observaciones = novedad.Observaciones,
 068                Estado = novedad.Estado,
 069                CreadoPor = novedad.CreadoPor,
 070                CreadoEn = novedad.CreadoEn,
 071                ConfirmadoPor = novedad.ConfirmadoPor,
 072                ConfirmadoEn = novedad.ConfirmadoEn
 073            };
 74
 075            return Ok(ApiResponse<NovedadPeriodoDto>.SuccessResult(response));
 76        }
 077        catch (Exception ex)
 78        {
 079            _logger.LogError(ex, "Error al obtener novedad de período {Id}", id);
 080            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 81        }
 082    }
 83
 84    [HttpPost]
 85    public async Task<IActionResult> CreateNovedad([FromBody] CrearNovedadPeriodoRequest request)
 86    {
 87        try
 88        {
 289            var (success, novedad, error) = await _novedadPeriodoService.CreateAsync(request);
 290            if (!success)
 91            {
 192                if (error?.Contains("ya existe", StringComparison.OrdinalIgnoreCase) == true)
 93                {
 194                    return Conflict(ApiResponse<string>.ErrorResult(error));
 95                }
 096                if (error?.Contains("no encontrado", StringComparison.OrdinalIgnoreCase) == true ||
 097                    error?.Contains("no existe", StringComparison.OrdinalIgnoreCase) == true)
 98                {
 099                    return NotFound(ApiResponse<string>.ErrorResult(error));
 100                }
 101
 0102                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al crear la novedad de período"));
 103            }
 104
 1105            var response = new { id = novedad!.Id, creado = true };
 1106            return CreatedAtAction(nameof(GetNovedad), new { id = novedad.Id }, ApiResponse<object>.SuccessResult(respon
 107        }
 0108        catch (Exception ex)
 109        {
 0110            _logger.LogError(ex, "Error al crear novedad de período");
 0111            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 112        }
 2113    }
 114
 115    [HttpPut("{id}")]
 116    public async Task<IActionResult> UpdateNovedad(long id, [FromBody] ActualizarNovedadPeriodoRequest request)
 117    {
 118        try
 119        {
 0120            var (success, novedad, error) = await _novedadPeriodoService.UpdateAsync(id, request);
 0121            if (!success)
 122            {
 0123                if (error?.Contains("no encontrada", StringComparison.OrdinalIgnoreCase) == true)
 124                {
 0125                    return NotFound(ApiResponse<string>.ErrorResult(error));
 126                }
 0127                if (error?.Contains("solo se pueden", StringComparison.OrdinalIgnoreCase) == true ||
 0128                    error?.Contains("debe proporcionar", StringComparison.OrdinalIgnoreCase) == true)
 129                {
 0130                    return BadRequest(ApiResponse<string>.ErrorResult(error));
 131                }
 132
 0133                return Conflict(ApiResponse<string>.ErrorResult(error));
 134            }
 135
 0136            return Ok(ApiResponse<object>.SuccessResult(new { actualizado = true }, "Novedad de período actualizada exit
 137        }
 0138        catch (Exception ex)
 139        {
 0140            _logger.LogError(ex, "Error al actualizar novedad de período {Id}", id);
 0141            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 142        }
 0143    }
 144
 145    [HttpDelete("{id}")]
 146    public async Task<IActionResult> DeleteNovedad(long id)
 147    {
 148        try
 149        {
 0150            var (success, novedad, error) = await _novedadPeriodoService.DeleteAsync(id);
 0151            if (!success)
 152            {
 0153                if (error?.Contains("no encontrada", StringComparison.OrdinalIgnoreCase) == true)
 154                {
 0155                    return NotFound(ApiResponse<string>.ErrorResult(error));
 156                }
 0157                return Conflict(ApiResponse<string>.ErrorResult(error ?? "No se pudo eliminar la novedad de período"));
 158            }
 159
 0160            return NoContent();
 161        }
 0162        catch (Exception ex)
 163        {
 0164            _logger.LogError(ex, "Error al eliminar novedad de período {Id}", id);
 0165            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 166        }
 0167    }
 168
 169    [HttpPost("{id}/confirmar")]
 170    public async Task<IActionResult> ConfirmarNovedad(long id)
 171    {
 172        try
 173        {
 1174            var (success, novedad, error) = await _novedadPeriodoService.ChangeStateToConfirmedAsync(id);
 1175            if (!success)
 176            {
 0177                if (error?.Contains("no encontrada", StringComparison.OrdinalIgnoreCase) == true)
 178                {
 0179                    return NotFound(ApiResponse<string>.ErrorResult(error));
 180                }
 0181                return Conflict(ApiResponse<string>.ErrorResult(error ?? "No se pudo confirmar la novedad de período"));
 182            }
 183
 1184            return Ok(ApiResponse<object>.SuccessResult(new { confirmado = true }, "Novedad de período confirmada exitos
 185        }
 0186        catch (Exception ex)
 187        {
 0188            _logger.LogError(ex, "Error al confirmar novedad de período {Id}", id);
 0189            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 190        }
 1191    }
 192
 193    [HttpPost("{id}/aplicar")]
 194    public async Task<IActionResult> AplicarNovedad(long id)
 195    {
 196        try
 197        {
 1198            var (success, novedad, error) = await _novedadPeriodoService.ChangeStateToAppliedAsync(id);
 1199            if (!success)
 200            {
 1201                if (error?.Contains("no encontrada", StringComparison.OrdinalIgnoreCase) == true)
 202                {
 0203                    return NotFound(ApiResponse<string>.ErrorResult(error));
 204                }
 1205                return Conflict(ApiResponse<string>.ErrorResult(error ?? "No se pudo aplicar la novedad de período"));
 206            }
 207
 0208            return Ok(ApiResponse<object>.SuccessResult(new { aplicada = true }, "Novedad de período aplicada exitosamen
 209        }
 0210        catch (Exception ex)
 211        {
 0212            _logger.LogError(ex, "Error al aplicar novedad de período {Id}", id);
 0213            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 214        }
 1215    }
 216}