< Summary

Information
Class: FAU.API.Controllers.BancosController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/BancosController.cs
Line coverage
90%
Covered lines: 83
Uncovered lines: 9
Coverable lines: 92
Total lines: 207
Line coverage: 90.2%
Branch coverage
75%
Covered branches: 24
Total branches: 32
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetBancos()100%11100%
GetBanco()100%22100%
CreateBanco()66.66%121296%
UpdateBanco()77.77%181895.83%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/BancosController.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 bancos del sistema
 10/// </summary>
 11[ApiController]
 12[Route("api/[controller]")]
 13[Authorize(Roles = "Administrador")]
 14public class BancosController : ControllerBase
 15{
 16    private readonly IBancoService _bancoService;
 17    private readonly ILogger<BancosController> _logger;
 18
 1919    public BancosController(
 1920        IBancoService bancoService,
 1921        ILogger<BancosController> logger)
 22    {
 1923        _bancoService = bancoService;
 1924        _logger = logger;
 1925    }
 26
 27    /// <summary>
 28    /// Listar bancos con paginación y filtros
 29    /// GET /api/bancos?page=1&pageSize=10&q=&vigente=
 30    /// </summary>
 31    /// <param name="page">Número de página (default: 1)</param>
 32    /// <param name="pageSize">Tamaño de página (default: 10, max: 100)</param>
 33    /// <param name="q">Búsqueda por nombre o código</param>
 34    /// <param name="vigente">Filtrar por estado vigente</param>
 35    [HttpGet]
 36    public async Task<IActionResult> GetBancos(
 37        [FromQuery] int page = 1,
 38        [FromQuery] int pageSize = 10,
 39        [FromQuery] string? q = null,
 40        [FromQuery] bool? vigente = null)
 41    {
 42        try
 43        {
 344            var resultado = await _bancoService.GetPagedAsync(page, pageSize, q, vigente);
 45
 246            var response = new
 247            {
 048                items = resultado.Items.Select(b => new
 049                {
 050                    id = b.Id,
 051                    nombre = b.Nombre,
 052                    codigo = b.Codigo,
 053                    vigente = b.Vigente
 054                }),
 255                page = resultado.Page,
 256                pageSize = resultado.PageSize,
 257                totalCount = resultado.TotalCount,
 258                totalPages = resultado.TotalPages,
 259                hasPreviousPage = resultado.HasPreviousPage,
 260                hasNextPage = resultado.HasNextPage
 261            };
 62
 263            return Ok(ApiResponse<object>.SuccessResult(response));
 64        }
 165        catch (Exception ex)
 66        {
 167            _logger.LogError(ex, "Error al obtener bancos");
 168            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 69        }
 370    }
 71
 72    /// <summary>
 73    /// Obtener detalle de un banco por ID
 74    /// GET /api/bancos/{id}
 75    /// </summary>
 76    [HttpGet("{id}")]
 77    public async Task<IActionResult> GetBanco(long id)
 78    {
 79        try
 80        {
 381            var banco = await _bancoService.GetByIdAsync(id);
 82
 283            if (banco == null)
 84            {
 185                return NotFound(ApiResponse<string>.ErrorResult("Banco no encontrado"));
 86            }
 87
 188            var response = new
 189            {
 190                id = banco.Id,
 191                nombre = banco.Nombre,
 192                codigo = banco.Codigo,
 193                vigente = banco.Vigente
 194            };
 95
 196            return Ok(ApiResponse<object>.SuccessResult(response));
 97        }
 198        catch (Exception ex)
 99        {
 1100            _logger.LogError(ex, "Error al obtener banco {Id}", id);
 1101            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 102        }
 3103    }
 104
 105    /// <summary>
 106    /// Crear un nuevo banco
 107    /// POST /api/bancos
 108    /// </summary>
 109    [HttpPost]
 110    public async Task<IActionResult> CreateBanco([FromBody] CreateBancoRequest request)
 111    {
 112        try
 113        {
 114            // Validaciones
 5115            if (string.IsNullOrWhiteSpace(request.Nombre))
 116            {
 1117                return BadRequest(ApiResponse<string>.ErrorResult("El nombre del banco es requerido"));
 118            }
 119
 4120            if (string.IsNullOrWhiteSpace(request.Codigo))
 121            {
 1122                return BadRequest(ApiResponse<string>.ErrorResult("El código del banco es requerido"));
 123            }
 124
 3125            var (success, banco, error) = await _bancoService.CreateAsync(
 3126                request.Nombre,
 3127                request.Codigo,
 3128                request.Vigente);
 129
 2130            if (!success)
 131            {
 1132                if (error?.Contains("ya existe", StringComparison.OrdinalIgnoreCase) == true)
 133                {
 1134                    return Conflict(ApiResponse<string>.ErrorResult(error));
 135                }
 0136                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al crear banco"));
 137            }
 138
 1139            var response = new
 1140            {
 1141                id = banco!.Id,
 1142                creado = true
 1143            };
 144
 1145            return CreatedAtAction(
 1146                nameof(GetBanco),
 1147                new { id = banco.Id },
 1148                ApiResponse<object>.SuccessResult(response, "Banco creado exitosamente"));
 149        }
 1150        catch (Exception ex)
 151        {
 1152            _logger.LogError(ex, "Error al crear banco");
 1153            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 154        }
 5155    }
 156
 157    /// <summary>
 158    /// Editar un banco existente (incluye activar/desactivar)
 159    /// PUT /api/bancos/{id}
 160    /// </summary>
 161    [HttpPut("{id}")]
 162    public async Task<IActionResult> UpdateBanco(long id, [FromBody] UpdateBancoRequest request)
 163    {
 164        try
 165        {
 166            // Validar que al menos un campo se está actualizando
 8167            if (string.IsNullOrWhiteSpace(request.Nombre) &&
 8168                string.IsNullOrWhiteSpace(request.Codigo) &&
 8169                !request.Vigente.HasValue)
 170            {
 1171                return BadRequest(ApiResponse<string>.ErrorResult("Debe proporcionar al menos un campo para actualizar")
 172            }
 173
 7174            var (success, banco, error) = await _bancoService.UpdateAsync(
 7175                id,
 7176                request.Nombre,
 7177                request.Codigo,
 7178                request.Vigente);
 179
 6180            if (!success)
 181            {
 2182                if (error?.Contains("no encontrado", StringComparison.OrdinalIgnoreCase) == true)
 183                {
 1184                    return NotFound(ApiResponse<string>.ErrorResult(error));
 185                }
 1186                if (error?.Contains("ya existe", StringComparison.OrdinalIgnoreCase) == true)
 187                {
 1188                    return Conflict(ApiResponse<string>.ErrorResult(error));
 189                }
 0190                return BadRequest(ApiResponse<string>.ErrorResult(error ?? "Error al actualizar banco"));
 191            }
 192
 4193            var response = new
 4194            {
 4195                actualizado = true
 4196            };
 197
 4198            return Ok(ApiResponse<object>.SuccessResult(response, "Banco actualizado exitosamente"));
 199        }
 1200        catch (Exception ex)
 201        {
 1202            _logger.LogError(ex, "Error al actualizar banco {Id}", id);
 1203            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 204        }
 8205    }
 206}
 207