< Summary

Information
Class: FAU.Logica.Calculadores.Sit30Calculator
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Calculadores/Sit30Calculator.cs
Line coverage
70%
Covered lines: 22
Uncovered lines: 9
Coverable lines: 31
Total lines: 79
Line coverage: 70.9%
Branch coverage
62%
Covered branches: 15
Total branches: 24
Branch coverage: 62.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
CalcularDedicacionIntegral(...)83.33%66100%
DebeCalcularSDL(...)100%22100%
CalcularItemsBase(...)50%311660.86%

File(s)

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

#LineLine coverage
 1using FAU.Entidades;
 2using FAU.Logica.DTOs;
 3
 4namespace FAU.Logica.Calculadores;
 5
 6public class Sit30Calculator : CalculadorHaberesBase
 7{
 8    // DI depende del grado (confirmado DFC 2026-06-10):
 9    //   SOM a Cbo.2da (orden DB >= 2): 35%
 10    //   SDO.1ra en adelante (orden DB <= 1): 30%
 11    // Se resuelve en tiempo de ejecución consultando InsumosPeriodo.OrdenPorGrado
 12    protected override void CalcularDedicacionIntegral(
 13        decimal wPara10, RelacionLaboral funcionario,
 14        InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 15    {
 1516        if (wPara10 <= 0) return;
 1517        var orden = insumos.OrdenPorGrado.TryGetValue(funcionario.GradoId, out var o) ? o : (short)2;
 1518        var porcentaje = orden >= 2 ? 0.35m : 0.30m;
 1519        var di = Math.Round(wPara10 * porcentaje, 2);
 1520        AgregarItem(43004, di, insumos, acumuladores, resultado);
 1521    }
 22
 23    // SDL (048.012, "Compensación 5.3%") aplica de CBO_1RA para arriba (orden >= 3).
 24    // CBO_2DA y SDO_1RA: sin SDL.
 25    // Fuente FoxPro: Calc_Hab.prg línea "If m.grado_ant > 3 AND m.grado_ant < 8" ("De Cabo de 1° para arriba")
 26    // Escala: SDO_1RA=1, CBO_2DA=2, CBO_1RA=3, SGTO=4, SGTO_1RA=5, SOM=6, oficiales>=7.
 27    // grado_ant > 3 (legacy) == orden > 2 == orden >= 3 en nuestro esquema.
 28    protected override bool DebeCalcularSDL(RelacionLaboral funcionario, InsumosPeriodo insumos)
 29    {
 1530        var orden = insumos.OrdenPorGrado.TryGetValue(funcionario.GradoId, out var o) ? o : (short)2;
 1531        return orden >= 3;
 32    }
 33
 34    protected override decimal CalcularItemsBase(
 35        RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 36    {
 37        // 011.000 — Sueldo Básico (obligatorio, entra en wpara53)
 1538        var rem1 = insumos.ObtenerRemuneracion(funcionario.GradoId, 11000)
 1539            ?? throw new InvalidOperationException($"Sin remuneración para grado {funcionario.GradoId} cod 11000");
 1540        AgregarItem(11000, rem1.Monto, insumos, acumuladores, resultado);
 1541        var wpara53 = rem1.Monto;
 42
 43        // 042.022 — Compensación Suboficiales (subalternos usan 042.022, no 042.012)
 44        // Fuente FoxPro Calc_Hab.prg: código 15 = OG 042.022 para subalternos
 1545        var rem6 = insumos.ObtenerRemuneracion(funcionario.GradoId, 42022);
 1546        if (rem6 is not null)
 47        {
 748            AgregarItem(42022, rem6.Monto, insumos, acumuladores, resultado);
 749            wpara53 += rem6.Monto;
 50        }
 51
 52        // 069.008 — Viático en el País PS c/aportes: solo si CAT_VIAT > 0 (NO entra en wpara53)
 1553        if (funcionario.CategoriaViatico > 0)
 54        {
 055            var rem5 = insumos.ObtenerRemuneracion(funcionario.GradoId, 69008);
 056            if (rem5 is not null)
 057                AgregarItem(69008, rem5.Monto, insumos, acumuladores, resultado);
 58        }
 59
 60        // 041.003 — Permanencia en el Grado (meses desde FechaUltimoAscenso, no desde FechaInicio)
 1561        var meses = CalcularMesesPermanencia(funcionario, insumos);
 1562        var riesgoVuelo = funcionario.RiesgoVuelo.HasValue && funcionario.RiesgoVuelo.Value > 0;
 1563        var permanencia = insumos.ObtenerPermanencia(funcionario.EscalafonId, funcionario.GradoId, meses, riesgoVuelo);
 1564        if (permanencia is not null)
 65        {
 066            var montoPermanencia = permanencia.Porcentaje.HasValue
 067                ? rem1.Monto * permanencia.Porcentaje.Value
 068                : permanencia.MontoFijo ?? 0m;
 69
 070            if (montoPermanencia > 0m)
 71            {
 072                AgregarItem(41003, montoPermanencia, insumos, acumuladores, resultado);
 073                wpara53 += montoPermanencia;
 74            }
 75        }
 76
 1577        return wpara53;
 78    }
 79}