< 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
85%
Covered lines: 61
Uncovered lines: 10
Coverable lines: 71
Total lines: 118
Line coverage: 85.9%
Branch coverage
100%
Covered branches: 18
Total branches: 18
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%
ObtenerTodosAsync()100%11100%
CrearAsync()100%6692%
ActualizarAsync()100%121292.59%

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
 1013    public UnidadService(IUnidadRepository unidadRepository, IAuditoriaService auditoriaService, ICurrentUserContext cur
 14    {
 1015        _unidadRepository = unidadRepository;
 1016        _auditoriaService = auditoriaService;
 1017        _currentUser = currentUser;
 1018    }
 19
 20    public async Task<IEnumerable<UnidadDto>> ObtenerTodosAsync()
 21    {
 122        var unidades = await _unidadRepository.ObtenerTodosConSubUnidadesAsync();
 323        return unidades.Select(u => new UnidadDto
 324        {
 325            Id = u.Id,
 326            Codigo = u.Codigo,
 327            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()
 334        });
 135    }
 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        {
 580            var unidad = await _unidadRepository.ObtenerPorIdAsync(id);
 581            if (unidad == null)
 182                return (false, null, "Unidad no encontrada");
 83
 484            var snapshotAntes = new { id = unidad.Id, codigo = unidad.Codigo, denominacion = unidad.Denominacion, vigent
 85
 486            if (!string.IsNullOrWhiteSpace(codigo))
 87            {
 288                var codigoNormalizado = codigo.Trim();
 289                if (!string.Equals(unidad.Codigo, codigoNormalizado, StringComparison.Ordinal) && await _unidadRepositor
 190                    return (false, null, "Ya existe una unidad con ese código");
 191                unidad.Codigo = codigoNormalizado;
 192            }
 93
 394            if (!string.IsNullOrWhiteSpace(denominacion))
 295                unidad.Denominacion = denominacion.Trim();
 96
 397            if (vigente.HasValue)
 198                unidad.Vigente = vigente.Value;
 99
 3100            var actualizada = await _unidadRepository.ActualizarAsync(unidad);
 101
 3102            await _auditoriaService.LogAuditoriaAsync(
 3103                usuarioId: _currentUser.UserId ?? 0,
 3104                AccionEnum.ActualizarPersonal,
 3105                ContextoEnum.Personal,
 3106                host: _currentUser.Host,
 3107                entidad: nameof(Unidad),
 3108                entidadId: actualizada.Id,
 3109                detalle: new { operacion = "actualizar", antes = snapshotAntes, despues = new { id = actualizada.Id, cod
 110
 3111            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        }
 5117    }
 118}