< 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
90%
Covered lines: 28
Uncovered lines: 3
Coverable lines: 31
Total lines: 76
Line coverage: 90.3%
Branch coverage
75%
Covered branches: 18
Total branches: 24
Branch coverage: 75%
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(...)68.75%171686.95%

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    {
 716        if (wPara10 <= 0) return;
 717        var orden = insumos.OrdenPorGrado.TryGetValue(funcionario.GradoId, out var o) ? o : (short)2;
 718        var porcentaje = orden >= 2 ? 0.35m : 0.30m;
 719        var di = Math.Round(wPara10 * porcentaje, 2);
 720        AgregarItem(43004, di, insumos, acumuladores, resultado);
 721    }
 22
 23    // SDL solo aplica a CBO_2DA y superiores (orden >= 2). SDO_1RA y cadetes: sin SDL.
 24    // Fuente FoxPro: Calc_Hab.prg línea "If m.grado_ant > 3 AND m.grado_ant < 8"
 25    // En nuestro esquema: SDO_1RA tiene orden=1, CBO_2DA orden=2.
 26    protected override bool DebeCalcularSDL(RelacionLaboral funcionario, InsumosPeriodo insumos)
 27    {
 728        var orden = insumos.OrdenPorGrado.TryGetValue(funcionario.GradoId, out var o) ? o : (short)2;
 729        return orden >= 2;
 30    }
 31
 32    protected override decimal CalcularItemsBase(
 33        RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 34    {
 35        // 011.000 — Sueldo Básico (obligatorio, entra en wpara53)
 736        var rem1 = insumos.ObtenerRemuneracion(funcionario.GradoId, 11000)
 737            ?? throw new InvalidOperationException($"Sin remuneración para grado {funcionario.GradoId} cod 11000");
 738        AgregarItem(11000, rem1.Monto, insumos, acumuladores, resultado);
 739        var wpara53 = rem1.Monto;
 40
 41        // 042.022 — Compensación Suboficiales (subalternos usan 042.022, no 042.012)
 42        // Fuente FoxPro Calc_Hab.prg: código 15 = OG 042.022 para subalternos
 743        var rem6 = insumos.ObtenerRemuneracion(funcionario.GradoId, 42022);
 744        if (rem6 is not null)
 45        {
 646            AgregarItem(42022, rem6.Monto, insumos, acumuladores, resultado);
 647            wpara53 += rem6.Monto;
 48        }
 49
 50        // 041.003 — Permanencia en el Grado (entra en wpara53 per Calc_Hab.prg)
 751        var meses = CalcularMesesPermanencia(funcionario, insumos);
 752        var riesgoVuelo = funcionario.RiesgoVuelo.HasValue && funcionario.RiesgoVuelo.Value > 0;
 753        var permanencia = insumos.ObtenerPermanencia(funcionario.EscalafonId, funcionario.GradoId, meses, riesgoVuelo);
 754        if (permanencia is not null)
 55        {
 156            var montoPermanencia = permanencia.Porcentaje.HasValue
 157                ? rem1.Monto * permanencia.Porcentaje.Value
 158                : permanencia.MontoFijo ?? 0m;
 159            if (montoPermanencia > 0)
 60            {
 161                AgregarItem(41003, montoPermanencia, insumos, acumuladores, resultado);
 162                wpara53 += montoPermanencia;  // permanencia entra en base SDL/DI
 63            }
 64        }
 65
 66        // 069.008 — Viático en el País PS c/aportes: solo si CAT_VIAT > 0 (NO entra en wpara53)
 767        if (funcionario.CategoriaViatico > 0)
 68        {
 069            var rem5 = insumos.ObtenerRemuneracion(funcionario.GradoId, 69008);
 070            if (rem5 is not null)
 071                AgregarItem(69008, rem5.Monto, insumos, acumuladores, resultado);
 72        }
 73
 774        return wpara53;
 75    }
 76}