< Summary

Information
Class: FAU.API.Controllers.PersonalController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/PersonalController.cs
Line coverage
30%
Covered lines: 18
Uncovered lines: 41
Coverable lines: 59
Total lines: 187
Line coverage: 30.5%
Branch coverage
19%
Covered branches: 7
Total branches: 36
Branch coverage: 19.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetPersonal()0%4260%
GetPersonalDetalle()0%620%
CreatePersonal()0%156120%
UpdatePersonal()0%7280%
RegistrarBaja()87.5%88100%

File(s)

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

#LineLine coverage
 1using FAU.Logica.DTOs;
 2using FAU.Logica.Services;
 3using Microsoft.AspNetCore.Authorization;
 4using Microsoft.AspNetCore.Mvc;
 5
 6namespace FAU.API.Controllers;
 7
 8/// <summary>
 9/// Gestión de personal militar
 10/// </summary>
 11[ApiController]
 12[Route("api/[controller]")]
 13[Authorize]
 14public class PersonalController : ControllerBase
 15{
 16    private readonly IPersonalService _personalService;
 17    private readonly ILogger<PersonalController> _logger;
 18
 419    public PersonalController(
 420        IPersonalService personalService,
 421        ILogger<PersonalController> logger)
 22    {
 423        _personalService = personalService;
 424        _logger = logger;
 425    }
 26
 27    /// <summary>
 28    /// Listar personal con filtros y paginación
 29    /// GET /api/personal?buscar=&cargoId=&estado=&ley=&page=&pageSize=&orderBy=&sort=
 30    /// </summary>
 31    [HttpGet]
 32    public async Task<IActionResult> GetPersonal(
 33        [FromQuery] string? buscar = null,
 34        [FromQuery] long? cargoId = null,
 35        [FromQuery] string? estado = null,
 36        [FromQuery] string? ley = null,
 37        [FromQuery] int page = 1,
 38        [FromQuery] int pageSize = 25,
 39        [FromQuery] string? orderBy = null,
 40        [FromQuery] string sort = "asc")
 41    {
 42        try
 43        {
 44            // Validación de parámetros
 045            if (page < 1) page = 1;
 046            if (pageSize < 1) pageSize = 25;
 047            if (pageSize > 100) pageSize = 100;
 48
 049            var result = await _personalService.GetPersonalListAsync(
 050                buscar, cargoId, estado, ley, page, pageSize, orderBy, sort);
 51
 052            return Ok(ApiResponse<object>.SuccessResult(result));
 53        }
 054        catch (Exception ex)
 55        {
 056            _logger.LogError(ex, "Error al obtener listado de personal");
 057            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 58        }
 059    }
 60
 61    /// <summary>
 62    /// Obtener detalle completo de personal
 63    /// GET /api/personal/{id}
 64    /// Retorna: {id, datosPersonales, datosLaborales, historial}
 65    /// </summary>
 66    [HttpGet("{id}")]
 67    public async Task<IActionResult> GetPersonalDetalle(long id)
 68    {
 69        try
 70        {
 071            var detalle = await _personalService.GetDetalleAsync(id);
 72
 073            if (detalle == null)
 74            {
 075                return NotFound(ApiResponse<string>.ErrorResult("Personal no encontrado"));
 76            }
 77
 078            return Ok(ApiResponse<PersonalDetalleDto>.SuccessResult(detalle));
 79        }
 080        catch (Exception ex)
 81        {
 082            _logger.LogError(ex, "Error al obtener detalle de personal {Id}", id);
 083            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 84        }
 085    }
 86
 87    /// <summary>
 88    /// Alta de personal
 89    /// POST /api/personal
 90    /// Body: { ci, nombre, apellido, fechaNacimiento, email, telefono, direccion, cargoId, gradoId, ley, fechaIngreso }
 91    /// Response: { id, creado:true }
 92    /// </summary>
 93    [HttpPost]
 94    [Authorize(Roles = "Administrador,Operador")]
 95    public async Task<IActionResult> CreatePersonal([FromBody] CreatePersonalRequest request)
 96    {
 97        try
 98        {
 099            var (success, personalId, error) = await _personalService.CreatePersonalAsync(request);
 100
 0101            if (!success)
 102            {
 0103                if (error?.Contains("ya existe") == true || error?.Contains("única") == true)
 104                {
 0105                    return Conflict(ApiResponse<string>.ErrorResult(error));
 106                }
 0107                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al crear personal"));
 108            }
 109
 0110            return CreatedAtAction(
 0111                nameof(GetPersonalDetalle),
 0112                new { id = personalId },
 0113                ApiResponse<object>.SuccessResult(new { id = personalId, creado = true }));
 114        }
 0115        catch (Exception ex)
 116        {
 0117            _logger.LogError(ex, "Error al crear personal");
 0118            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 119        }
 0120    }
 121
 122    /// <summary>
 123    /// Modificar personal
 124    /// PUT /api/personal/{id}
 125    /// Body: { ...campos editables..., estado? }
 126    /// Response: { actualizado:true }
 127    /// </summary>
 128    [HttpPut("{id}")]
 129    [Authorize(Roles = "Administrador,Operador")]
 130    public async Task<IActionResult> UpdatePersonal(long id, [FromBody] UpdatePersonalRequest request)
 131    {
 132        try
 133        {
 0134            var (success, error) = await _personalService.UpdatePersonalAsync(id, request);
 135
 0136            if (!success)
 137            {
 0138                if (error?.Contains("no encontrado") == true)
 139                {
 0140                    return NotFound(ApiResponse<string>.ErrorResult(error));
 141                }
 0142                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al actualizar personal"));
 143            }
 144
 0145            return Ok(ApiResponse<object>.SuccessResult(new { actualizado = true }));
 146        }
 0147        catch (Exception ex)
 148        {
 0149            _logger.LogError(ex, "Error al actualizar personal {Id}", id);
 0150            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 151        }
 0152    }
 153
 154    /// <summary>
 155    /// Registrar baja de personal
 156    /// DELETE /api/personal/{id}/baja
 157    /// Body: { motivoId, fechaBaja, observaciones }
 158    /// Response: { id, estado:'Inactivo' }
 159    /// </summary>
 160    [HttpDelete("{id}/baja")]
 161    [Authorize(Roles = "Administrador,Operador")]
 162    public async Task<IActionResult> RegistrarBaja(long id, [FromBody] RegistrarBajaRequest request)
 163    {
 164        try
 165        {
 4166            var (success, error) = await _personalService.RegistrarBajaAsync(id, request);
 167
 3168            if (!success)
 169            {
 2170                if (error?.Contains("no encontrado") == true)
 171                {
 1172                    return NotFound(ApiResponse<string>.ErrorResult(error));
 173                }
 1174                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al registrar baja"));
 175            }
 176
 1177            return Ok(ApiResponse<object>.SuccessResult(
 1178                new { id = id, estado = "Inactivo" },
 1179                "Baja registrada exitosamente"));
 180        }
 1181        catch (Exception ex)
 182        {
 1183            _logger.LogError(ex, "Error al registrar baja de personal {Id}", id);
 1184            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 185        }
 4186    }
 187}