< Summary

Information
Class: FAU.Logica.Services.UnidadService
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/UnidadService.cs
Line coverage
70%
Covered lines: 50
Uncovered lines: 21
Coverable lines: 71
Total lines: 118
Line coverage: 70.4%
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%6692%
ActualizarAsync()83.33%131281.48%

File(s)

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

#LineLine coverage
 1using FAU.DataAccess.Repositories;
 2using FAU.Entidades;
 3using FAU.Logica.DTOs;
 4
 5namespace FAU.Logica.Services;
 6
 7public class UnidadService : IUnidadService
 8{
 9    private readonly IUnidadRepository _unidadRepository;
 10    private readonly IAuditoriaService _auditoriaService;
 11    private readonly ICurrentUserContext _currentUser;
 12
 713    public UnidadService(IUnidadRepository unidadRepository, IAuditoriaService auditoriaService, ICurrentUserContext cur
 14    {
 715        _unidadRepository = unidadRepository;
 716        _auditoriaService = auditoriaService;
 717        _currentUser = currentUser;
 718    }
 19
 20    public async Task<IEnumerable<UnidadDto>> ObtenerTodosAsync()
 21    {
 022        var unidades = await _unidadRepository.ObtenerTodosConSubUnidadesAsync();
 023        return unidades.Select(u => new UnidadDto
 024        {
 025            Id = u.Id,
 026            Codigo = u.Codigo,
 027            Denominacion = u.Denominacion,
 028            SubUnidades = u.SubUnidades.Select(s => new SubUnidadDto
 029            {
 030                Id = s.Id,
 031                Codigo = s.Codigo,
 032                Denominacion = s.Denominacion
 033            }).ToList()
 034        });
 035    }
 36
 37    public async Task<(bool Exito, UnidadDto? Resultado, string? Error)> CrearAsync(string codigo, string denominacion, 
 38    {
 39        try
 40        {
 441            if (string.IsNullOrWhiteSpace(codigo))
 142                return (false, null, "El código es requerido");
 43
 344            if (string.IsNullOrWhiteSpace(denominacion))
 145                return (false, null, "La denominación es requerida");
 46
 247            if (await _unidadRepository.ExisteCodigoAsync(codigo.Trim()))
 148                return (false, null, "Ya existe una unidad con ese código");
 49
 150            var nuevaUnidad = new Unidad
 151            {
 152                Codigo = codigo.Trim(),
 153                Denominacion = denominacion.Trim(),
 154                Vigente = vigente
 155            };
 56
 157            var creada = await _unidadRepository.CrearAsync(nuevaUnidad);
 58
 159            await _auditoriaService.LogAuditoriaAsync(
 160                usuarioId: _currentUser.UserId ?? 0,
 161                AccionEnum.CrearPersonal,
 162                ContextoEnum.Personal,
 163                host: _currentUser.Host,
 164                entidad: nameof(Unidad),
 165                entidadId: creada.Id,
 166                detalle: new { operacion = "crear", id = creada.Id, codigo = creada.Codigo, denominacion = creada.Denomi
 67
 168            return (true, new UnidadDto { Id = creada.Id, Codigo = creada.Codigo, Denominacion = creada.Denominacion, Su
 69        }
 070        catch (Exception ex)
 71        {
 072            return (false, null, $"Error al crear unidad: {ex.Message}");
 73        }
 474    }
 75
 76    public async Task<(bool Exito, UnidadDto? Resultado, string? Error)> ActualizarAsync(long id, string? codigo, string
 77    {
 78        try
 79        {
 380            var unidad = await _unidadRepository.ObtenerPorIdAsync(id);
 381            if (unidad == null)
 182                return (false, null, "Unidad no encontrada");
 83
 284            var snapshotAntes = new { id = unidad.Id, codigo = unidad.Codigo, denominacion = unidad.Denominacion, vigent
 85
 286            if (!string.IsNullOrWhiteSpace(codigo))
 87            {
 188                var codigoNormalizado = codigo.Trim();
 189                if (!string.Equals(unidad.Codigo, codigoNormalizado, StringComparison.Ordinal) && await _unidadRepositor
 190                    return (false, null, "Ya existe una unidad con ese código");
 091                unidad.Codigo = codigoNormalizado;
 092            }
 93
 194            if (!string.IsNullOrWhiteSpace(denominacion))
 195                unidad.Denominacion = denominacion.Trim();
 96
 197            if (vigente.HasValue)
 098                unidad.Vigente = vigente.Value;
 99
 1100            var actualizada = await _unidadRepository.ActualizarAsync(unidad);
 101
 1102            await _auditoriaService.LogAuditoriaAsync(
 1103                usuarioId: _currentUser.UserId ?? 0,
 1104                AccionEnum.ActualizarPersonal,
 1105                ContextoEnum.Personal,
 1106                host: _currentUser.Host,
 1107                entidad: nameof(Unidad),
 1108                entidadId: actualizada.Id,
 1109                detalle: new { operacion = "actualizar", antes = snapshotAntes, despues = new { id = actualizada.Id, cod
 110
 1111            return (true, new UnidadDto { Id = actualizada.Id, Codigo = actualizada.Codigo, Denominacion = actualizada.D
 112        }
 0113        catch (Exception ex)
 114        {
 0115            return (false, null, $"Error al actualizar unidad: {ex.Message}");
 116        }
 3117    }
 118}