< 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: 102
Line coverage: 100%
Branch coverage
100%
Covered branches: 22
Total branches: 22
Branch coverage: 100%
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(...)100%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    {
 4411        var resultado = new ResultadoCalculo();
 12        try
 13        {
 4414            var (wpara53, wPara10) = CalcularItemsBase(funcionario, insumos, acumuladores, resultado);
 4215            AgregarItemsDecreto(funcionario, insumos, acumuladores, resultado);
 16
 4217            if (wPara10 > 0)
 3918                CalcularDedicacionIntegral(wPara10, insumos, acumuladores, resultado);
 19
 4220            if (!funcionario.Regimen.EsLeyVieja)
 1621                CalcularModAportes19695(acumuladores, insumos, resultado);
 22
 4223            if (!funcionario.Situacion.AfectaCobro)
 1024                foreach (var item in resultado.Items)
 425                    item.EsReferencia = true;
 26
 4227            resultado.Estado = resultado.Incidencias.Count > 0
 4228                ? EstadoCalculo.Revisar
 4229                : EstadoCalculo.Calculado;
 4230        }
 231        catch (Exception ex)
 32        {
 233            resultado.Estado = EstadoCalculo.Error;
 234            resultado.MensajeError = ex.Message;
 235        }
 36
 4437        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    {
 46        // Confirmados: 48038 (Dec.180/985 Esc.K), 48040 (Ley 19.355)
 47        // TODO: confirmar OG para 39, 154, 225 con DFC antes de remapear
 3948        int[] codigosDecreto = [48038, 39, 48040, 154, 225];
 46849        foreach (var cod in codigosDecreto)
 50        {
 19551            var rem = insumos.ObtenerRemuneracion(funcionario.GradoId, cod);
 19552            if (rem is not null)
 353                AgregarItem(cod, rem.Monto, insumos, acumuladores, resultado);
 54        }
 3955    }
 56
 57    private static void CalcularDedicacionIntegral(
 58        decimal wPara10, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 59    {
 60        // 043.004 — Compensación por Dedicación Integral (10% base)
 3961        AgregarItem(43004, wPara10 * 0.10m, insumos, acumuladores, resultado);
 3962    }
 63
 64    /// <summary>
 65    /// Modificación de aportes Ley 19.695 (solo régimen ley nueva).
 66    /// Fórmula: (WNominal − monto_048042 − monto_042403) × 2.35%
 67    /// Emite el ítem 042.413 (código catálogo 42413) si la base es positiva.
 68    /// </summary>
 69    private static void CalcularModAportes19695(
 70        Acumuladores acumuladores, InsumosPeriodo insumos, ResultadoCalculo resultado)
 71    {
 72        // Códigos catálogo: 048.042 = 48042, 042.403 = 42403, 042.413 = 42413
 8973        var monto048042 = resultado.Items.Where(i => i.CodigoConcepto == 48042).Sum(i => i.Importe);
 8874        var monto042403 = resultado.Items.Where(i => i.CodigoConcepto == 42403).Sum(i => i.Importe);
 1675        var baseCalculo = acumuladores.WNominal - monto048042 - monto042403;
 76
 1777        if (baseCalculo <= 0) return;
 78
 1579        var monto = Math.Round(baseCalculo * 0.0235m, 2);
 1580        AgregarItem(42413, monto, insumos, acumuladores, resultado);
 1581    }
 82
 83    protected static void AgregarItem(
 84        int codigo, decimal monto, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 85    {
 118186        var catalogoItem = insumos.CatalogoItems.FirstOrDefault(c => c.Codigo == codigo);
 19087        resultado.Items.Add(new ItemCalculado
 19088        {
 19089            CodigoConcepto = codigo,
 19090            NombreConcepto = catalogoItem?.Nombre ?? $"Concepto {codigo}",
 19091            Importe = monto
 19092        });
 19093        if (catalogoItem is not null)
 17694            acumuladores.AgregarItem(monto, catalogoItem);
 19095    }
 96
 97    protected static int CalcularAniosServicio(RelacionLaboral funcionario, InsumosPeriodo insumos)
 98    {
 3999        var fechaPeriodo = new DateTime(insumos.ParametroPeriodo.Anio, insumos.ParametroPeriodo.Mes, 1);
 39100        return Math.Max(0, (int)((fechaPeriodo - funcionario.FechaInicio).TotalDays / 365.25));
 101    }
 102}