< Summary

Information
Class: FAU.Logica.Calculadores.CalculadorHaberesBase
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Calculadores/CalculadorHaberesBase.cs
Line coverage
100%
Covered lines: 46
Uncovered lines: 0
Coverable lines: 46
Total lines: 99
Line coverage: 100%
Branch coverage
90%
Covered branches: 20
Total branches: 22
Branch coverage: 90.9%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
CalcularAsync(...)100%1010100%
AgregarItemsDecreto(...)100%44100%
CalcularDedicacionIntegral(...)100%11100%
CalcularModAportes19695(...)100%22100%
AgregarItem(...)66.66%66100%
CalcularAniosServicio(...)100%11100%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Calculadores/CalculadorHaberesBase.cs

#LineLine coverage
 1using FAU.Entidades;
 2using FAU.Logica.DTOs;
 3
 4namespace FAU.Logica.Calculadores;
 5
 6public abstract class CalculadorHaberesBase : ICalculadorHaberes
 7{
 8    public Task<ResultadoCalculo> CalcularAsync(
 9        RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores)
 10    {
 2911        var resultado = new ResultadoCalculo();
 12        try
 13        {
 2914            var (wpara53, wPara10) = CalcularItemsBase(funcionario, insumos, acumuladores, resultado);
 2715            AgregarItemsDecreto(funcionario, insumos, acumuladores, resultado);
 16
 2717            if (wPara10 > 0)
 2418                CalcularDedicacionIntegral(wPara10, insumos, acumuladores, resultado);
 19
 2720            if (!funcionario.Regimen.EsLeyVieja)
 221                CalcularModAportes19695(acumuladores, insumos, resultado);
 22
 2723            if (!funcionario.Situacion.AfectaCobro)
 1024                foreach (var item in resultado.Items)
 425                    item.EsReferencia = true;
 26
 2727            resultado.Estado = resultado.Incidencias.Count > 0
 2728                ? EstadoCalculo.Revisar
 2729                : EstadoCalculo.Calculado;
 2730        }
 231        catch (Exception ex)
 32        {
 233            resultado.Estado = EstadoCalculo.Error;
 234            resultado.MensajeError = ex.Message;
 235        }
 36
 2937        return Task.FromResult(resultado);
 38    }
 39
 40    protected abstract (decimal WPara53, decimal WPara10) CalcularItemsBase(
 41        RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado);
 42
 43    protected virtual void AgregarItemsDecreto(
 44        RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 45    {
 2446        int[] codigosDecreto = [38, 39, 41, 154, 225];
 28847        foreach (var cod in codigosDecreto)
 48        {
 12049            var rem = insumos.ObtenerRemuneracion(funcionario.GradoId, cod);
 12050            if (rem is not null)
 351                AgregarItem(cod, rem.Monto, insumos, acumuladores, resultado);
 52        }
 2453    }
 54
 55    private static void CalcularDedicacionIntegral(
 56        decimal wPara10, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 57    {
 2458        AgregarItem(17, wPara10 * 0.10m, insumos, acumuladores, resultado);
 2459    }
 60
 61    /// <summary>
 62    /// Modificación de aportes Ley 19.695 (solo régimen ley nueva).
 63    /// Fórmula: (WNominal − monto_048042 − monto_042403) × 2.35%
 64    /// Emite el ítem 042.413 (código catálogo 42413) si la base es positiva.
 65    /// </summary>
 66    private static void CalcularModAportes19695(
 67        Acumuladores acumuladores, InsumosPeriodo insumos, ResultadoCalculo resultado)
 68    {
 69        // Códigos catálogo: 048.042 = 48042, 042.403 = 42403, 042.413 = 42413
 1570        var monto048042 = resultado.Items.Where(i => i.CodigoConcepto == 48042).Sum(i => i.Importe);
 1471        var monto042403 = resultado.Items.Where(i => i.CodigoConcepto == 42403).Sum(i => i.Importe);
 272        var baseCalculo = acumuladores.WNominal - monto048042 - monto042403;
 73
 374        if (baseCalculo <= 0) return;
 75
 176        var monto = Math.Round(baseCalculo * 0.0235m, 2);
 177        AgregarItem(42413, monto, insumos, acumuladores, resultado);
 178    }
 79
 80    protected static void AgregarItem(
 81        int codigo, decimal monto, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 82    {
 71683        var catalogoItem = insumos.CatalogoItems.FirstOrDefault(c => c.Codigo == codigo);
 11284        resultado.Items.Add(new ItemCalculado
 11285        {
 11286            CodigoConcepto = codigo,
 11287            NombreConcepto = catalogoItem?.Nombre ?? $"Concepto {codigo}",
 11288            Importe = monto
 11289        });
 11290        if (catalogoItem is not null)
 11291            acumuladores.AgregarItem(monto, catalogoItem);
 11292    }
 93
 94    protected static int CalcularAniosServicio(RelacionLaboral funcionario, InsumosPeriodo insumos)
 95    {
 2496        var fechaPeriodo = new DateTime(insumos.ParametroPeriodo.Anio, insumos.ParametroPeriodo.Mes, 1);
 2497        return Math.Max(0, (int)((fechaPeriodo - funcionario.FechaInicio).TotalDays / 365.25));
 98    }
 99}