< Summary

Information
Class: FAU.Logica.Calculadores.ReservaCalculator
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Calculadores/ReservaCalculator.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 17
Coverable lines: 17
Total lines: 66
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 6
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
CalcularItemsBase(...)0%2040%
CalcularDedicacionIntegral(...)0%620%

File(s)

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

#LineLine coverage
 1using FAU.Entidades;
 2using FAU.Logica.DTOs;
 3
 4namespace FAU.Logica.Calculadores;
 5
 6/// <summary>
 7/// Calculador para Personal Subalterno Reservista (situación FoxPro 32).
 8/// Basado en SUM33108.PRG del sistema legado.
 9///
 10/// Diferencias respecto a Sit30Calculator:
 11/// - Sueldo base: OG 011.001 (11001) — el "sueldo reservista"
 12///   Antes de 2026 era OG 031.000; desde 2026 es 011.001 (confirmado DFC 2026-06-08).
 13/// - NO tiene Dedicación Integral (043.004).
 14/// - EN SU LUGAR tiene Permanencia a la Orden (042.014) = 30% de WPara10.
 15/// - SDL (048.012) se calcula sobre WPara53 (simplificado; en FoxPro es condicional por grado).
 16/// </summary>
 17public class ReservaCalculator : CalculadorHaberesBase
 18{
 19    // OG 011.001 — Sueldo Reservista (desde 2026; antes OG 031.000)
 20    private const int CodigoSueldoReservista = 11001;
 21
 22    protected override decimal CalcularItemsBase(
 23        RelacionLaboral funcionario, InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 24    {
 25        // 011.001 — Sueldo Reservista (obligatorio)
 026        var remBase = insumos.ObtenerRemuneracion(funcionario.GradoId, CodigoSueldoReservista);
 027        if (remBase is null)
 28        {
 029            resultado.Incidencias.Add(
 030                $"Sin remuneración reservista (OG 011.001) para grado {funcionario.GradoId}");
 031            resultado.Estado = EstadoCalculo.Revisar;
 032            return 0m;
 33        }
 34
 035        AgregarItem(CodigoSueldoReservista, remBase.Monto, insumos, acumuladores, resultado);
 036        var wpara53 = remBase.Monto;
 37
 38        // 042.022 — Compensación de Tropa (code 15 en FoxPro, condicional por grado)
 039        var remComp = insumos.ObtenerRemuneracion(funcionario.GradoId, 42022);
 040        if (remComp is not null)
 41        {
 042            AgregarItem(42022, remComp.Monto, insumos, acumuladores, resultado);
 043            wpara53 += remComp.Monto;
 44        }
 45
 46        // TODO: 042.019 Riesgo de Vuelo (si relacion_laboral.riesgo_vuelo = "S" y grado > 2)
 47        // TODO: 044.001 Progresivo Tropa (si años_servicio > 0)
 48        // TODO: 042.025 Prima Técnica Sgtos (si grado == SOM o Sgto.1ro)
 49
 050        return wpara53;
 51    }
 52
 53    /// <summary>
 54    /// Reservistas NO tienen DI (043.004).
 55    /// En su lugar tienen Permanencia a la Orden (042.014) = 30% de WPara10.
 56    /// Confirmado por SUM33108.PRG (code 60 = W_Para_10 × 30%).
 57    /// </summary>
 58    protected override void CalcularDedicacionIntegral(
 59        decimal wPara10, RelacionLaboral funcionario,
 60        InsumosPeriodo insumos, Acumuladores acumuladores, ResultadoCalculo resultado)
 61    {
 062        if (wPara10 <= 0) return;
 063        var pao = Math.Round(wPara10 * 0.30m, 2);
 064        AgregarItem(42014, pao, insumos, acumuladores, resultado);
 065    }
 66}