< Summary

Information
Class: FAU.Logica.Services.TablaPermanenciaService
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/TablaPermanenciaService.cs
Line coverage
91%
Covered lines: 154
Uncovered lines: 15
Coverable lines: 169
Total lines: 242
Line coverage: 91.1%
Branch coverage
49%
Covered branches: 53
Total branches: 108
Branch coverage: 49%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetByIdAsync()100%11100%
GetAllAsync()100%11100%
GetPagedAsync()83.33%66100%
CreateAsync()60.71%312884.09%
UpdateAsync()52.27%494486.44%
DeleteAsync()100%11100%
CalcularMontoAsync()83.33%66100%

File(s)

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

#LineLine coverage
 1using FAU.DataAccess.Repositories;
 2using FAU.Entidades;
 3using FAU.Logica.DTOs;
 4
 5namespace FAU.Logica.Services;
 6
 7public class TablaPermanenciaService : ITablaPermanenciaService
 8{
 9    private readonly ITablaPermanenciaRepository _tablaPermanenciaRepository;
 10    private readonly IAuditoriaService _auditoriaService;
 11    private readonly ICurrentUserContext _currentUser;
 12
 1313    public TablaPermanenciaService(
 1314        ITablaPermanenciaRepository tablaPermanenciaRepository,
 1315        IAuditoriaService auditoriaService,
 1316        ICurrentUserContext currentUser)
 17    {
 1318        _tablaPermanenciaRepository = tablaPermanenciaRepository;
 1319        _auditoriaService = auditoriaService;
 1320        _currentUser = currentUser;
 1321    }
 22
 23    public async Task<TablaPermanencia?> GetByIdAsync(long id)
 24    {
 125        return await _tablaPermanenciaRepository.GetByIdAsync(id);
 126    }
 27
 28    public async Task<IEnumerable<TablaPermanencia>> GetAllAsync()
 29    {
 130        return await _tablaPermanenciaRepository.GetAllAsync();
 131    }
 32
 33    public async Task<PagedResult<TablaPermanenciaDto>> GetPagedAsync(
 34        int page, int pageSize, long? escalafonId = null, long? gradoId = null)
 35    {
 236        if (page < 1) page = 1;
 137        if (pageSize < 1) pageSize = 10;
 238        if (pageSize > 100) pageSize = 100;
 39
 140        var (items, totalCount) = await _tablaPermanenciaRepository.GetPagedAsync(page, pageSize, escalafonId, gradoId);
 41
 142        var dtoItems = items.Select(item => new TablaPermanenciaDto
 143        {
 144            Id = item.Id,
 145            EscalafonId = item.EscalafonId,
 146            EscalafonCodigo = item.Escalafon?.Codigo ?? string.Empty,
 147            EscalafonDenominacion = item.Escalafon?.Denominacion ?? string.Empty,
 148            GradoId = item.GradoId,
 149            GradoCodigo = item.Grado?.Codigo ?? string.Empty,
 150            GradoDenominacion = item.Grado?.Denominacion ?? string.Empty,
 151            MesesDesde = item.MesesDesde,
 152            MesesHasta = item.MesesHasta,
 153            MontoFijo = item.MontoFijo,
 154            Porcentaje = item.Porcentaje,
 155            AplicaRiesgoVuelo = item.AplicaRiesgoVuelo,
 156            VigenteDesde = item.VigenteDesde,
 157            VigenteHasta = item.VigenteHasta,
 158            Activo = item.Activo
 159        }).ToList();
 60
 161        return new PagedResult<TablaPermanenciaDto>
 162        {
 163            Items = dtoItems,
 164            Page = page,
 165            PageSize = pageSize,
 166            TotalCount = totalCount
 167        };
 168    }
 69
 70    public async Task<(bool Success, TablaPermanencia? TablaPermanencia, string? Error)> CreateAsync(CrearTablaPermanenc
 71    {
 572        if (request.EscalafonId <= 0)
 073            return (false, null, "El escalafón es obligatorio");
 74
 575        if (request.GradoId <= 0)
 076            return (false, null, "El grado es obligatorio");
 77
 578        if (request.MesesDesde < 0)
 179            return (false, null, "Los meses desde deben ser mayores o iguales a cero");
 80
 481        if (request.MesesHasta < request.MesesDesde)
 082            return (false, null, "Los meses hasta deben ser mayores o iguales a los meses desde");
 83
 484        if (!request.Porcentaje.HasValue && !request.MontoFijo.HasValue)
 085            return (false, null, "Se debe indicar un porcentaje o un monto fijo");
 86
 487        if (request.Porcentaje.HasValue && request.Porcentaje.Value < 0)
 088            return (false, null, "El porcentaje debe ser mayor o igual a cero");
 89
 490        if (request.MontoFijo.HasValue && request.MontoFijo.Value < 0)
 091            return (false, null, "El monto fijo debe ser mayor o igual a cero");
 92
 493        if (request.VigenteHasta.HasValue && request.VigenteHasta < request.VigenteDesde)
 094            return (false, null, "La fecha de fin de vigencia debe ser posterior a la fecha de inicio");
 95
 496        if (await _tablaPermanenciaRepository.ExistsOverlapAsync(
 497            request.EscalafonId, request.GradoId,
 498            request.MesesDesde, request.MesesHasta,
 499            request.AplicaRiesgoVuelo, null))
 100        {
 1101            return (false, null, "Ya existe un rango de permanencia solapado para esta combinación de escalafón, grado y
 102        }
 103
 3104        var nuevaTabla = new TablaPermanencia
 3105        {
 3106            EscalafonId = request.EscalafonId,
 3107            GradoId = request.GradoId,
 3108            MesesDesde = request.MesesDesde,
 3109            MesesHasta = request.MesesHasta,
 3110            Porcentaje = request.Porcentaje,
 3111            MontoFijo = request.MontoFijo,
 3112            AplicaRiesgoVuelo = request.AplicaRiesgoVuelo,
 3113            VigenteDesde = request.VigenteDesde,
 3114            VigenteHasta = request.VigenteHasta
 3115        };
 116
 3117        var creada = await _tablaPermanenciaRepository.CreateAsync(nuevaTabla);
 118
 3119        await _auditoriaService.LogAuditoriaAsync(
 3120            usuarioId: _currentUser.UserId ?? 0,
 3121            AccionEnum.CrearTablaPermanencia,
 3122            ContextoEnum.Liquidaciones,
 3123            host: _currentUser.Host,
 3124            entidad: nameof(TablaPermanencia),
 3125            entidadId: creada.Id,
 3126            detalle: new { operacion = "crear", creada.EscalafonId, creada.GradoId, creada.MesesDesde, creada.MesesHasta
 127
 3128        return (true, creada, null);
 5129    }
 130
 131    public async Task<(bool Success, TablaPermanencia? TablaPermanencia, string? Error)> UpdateAsync(long id, Actualizar
 132    {
 2133        var existente = await _tablaPermanenciaRepository.GetByIdAsync(id);
 2134        if (existente == null)
 0135            return (false, null, "Rango de permanencia no encontrado");
 136
 2137        var mesesDesde = request.MesesDesde ?? existente.MesesDesde;
 2138        var mesesHasta = request.MesesHasta ?? existente.MesesHasta;
 2139        var escalafonId = request.EscalafonId ?? existente.EscalafonId;
 2140        var gradoId = request.GradoId ?? existente.GradoId;
 2141        var porcentaje = request.Porcentaje ?? existente.Porcentaje;
 2142        var montoFijo = request.MontoFijo ?? existente.MontoFijo;
 2143        var aplicaRiesgoVuelo = request.AplicaRiesgoVuelo ?? existente.AplicaRiesgoVuelo;
 2144        var vigenteDesde = request.VigenteDesde ?? existente.VigenteDesde;
 2145        var vigenteHasta = request.VigenteHasta ?? existente.VigenteHasta;
 146
 2147        if (mesesDesde < 0)
 0148            return (false, null, "Los meses desde deben ser mayores o iguales a cero");
 149
 2150        if (mesesHasta < mesesDesde)
 0151            return (false, null, "Los meses hasta deben ser mayores o iguales a los meses desde");
 152
 2153        if (!porcentaje.HasValue && !montoFijo.HasValue)
 0154            return (false, null, "Se debe indicar un porcentaje o un monto fijo");
 155
 2156        if (porcentaje.HasValue && porcentaje.Value < 0)
 0157            return (false, null, "El porcentaje debe ser mayor o igual a cero");
 158
 2159        if (montoFijo.HasValue && montoFijo.Value < 0)
 0160            return (false, null, "El monto fijo debe ser mayor o igual a cero");
 161
 2162        if (vigenteHasta.HasValue && vigenteHasta < vigenteDesde)
 0163            return (false, null, "La fecha de fin de vigencia debe ser posterior a la fecha de inicio");
 164
 2165        if (await _tablaPermanenciaRepository.ExistsOverlapAsync(
 2166            escalafonId, gradoId, mesesDesde, mesesHasta, aplicaRiesgoVuelo, id))
 167        {
 0168            return (false, null, "Ya existe un rango de permanencia solapado para esta combinación de escalafón, grado y
 169        }
 170
 2171        var antes = new
 2172        {
 2173            existente.EscalafonId,
 2174            existente.GradoId,
 2175            existente.MesesDesde,
 2176            existente.MesesHasta,
 2177            existente.Porcentaje,
 2178            existente.MontoFijo,
 2179            existente.AplicaRiesgoVuelo,
 2180            existente.VigenteDesde,
 2181            existente.VigenteHasta
 2182        };
 183
 2184        existente.EscalafonId = escalafonId;
 2185        existente.GradoId = gradoId;
 2186        existente.MesesDesde = mesesDesde;
 2187        existente.MesesHasta = mesesHasta;
 2188        existente.Porcentaje = porcentaje;
 2189        existente.MontoFijo = montoFijo;
 2190        existente.AplicaRiesgoVuelo = aplicaRiesgoVuelo;
 2191        existente.VigenteDesde = vigenteDesde;
 2192        existente.VigenteHasta = vigenteHasta;
 193
 2194        var actualizado = await _tablaPermanenciaRepository.UpdateAsync(existente);
 195
 2196        await _auditoriaService.LogAuditoriaAsync(
 2197            usuarioId: _currentUser.UserId ?? 0,
 2198            AccionEnum.ActualizarTablaPermanencia,
 2199            ContextoEnum.Liquidaciones,
 2200            host: _currentUser.Host,
 2201            entidad: nameof(TablaPermanencia),
 2202            entidadId: actualizado.Id,
 2203            detalle: new { operacion = "editar", antes, despues = new { actualizado.EscalafonId, actualizado.GradoId, ac
 204
 2205        return (true, actualizado, null);
 2206    }
 207
 208    public async Task DeleteAsync(long id)
 209    {
 3210        await _tablaPermanenciaRepository.DeleteAsync(id);
 3211        await _auditoriaService.LogAuditoriaAsync(
 3212            usuarioId: _currentUser.UserId ?? 0,
 3213            AccionEnum.EliminarTablaPermanencia,
 3214            ContextoEnum.Liquidaciones,
 3215            host: _currentUser.Host,
 3216            entidad: nameof(TablaPermanencia),
 3217            entidadId: id,
 3218            detalle: new { operacion = "eliminar" });
 3219    }
 220
 221    public async Task<(bool Success, decimal Monto, string? Error)> CalcularMontoAsync(
 222        long escalafonId, long gradoId, int mesesServicio, bool riesgoVuelo, DateTime? fechaReferencia = null)
 223    {
 4224        if (mesesServicio < 0)
 1225            return (false, 0m, "Los meses de servicio no pueden ser negativos");
 226
 3227        var referencia = fechaReferencia?.Date ?? DateTime.Now.Date;
 3228        var todas = await _tablaPermanenciaRepository.GetAllAsync();
 229
 3230        var rango = todas
 2231            .Where(t => t.EscalafonId == escalafonId)
 2232            .Where(t => t.GradoId == gradoId)
 2233            .Where(t => t.AplicaRiesgoVuelo == riesgoVuelo)
 2234            .Where(t => t.VigenteDesde <= referencia && (t.VigenteHasta == null || t.VigenteHasta >= referencia))
 5235            .FirstOrDefault(t => t.MesesDesde <= mesesServicio && mesesServicio <= t.MesesHasta);
 236
 3237        if (rango == null)
 1238            return (false, 0m, "No existe rango aplicable de permanencia para los meses indicados");
 239
 2240        return (true, rango.MontoFijo ?? 0m, null);
 4241    }
 242}