< Summary

Information
Class: FAU.API.Controllers.ArchivoOrganismoController
Assembly: FAU.API
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.API/Controllers/ArchivoOrganismoController.cs
Line coverage
84%
Covered lines: 49
Uncovered lines: 9
Coverable lines: 58
Total lines: 130
Line coverage: 84.4%
Branch coverage
100%
Covered branches: 12
Total branches: 12
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetBrouPreview()100%4475%
GetBrouCsv()100%4486.36%
GetSiifResumen()100%4475%

File(s)

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

#LineLine coverage
 1using FAU.API.Security;
 2using FAU.Entidades;
 3using FAU.Logica.DTOs;
 4using FAU.Logica.Services;
 5using Microsoft.AspNetCore.Authorization;
 6using Microsoft.AspNetCore.Mvc;
 7
 8namespace FAU.API.Controllers;
 9
 10[ApiController]
 11[Route("api/liquidacion/organismos")]
 12[Authorize]
 13public class ArchivoOrganismoController : ControllerBase
 14{
 15    private readonly IArchivoOrganismoService _service;
 16    private readonly IPeriodoService _periodoService;
 17    private readonly IAuditoriaService _auditoriaService;
 18    private readonly ICurrentUserContext _currentUser;
 19    private readonly ILogger<ArchivoOrganismoController> _logger;
 20
 921    public ArchivoOrganismoController(
 922        IArchivoOrganismoService service,
 923        IPeriodoService periodoService,
 924        IAuditoriaService auditoriaService,
 925        ICurrentUserContext currentUser,
 926        ILogger<ArchivoOrganismoController> logger)
 27    {
 928        _service          = service;
 929        _periodoService   = periodoService;
 930        _auditoriaService = auditoriaService;
 931        _currentUser      = currentUser;
 932        _logger           = logger;
 933    }
 34
 35    /// <summary>
 36    /// Vista previa del archivo BROU: filas con cuenta y excepciones sin cuenta.
 37    /// GET /api/liquidacion/organismos/{periodoId}/brou/preview
 38    /// </summary>
 39    [HttpGet("{periodoId}/brou/preview")]
 40    [RequirePermission(PermisoEnum.VerArchivosOrganismo)]
 41    public async Task<IActionResult> GetBrouPreview(long periodoId)
 42    {
 43        try
 44        {
 345            var periodo = await _periodoService.ObtenerPorIdAsync(periodoId);
 346            if (periodo == null)
 147                return NotFound(ApiResponse<string>.ErrorResult("Período no encontrado"));
 48
 249            if (periodo.Estado != Periodo.EstadoCerrada)
 150                return Conflict(ApiResponse<string>.ErrorResult(
 151                    "El período no está cerrado; los archivos para organismos solo están disponibles para períodos en es
 52
 153            var preview = await _service.ObtenerPreviewBrouAsync(periodoId);
 154            return Ok(ApiResponse<BrouPreviewDto>.SuccessResult(preview));
 55        }
 056        catch (Exception ex)
 57        {
 058            _logger.LogError(ex, "Error al obtener preview BROU del período {PeriodoId}", periodoId);
 059            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 60        }
 361    }
 62
 63    /// <summary>
 64    /// Descarga el archivo CSV BROU del período.
 65    /// GET /api/liquidacion/organismos/{periodoId}/brou
 66    /// </summary>
 67    [HttpGet("{periodoId}/brou")]
 68    [RequirePermission(PermisoEnum.VerArchivosOrganismo)]
 69    public async Task<IActionResult> GetBrouCsv(long periodoId)
 70    {
 71        try
 72        {
 373            var periodo = await _periodoService.ObtenerPorIdAsync(periodoId);
 374            if (periodo == null)
 175                return NotFound(ApiResponse<string>.ErrorResult("Período no encontrado"));
 76
 277            if (periodo.Estado != Periodo.EstadoCerrada)
 178                return Conflict(ApiResponse<string>.ErrorResult(
 179                    "El período no está cerrado; los archivos para organismos solo están disponibles para períodos en es
 80
 181            var csvBytes = await _service.GenerarCsvBrouAsync(periodoId);
 82
 183            await _auditoriaService.LogAuditoriaAsync(
 184                _currentUser.UserId ?? 0,
 185                AccionEnum.GenerarArchivoBrou,
 186                ContextoEnum.Liquidaciones,
 187                _currentUser.Host,
 188                entidad: "ArchivoBrou",
 189                entidadId: periodoId,
 190                detalle: new { periodoId });
 91
 192            var timestamp = DateTime.Now.ToString("yyyyMMddHHmm");
 193            var fileName = $"brou_{periodo.Anio}_{periodo.Mes:D2}_{timestamp}.csv";
 194            return File(csvBytes, "text/csv", fileName);
 95        }
 096        catch (Exception ex)
 97        {
 098            _logger.LogError(ex, "Error al generar CSV BROU del período {PeriodoId}", periodoId);
 099            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 100        }
 3101    }
 102
 103    /// <summary>
 104    /// Retorna el resumen SIIF agrupado por programa × régimen.
 105    /// GET /api/liquidacion/organismos/{periodoId}/siif
 106    /// </summary>
 107    [HttpGet("{periodoId}/siif")]
 108    [RequirePermission(PermisoEnum.VerArchivosOrganismo)]
 109    public async Task<IActionResult> GetSiifResumen(long periodoId)
 110    {
 111        try
 112        {
 3113            var periodo = await _periodoService.ObtenerPorIdAsync(periodoId);
 3114            if (periodo == null)
 1115                return NotFound(ApiResponse<string>.ErrorResult("Período no encontrado"));
 116
 2117            if (periodo.Estado != Periodo.EstadoCerrada)
 1118                return Conflict(ApiResponse<string>.ErrorResult(
 1119                    "El período no está cerrado; los archivos para organismos solo están disponibles para períodos en es
 120
 1121            var resumen = await _service.ObtenerResumenSiifAsync(periodoId);
 1122            return Ok(ApiResponse<SiifResumenDto>.SuccessResult(resumen));
 123        }
 0124        catch (Exception ex)
 125        {
 0126            _logger.LogError(ex, "Error al obtener resumen SIIF del período {PeriodoId}", periodoId);
 0127            return StatusCode(500, ApiResponse<string>.ErrorResult("Error interno del servidor"));
 128        }
 3129    }
 130}