< 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
89%
Covered lines: 133
Uncovered lines: 15
Coverable lines: 148
Total lines: 253
Line coverage: 89.8%
Branch coverage
55%
Covered branches: 49
Total branches: 88
Branch coverage: 55.6%
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()57.69%292683.78%
UpdateAsync()50%464084.61%
DeleteAsync()100%11100%
CalcularFactorAsync()75%8890.9%

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(int page, int pageSize, long? escalafonId = null)
 34    {
 235        if (page < 1) page = 1;
 136        if (pageSize < 1) pageSize = 10;
 237        if (pageSize > 100) pageSize = 100;
 38
 139        var (items, totalCount) = await _tablaPermanenciaRepository.GetPagedAsync(page, pageSize, escalafonId);
 40
 141        var dtoItems = items.Select(item => new TablaPermanenciaDto
 142        {
 143            Id = item.Id,
 144            EscalafonId = item.EscalafonId,
 145            AniosDesde = item.AniosDesde,
 146            AniosHasta = item.AniosHasta,
 147            Porcentaje = item.Porcentaje,
 148            MontoFijo = item.MontoFijo,
 149            VigenteDesde = item.VigenteDesde,
 150            VigenteHasta = item.VigenteHasta
 151        }).ToList();
 52
 153        return new PagedResult<TablaPermanenciaDto>
 154        {
 155            Items = dtoItems,
 156            Page = page,
 157            PageSize = pageSize,
 158            TotalCount = totalCount
 159        };
 160    }
 61
 62    public async Task<(bool Success, TablaPermanencia? TablaPermanencia, string? Error)> CreateAsync(CrearTablaPermanenc
 63    {
 564        if (request.EscalafonId <= 0)
 65        {
 066            return (false, null, "El escalafón es obligatorio");
 67        }
 68
 569        if (request.AniosDesde < 0)
 70        {
 171            return (false, null, "Los años desde deben ser mayores o iguales a cero");
 72        }
 73
 474        if (request.AniosHasta < request.AniosDesde)
 75        {
 076            return (false, null, "Los años hasta deben ser mayores o iguales a los años desde");
 77        }
 78
 479        if (!request.Porcentaje.HasValue && !request.MontoFijo.HasValue)
 80        {
 081            return (false, null, "Se debe indicar un porcentaje o un monto fijo");
 82        }
 83
 484        if (request.Porcentaje.HasValue && request.Porcentaje.Value < 0)
 85        {
 086            return (false, null, "El porcentaje debe ser mayor o igual a cero");
 87        }
 88
 489        if (request.MontoFijo.HasValue && request.MontoFijo.Value < 0)
 90        {
 091            return (false, null, "El monto fijo debe ser mayor o igual a cero");
 92        }
 93
 494        if (request.VigenteHasta.HasValue && request.VigenteHasta < request.VigenteDesde)
 95        {
 096            return (false, null, "La fecha de fin de vigencia debe ser posterior a la fecha de inicio");
 97        }
 98
 499        if (await _tablaPermanenciaRepository.ExistsOverlapAsync(request.EscalafonId, request.AniosDesde, request.AniosH
 100        {
 1101            return (false, null, "Ya existe un rango de permanencia solapado para este escalafón");
 102        }
 103
 3104        var nuevaTabla = new TablaPermanencia
 3105        {
 3106            EscalafonId = request.EscalafonId,
 3107            AniosDesde = request.AniosDesde,
 3108            AniosHasta = request.AniosHasta,
 3109            Porcentaje = request.Porcentaje,
 3110            MontoFijo = request.MontoFijo,
 3111            VigenteDesde = request.VigenteDesde,
 3112            VigenteHasta = request.VigenteHasta
 3113        };
 114
 3115        var creada = await _tablaPermanenciaRepository.CreateAsync(nuevaTabla);
 116
 3117        await _auditoriaService.LogAuditoriaAsync(
 3118            usuarioId: _currentUser.UserId ?? 0,
 3119            AccionEnum.CrearTablaPermanencia,
 3120            ContextoEnum.Liquidaciones,
 3121            host: _currentUser.Host,
 3122            entidad: nameof(TablaPermanencia),
 3123            entidadId: creada.Id,
 3124            detalle: new { operacion = "crear", escalafonId = creada.EscalafonId, aniosDesde = creada.AniosDesde, aniosH
 125
 3126        return (true, creada, null);
 5127    }
 128
 129    public async Task<(bool Success, TablaPermanencia? TablaPermanencia, string? Error)> UpdateAsync(long id, Actualizar
 130    {
 2131        var existente = await _tablaPermanenciaRepository.GetByIdAsync(id);
 2132        if (existente == null)
 133        {
 0134            return (false, null, "Rango de permanencia no encontrado");
 135        }
 136
 2137        var aniosDesde = request.AniosDesde ?? existente.AniosDesde;
 2138        var aniosHasta = request.AniosHasta ?? existente.AniosHasta;
 2139        var escalafonId = request.EscalafonId ?? existente.EscalafonId;
 2140        var porcentaje = request.Porcentaje ?? existente.Porcentaje;
 2141        var montoFijo = request.MontoFijo ?? existente.MontoFijo;
 2142        var vigenteDesde = request.VigenteDesde ?? existente.VigenteDesde;
 2143        var vigenteHasta = request.VigenteHasta ?? existente.VigenteHasta;
 144
 2145        if (aniosDesde < 0)
 146        {
 0147            return (false, null, "Los años desde deben ser mayores o iguales a cero");
 148        }
 149
 2150        if (aniosHasta < aniosDesde)
 151        {
 0152            return (false, null, "Los años hasta deben ser mayores o iguales a los años desde");
 153        }
 154
 2155        if (!porcentaje.HasValue && !montoFijo.HasValue)
 156        {
 0157            return (false, null, "Se debe indicar un porcentaje o un monto fijo");
 158        }
 159
 2160        if (porcentaje.HasValue && porcentaje.Value < 0)
 161        {
 0162            return (false, null, "El porcentaje debe ser mayor o igual a cero");
 163        }
 164
 2165        if (montoFijo.HasValue && montoFijo.Value < 0)
 166        {
 0167            return (false, null, "El monto fijo debe ser mayor o igual a cero");
 168        }
 169
 2170        if (vigenteHasta.HasValue && vigenteHasta < vigenteDesde)
 171        {
 0172            return (false, null, "La fecha de fin de vigencia debe ser posterior a la fecha de inicio");
 173        }
 174
 2175        if (await _tablaPermanenciaRepository.ExistsOverlapAsync(escalafonId, aniosDesde, aniosHasta, id))
 176        {
 0177            return (false, null, "Ya existe un rango de permanencia solapado para este escalafón");
 178        }
 179
 2180        var antes = new
 2181        {
 2182            escalafonId = existente.EscalafonId,
 2183            aniosDesde = existente.AniosDesde,
 2184            aniosHasta = existente.AniosHasta,
 2185            porcentaje = existente.Porcentaje,
 2186            montoFijo = existente.MontoFijo,
 2187            vigenteDesde = existente.VigenteDesde,
 2188            vigenteHasta = existente.VigenteHasta
 2189        };
 190
 2191        existente.EscalafonId = escalafonId;
 2192        existente.AniosDesde = aniosDesde;
 2193        existente.AniosHasta = aniosHasta;
 2194        existente.Porcentaje = porcentaje;
 2195        existente.MontoFijo = montoFijo;
 2196        existente.VigenteDesde = vigenteDesde;
 2197        existente.VigenteHasta = vigenteHasta;
 198
 2199        var actualizado = await _tablaPermanenciaRepository.UpdateAsync(existente);
 200
 2201        await _auditoriaService.LogAuditoriaAsync(
 2202            usuarioId: _currentUser.UserId ?? 0,
 2203            AccionEnum.ActualizarTablaPermanencia,
 2204            ContextoEnum.Liquidaciones,
 2205            host: _currentUser.Host,
 2206            entidad: nameof(TablaPermanencia),
 2207            entidadId: actualizado.Id,
 2208            detalle: new { operacion = "editar", antes, despues = new { escalafonId = actualizado.EscalafonId, aniosDesd
 209
 2210        return (true, actualizado, null);
 2211    }
 212
 213    public async Task DeleteAsync(long id)
 214    {
 3215        await _tablaPermanenciaRepository.DeleteAsync(id);
 3216        await _auditoriaService.LogAuditoriaAsync(
 3217            usuarioId: _currentUser.UserId ?? 0,
 3218            AccionEnum.EliminarTablaPermanencia,
 3219            ContextoEnum.Liquidaciones,
 3220            host: _currentUser.Host,
 3221            entidad: nameof(TablaPermanencia),
 3222            entidadId: id,
 3223            detalle: new { operacion = "eliminar" });
 3224    }
 225
 226    public async Task<(bool Success, decimal Factor, string? Error)> CalcularFactorAsync(long escalafonId, int aniosServ
 227    {
 4228        if (aniosServicio < 0)
 229        {
 1230            return (false, 0m, "Los años de servicio no pueden ser negativos");
 231        }
 232
 3233        var referencia = fechaReferencia?.Date ?? DateTime.UtcNow.Date;
 3234        var todas = await _tablaPermanenciaRepository.GetAllAsync();
 235
 3236        var rango = todas
 2237            .Where(t => t.EscalafonId == escalafonId)
 2238            .Where(t => t.VigenteDesde <= referencia && (t.VigenteHasta == null || t.VigenteHasta >= referencia))
 5239            .FirstOrDefault(t => t.AniosDesde <= aniosServicio && aniosServicio <= t.AniosHasta);
 240
 3241        if (rango == null)
 242        {
 1243            return (false, 0m, "No existe rango aplicable de permanencia para los años indicados");
 244        }
 245
 2246        if (!rango.Porcentaje.HasValue)
 247        {
 0248            return (false, 0m, "El rango encontrado no define un porcentaje de permanencia");
 249        }
 250
 2251        return (true, rango.Porcentaje.Value, null);
 4252    }
 253}