< Summary

Information
Class: FAU.Logica.Services.TipoMovimientoService
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/TipoMovimientoService.cs
Line coverage
84%
Covered lines: 43
Uncovered lines: 8
Coverable lines: 51
Total lines: 95
Line coverage: 84.3%
Branch coverage
92%
Covered branches: 13
Total branches: 14
Branch coverage: 92.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%4488.88%
ActualizarAsync()90%101088%

File(s)

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

#LineLine coverage
 1using FAU.DataAccess.Repositories;
 2using FAU.Entidades;
 3using FAU.Logica.DTOs;
 4
 5namespace FAU.Logica.Services;
 6
 7public class TipoMovimientoService : ITipoMovimientoService
 8{
 9    private readonly ITipoMovimientoRepository _tipoMovimientoRepository;
 10    private readonly IAuditoriaService _auditoriaService;
 11    private readonly ICurrentUserContext _currentUser;
 12
 613    public TipoMovimientoService(ITipoMovimientoRepository tipoMovimientoRepository, IAuditoriaService auditoriaService,
 14    {
 615        _tipoMovimientoRepository = tipoMovimientoRepository;
 616        _auditoriaService = auditoriaService;
 617        _currentUser = currentUser;
 618    }
 19
 20    public async Task<IEnumerable<TipoMovimientoDto>> ObtenerTodosAsync()
 21    {
 022        var tipos = await _tipoMovimientoRepository.ObtenerTodosAsync();
 023        return tipos.Select(t => new TipoMovimientoDto { Id = t.Id, Denominacion = t.Nombre, EsAlta = t.EsAlta });
 024    }
 25
 26    public async Task<(bool Exito, TipoMovimientoDto? Resultado, string? Error)> CrearAsync(string nombre, bool esAlta)
 27    {
 28        try
 29        {
 330            if (string.IsNullOrWhiteSpace(nombre))
 131                return (false, null, "El nombre es requerido");
 32
 233            if (await _tipoMovimientoRepository.ExisteNombreAsync(nombre.Trim()))
 134                return (false, null, "Ya existe un tipo de movimiento con ese nombre");
 35
 136            var nuevo = new TipoMovimiento { Nombre = nombre.Trim(), EsAlta = esAlta };
 137            var creado = await _tipoMovimientoRepository.CrearAsync(nuevo);
 38
 139            await _auditoriaService.LogAuditoriaAsync(
 140                usuarioId: _currentUser.UserId ?? 0,
 141                AccionEnum.CrearPersonal,
 142                ContextoEnum.Personal,
 143                host: _currentUser.Host,
 144                entidad: nameof(TipoMovimiento),
 145                entidadId: creado.Id,
 146                detalle: new { operacion = "crear", id = creado.Id, nombre = creado.Nombre });
 47
 148            return (true, new TipoMovimientoDto { Id = creado.Id, Denominacion = creado.Nombre }, null);
 49        }
 050        catch (Exception ex)
 51        {
 052            return (false, null, $"Error al crear tipo de movimiento: {ex.Message}");
 53        }
 354    }
 55
 56    public async Task<(bool Exito, TipoMovimientoDto? Resultado, string? Error)> ActualizarAsync(long id, string? nombre
 57    {
 58        try
 59        {
 360            var tipo = await _tipoMovimientoRepository.ObtenerPorIdAsync(id);
 361            if (tipo == null)
 162                return (false, null, "Tipo de movimiento no encontrado");
 63
 264            var snapshotAntes = new { id = tipo.Id, nombre = tipo.Nombre };
 65
 266            if (!string.IsNullOrWhiteSpace(nombre))
 67            {
 268                var nombreNormalizado = nombre.Trim();
 269                if (!string.Equals(tipo.Nombre, nombreNormalizado, StringComparison.Ordinal) && await _tipoMovimientoRep
 170                    return (false, null, "Ya existe un tipo de movimiento con ese nombre");
 171                tipo.Nombre = nombreNormalizado;
 172            }
 73
 174            if (esAlta.HasValue)
 075                tipo.EsAlta = esAlta.Value;
 76
 177            var actualizado = await _tipoMovimientoRepository.ActualizarAsync(tipo);
 78
 179            await _auditoriaService.LogAuditoriaAsync(
 180                usuarioId: _currentUser.UserId ?? 0,
 181                AccionEnum.ActualizarPersonal,
 182                ContextoEnum.Personal,
 183                host: _currentUser.Host,
 184                entidad: nameof(TipoMovimiento),
 185                entidadId: actualizado.Id,
 186                detalle: new { operacion = "actualizar", antes = snapshotAntes, despues = new { id = actualizado.Id, nom
 87
 188            return (true, new TipoMovimientoDto { Id = actualizado.Id, Denominacion = actualizado.Nombre }, null);
 89        }
 090        catch (Exception ex)
 91        {
 092            return (false, null, $"Error al actualizar tipo de movimiento: {ex.Message}");
 93        }
 394    }
 95}