< Summary

Information
Class: FAU.Entidades.Acumuladores
Assembly: FAU.Entidades
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Entidades/Acumuladores.cs
Line coverage
100%
Covered lines: 65
Uncovered lines: 0
Coverable lines: 65
Total lines: 140
Line coverage: 100%
Branch coverage
85%
Covered branches: 36
Total branches: 42
Branch coverage: 85.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_WPara53()100%11100%
get_WPara10()100%11100%
get_WPara20()100%11100%
get_WNominal()100%11100%
get_HabNorGrab()100%11100%
get_HabsAnGrab()100%11100%
get_HabsNoGrab()100%11100%
get_BenSocGrab()100%11100%
get_BenSocNoGr()100%11100%
get_DtoLegGrab()100%11100%
get_DtoLegNoGr()100%11100%
get_DtoPerGrab()100%11100%
get_Liquido()100%11100%
.cctor()100%11100%
AgregarItem(...)85.71%4242100%
Reiniciar()100%11100%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Entidades/Acumuladores.cs

#LineLine coverage
 1namespace FAU.Entidades;
 2
 3/// <summary>
 4/// Acumuladores del motor de cálculo de liquidación.
 5/// Mantiene en tiempo real las bases de cálculo y clasificaciones SIIF
 6/// conforme se procesan ítems durante el pipeline de liquidación.
 7/// </summary>
 8public class Acumuladores
 9{
 10    /// <summary>
 11    /// Bases de cálculo para aplicación de fórmulas
 12    /// </summary>
 10813    public decimal WPara53 { get; private set; } = 0m;      // Base SDL 5.3%
 1414    public decimal WPara10 { get; private set; } = 0m;      // Base DI 10% (= WPara53 + SDL 5.3%)
 1015    public decimal WPara20 { get; private set; } = 0m;      // Base Aporte Solidario 20% u otros
 45516    public decimal WNominal { get; private set; } = 0m;     // Suma de todos haberes grabados
 17
 18    /// <summary>
 19    /// Clasificaciones SIIF (Sistema Integrado de Información Financiera)
 20    /// </summary>
 40321    public decimal HabNorGrab { get; private set; } = 0m;   // Haberes normales grabados
 2122    public decimal HabsAnGrab { get; private set; } = 0m;   // Haberes antiguos grabados
 1323    public decimal HabsNoGrab { get; private set; } = 0m;   // Haberes no grabados
 1624    public decimal BenSocGrab { get; private set; } = 0m;   // Beneficios sociales grabados
 1325    public decimal BenSocNoGr { get; private set; } = 0m;   // Beneficios sociales no grabados
 1526    public decimal DtoLegGrab { get; private set; } = 0m;   // Descuentos legales grabados (IRPF, Montepio, etc)
 1327    public decimal DtoLegNoGr { get; private set; } = 0m;   // Descuentos legales no grabados
 1328    public decimal DtoPerGrab { get; private set; } = 0m;   // Descuentos personales grabados
 29
 30    /// <summary>
 31    /// Neto a pagar = haberes - descuentos (calculado automáticamente)
 32    /// </summary>
 33    public decimal Liquido
 34    {
 35        get
 36        {
 637            return HabNorGrab + HabsAnGrab + HabsNoGrab + BenSocGrab + BenSocNoGr
 638                   - DtoLegGrab - DtoLegNoGr - DtoPerGrab;
 39        }
 40    }
 41
 42    /// <summary>
 43    /// Clasificaciones SIIF válidas permitidas
 44    /// </summary>
 145    private static readonly HashSet<string> ClasificacionesSiifValidas = new()
 146    {
 147        "HabNorGrab", "HabsAnGrab", "HabsNoGrab",
 148        "BenSocGrab", "BenSocNoGr",
 149        "DtoLegGrab", "DtoLegNoGr", "DtoPerGrab"
 150    };
 51
 52    /// <summary>
 53    /// Agrega un ítem de liquidación al acumulador.
 54    /// Actualiza automáticamente las bases y clasificaciones SIIF según
 55    /// los flags del CatalogoItem.
 56    /// </summary>
 57    /// <param name="monto">Monto del ítem a agregar</param>
 58    /// <param name="catalogoItem">Configuración del catálogo que define cómo se clasifica el ítem</param>
 59    /// <exception cref="InvalidOperationException">
 60    /// Se lanza si ClasificacionSiif es null o no es una clasificación válida
 61    /// </exception>
 62    public void AgregarItem(decimal monto, CatalogoItem catalogoItem)
 63    {
 20964        if (catalogoItem.ClasificacionSiif == null)
 65        {
 166            throw new InvalidOperationException(
 167                $"ClasificacionSiif no puede ser null para ítem código {catalogoItem.Codigo}");
 68        }
 69
 20870        if (!ClasificacionesSiifValidas.Contains(catalogoItem.ClasificacionSiif))
 71        {
 172            throw new InvalidOperationException(
 173                $"Clasificación SIIF no permitida: '{catalogoItem.ClasificacionSiif}'. " +
 174                $"Valores permitidos: {string.Join(", ", ClasificacionesSiifValidas)}");
 75        }
 76
 77        // Actualizar bases de cálculo según flags del catálogo
 20778        if (catalogoItem.ContribuyeWPara53)
 5079            WPara53 += monto;
 80
 20781        if (catalogoItem.ContribuyeWPara10)
 382            WPara10 += monto;
 83
 20784        if (catalogoItem.ContribuyeWPara20)
 185            WPara20 += monto;
 86
 20787        if (catalogoItem.ContribuyeWNominal)
 18488            WNominal += monto;
 89
 90        // Actualizar clasificación SIIF
 20791        switch (catalogoItem.ClasificacionSiif)
 92        {
 93            case "HabNorGrab":
 19594                HabNorGrab += monto;
 19595                break;
 96            case "HabsAnGrab":
 497                HabsAnGrab += monto;
 498                break;
 99            case "HabsNoGrab":
 1100                HabsNoGrab += monto;
 1101                break;
 102            case "BenSocGrab":
 2103                BenSocGrab += monto;
 2104                break;
 105            case "BenSocNoGr":
 1106                BenSocNoGr += monto;
 1107                break;
 108            case "DtoLegGrab":
 2109                DtoLegGrab += monto;
 2110                break;
 111            case "DtoLegNoGr":
 1112                DtoLegNoGr += monto;
 1113                break;
 114            case "DtoPerGrab":
 1115                DtoPerGrab += monto;
 116                break;
 117        }
 1118    }
 119
 120    /// <summary>
 121    /// Reinicia todos los acumuladores a cero.
 122    /// Útil para reutilizar la instancia o para testing.
 123    /// </summary>
 124    public void Reiniciar()
 125    {
 2126        WPara53 = 0m;
 2127        WPara10 = 0m;
 2128        WPara20 = 0m;
 2129        WNominal = 0m;
 130
 2131        HabNorGrab = 0m;
 2132        HabsAnGrab = 0m;
 2133        HabsNoGrab = 0m;
 2134        BenSocGrab = 0m;
 2135        BenSocNoGr = 0m;
 2136        DtoLegGrab = 0m;
 2137        DtoLegNoGr = 0m;
 2138        DtoPerGrab = 0m;
 2139    }
 140}