< 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
100%
Covered lines: 31
Uncovered lines: 0
Coverable lines: 31
Total lines: 79
Line coverage: 100%
Branch coverage
91%
Covered branches: 22
Total branches: 24
Branch coverage: 91.6%
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(...)93.75%1616100%

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    {
 2016        if (wPara10 <= 0) return;
 2017        var orden = insumos.OrdenPorGrado.TryGetValue(funcionario.GradoId, out var o) ? o : (short)2;
 2018        var porcentaje = orden >= 2 ? 0.35m : 0.30m;
 2019        var di = Math.Round(wPara10 * porcentaje, 2);
 2020        AgregarItem(43004, di, insumos, acumuladores, resultado);
 2021    }
 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    {
 2030        var orden = insumos.OrdenPorGrado.TryGetValue(funcionario.GradoId, out var o) ? o : (short)2;
 2031        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)
 2138        var rem1 = insumos.ObtenerRemuneracion(funcionario.GradoId, 11000)
 2139            ?? throw new InvalidOperationException($"Sin remuneración para grado {funcionario.GradoId} cod 11000");
 2040        AgregarItem(11000, rem1.Monto, insumos, acumuladores, resultado);
 2041        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
 2045        var rem6 = insumos.ObtenerRemuneracion(funcionario.GradoId, 42022);
 2046        if (rem6 is not null)
 47        {
 1148            AgregarItem(42022, rem6.Monto, insumos, acumuladores, resultado);
 1149            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)
 2053        if (funcionario.CategoriaViatico > 0)
 54        {
 155            var rem5 = insumos.ObtenerRemuneracion(funcionario.GradoId, 69008);
 156            if (rem5 is not null)
 157                AgregarItem(69008, rem5.Monto, insumos, acumuladores, resultado);
 58        }
 59
 60        // 041.003 — Permanencia en el Grado (meses desde FechaUltimoAscenso, no desde FechaInicio)
 2061        var meses = CalcularMesesPermanencia(funcionario, insumos);
 2062        var riesgoVuelo = funcionario.RiesgoVuelo.HasValue && funcionario.RiesgoVuelo.Value > 0;
 2063        var permanencia = insumos.ObtenerPermanencia(funcionario.EscalafonId, funcionario.GradoId, meses, riesgoVuelo);
 2064        if (permanencia is not null)
 65        {
 266            var montoPermanencia = permanencia.Porcentaje.HasValue
 267                ? rem1.Monto * permanencia.Porcentaje.Value
 268                : permanencia.MontoFijo ?? 0m;
 69
 270            if (montoPermanencia > 0m)
 71            {
 272                AgregarItem(41003, montoPermanencia, insumos, acumuladores, resultado);
 273                wpara53 += montoPermanencia;
 74            }
 75        }
 76
 2077        return wpara53;
 78    }
 79}