< Summary

Information
Class: FAU.Logica.Services.ProgramaService
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/ProgramaService.cs
Line coverage
81%
Covered lines: 45
Uncovered lines: 10
Coverable lines: 55
Total lines: 101
Line coverage: 81.8%
Branch coverage
88%
Covered branches: 16
Total branches: 18
Branch coverage: 88.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ObtenerTodosAsync()100%210%
CrearAsync()100%6690%
ActualizarAsync()83.33%131281.48%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/ProgramaService.cs

#LineLine coverage
 1using FAU.DataAccess.Repositories;
 2using FAU.Entidades;
 3using FAU.Logica.DTOs;
 4
 5namespace FAU.Logica.Services;
 6
 7public class ProgramaService : IProgramaService
 8{
 9    private readonly IProgramaRepository _programaRepository;
 10    private readonly IAuditoriaService _auditoriaService;
 11    private readonly ICurrentUserContext _currentUser;
 12
 713    public ProgramaService(IProgramaRepository programaRepository, IAuditoriaService auditoriaService, ICurrentUserConte
 14    {
 715        _programaRepository = programaRepository;
 716        _auditoriaService = auditoriaService;
 717        _currentUser = currentUser;
 718    }
 19
 20    public async Task<IEnumerable<ProgramaDto>> ObtenerTodosAsync()
 21    {
 022        var programas = await _programaRepository.ObtenerTodosAsync();
 023        return programas.Select(p => new ProgramaDto { Id = p.Id, Codigo = p.Codigo, Denominacion = p.Denominacion });
 024    }
 25
 26    public async Task<(bool Exito, ProgramaDto? Resultado, string? Error)> CrearAsync(string codigo, string denominacion
 27    {
 28        try
 29        {
 430            if (string.IsNullOrWhiteSpace(codigo))
 131                return (false, null, "El código es requerido");
 32
 333            if (string.IsNullOrWhiteSpace(denominacion))
 134                return (false, null, "La denominación es requerida");
 35
 236            if (await _programaRepository.ExisteCodigoAsync(codigo.Trim()))
 137                return (false, null, "Ya existe un programa con ese código");
 38
 139            var nuevo = new Programa { Codigo = codigo.Trim(), Denominacion = denominacion.Trim(), Vigente = vigente };
 140            var creado = await _programaRepository.CrearAsync(nuevo);
 41
 142            await _auditoriaService.LogAuditoriaAsync(
 143                usuarioId: _currentUser.UserId ?? 0,
 144                AccionEnum.CrearPersonal,
 145                ContextoEnum.Personal,
 146                host: _currentUser.Host,
 147                entidad: nameof(Programa),
 148                entidadId: creado.Id,
 149                detalle: new { operacion = "crear", id = creado.Id, codigo = creado.Codigo });
 50
 151            return (true, new ProgramaDto { Id = creado.Id, Codigo = creado.Codigo, Denominacion = creado.Denominacion }
 52        }
 053        catch (Exception ex)
 54        {
 055            return (false, null, $"Error al crear programa: {ex.Message}");
 56        }
 457    }
 58
 59    public async Task<(bool Exito, ProgramaDto? Resultado, string? Error)> ActualizarAsync(long id, string? codigo, stri
 60    {
 61        try
 62        {
 363            var programa = await _programaRepository.ObtenerPorIdAsync(id);
 364            if (programa == null)
 165                return (false, null, "Programa no encontrado");
 66
 267            var snapshotAntes = new { id = programa.Id, codigo = programa.Codigo };
 68
 269            if (!string.IsNullOrWhiteSpace(codigo))
 70            {
 171                var codigoNormalizado = codigo.Trim();
 172                if (!string.Equals(programa.Codigo, codigoNormalizado, StringComparison.Ordinal) && await _programaRepos
 173                    return (false, null, "Ya existe un programa con ese código");
 074                programa.Codigo = codigoNormalizado;
 075            }
 76
 177            if (!string.IsNullOrWhiteSpace(denominacion))
 178                programa.Denominacion = denominacion.Trim();
 79
 180            if (vigente.HasValue)
 081                programa.Vigente = vigente.Value;
 82
 183            var actualizado = await _programaRepository.ActualizarAsync(programa);
 84
 185            await _auditoriaService.LogAuditoriaAsync(
 186                usuarioId: _currentUser.UserId ?? 0,
 187                AccionEnum.ActualizarPersonal,
 188                ContextoEnum.Personal,
 189                host: _currentUser.Host,
 190                entidad: nameof(Programa),
 191                entidadId: actualizado.Id,
 192                detalle: new { operacion = "actualizar", antes = snapshotAntes, despues = new { id = actualizado.Id, cod
 93
 194            return (true, new ProgramaDto { Id = actualizado.Id, Codigo = actualizado.Codigo, Denominacion = actualizado
 95        }
 096        catch (Exception ex)
 97        {
 098            return (false, null, $"Error al actualizar programa: {ex.Message}");
 99        }
 3100    }
 101}