< Summary

Information
Class: FAU.Logica.DTOs.InsumosPeriodo
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/DTOs/InsumosPeriodo.cs
Line coverage
84%
Covered lines: 49
Uncovered lines: 9
Coverable lines: 58
Total lines: 151
Line coverage: 84.4%
Branch coverage
58%
Covered branches: 20
Total branches: 34
Branch coverage: 58.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/DTOs/InsumosPeriodo.cs

#LineLine coverage
 1using FAU.Entidades;
 2
 3namespace FAU.Logica.DTOs;
 4
 5public sealed class InsumosPeriodo
 6{
 597    public long PeriodoId { get; init; }
 6998    public ParametroPeriodo ParametroPeriodo { get; init; } = null!;
 17359    public IReadOnlyDictionary<long, IReadOnlyDictionary<int, RemuneracionGrado>> RemuneracionesPorGrado { get; init; } 
 19010    public IReadOnlyDictionary<long, IReadOnlyList<TablaPermanencia>> PermanenciasPorEscalafon { get; init; } = new Dict
 18411    public IReadOnlyList<FranjaIrpf> FranjasIrpf { get; init; } = Array.Empty<FranjaIrpf>();
 12    // Tramos de Sanidad Militar (Art. 94 Ley 18.834), ordenados por Desde ASC
 15613    public IReadOnlyList<TramoSanidadMilitar> TramosSanidad { get; init; } = Array.Empty<TramoSanidadMilitar>();
 49714    public IReadOnlyList<CatalogoItem> CatalogoItems { get; init; } = Array.Empty<CatalogoItem>();
 14315    public IReadOnlyDictionary<long, IReadOnlyList<BeneficioSocial>> BeneficiosPorPersona { get; init; } = new Dictionar
 14216    public IReadOnlyDictionary<long, IReadOnlyList<ItemLoteCompensacion>> CompensacionesPorPersona { get; init; } = new 
 15917    public IReadOnlyDictionary<long, IReadOnlyList<NovedadPeriodo>> NovedadesPorPersona { get; init; } = new Dictionary<
 18    // beneficioId → hijos registrados (para ASIGNACION_FAMILIAR)
 14219    public IReadOnlyDictionary<long, IReadOnlyList<BeneficioSocialBeneficiario>> BeneficiariosPorBeneficio { get; init; 
 20
 21    // Instructivos DFC — tipoFranja → registro vigente
 14222    public IReadOnlyDictionary<string, InstructivoAsigFamiliar> InstructivoAsigFamiliar { get; init; } = new Dictionary<
 23    // Instructivos DFC — numCategoria → registro vigente
 14224    public IReadOnlyDictionary<int, InstructivoPsf> InstructivoPsf { get; init; } = new Dictionary<int, InstructivoPsf>(
 25    // Tabla hogar constituido — tramos ordenados (hasta_haberes ASC, NULL al final)
 14226    public IReadOnlyList<TablaHogarConstituido> TablaPorHogar { get; init; } = Array.Empty<TablaHogarConstituido>();
 27
 28    // Aguinaldos (SAC) del año por persona — usado por AguinaldoCalculator (SIT14/15/18/20)
 11229    public IReadOnlyDictionary<long, IReadOnlyList<Aguinaldo>> AguinaldosPorPersona { get; init; } = new Dictionary<long
 30
 31    // Diferencias de haberes por ascenso (OG 042.615) — cargado desde compensaciones_diferencia_ascenso
 14132    public IReadOnlyDictionary<long, CompensacionDiferenciaAscenso> CompensacionesDiferenciaAscensoPorPersona { get; ini
 33
 34    // Orden de cada grado (para determinar porcentaje DI: clases 35% vs alistados 30%)
 35    // Cargado desde la tabla grados; key = grado_id, value = grado.orden
 13936    public IReadOnlyDictionary<long, short> OrdenPorGrado { get; init; } = new Dictionary<long, short>();
 37
 38    // Descuentos personales aprobados por persona (COFAnS, retención, comedor)
 10439    public IReadOnlyDictionary<long, IReadOnlyList<DescuentoPersonalPeriodo>> DescuentosPersonalesPorPersona { get; init
 40
 41    public RemuneracionGrado? ObtenerRemuneracion(long gradoId, int codigoItem)
 42    {
 159343        if (RemuneracionesPorGrado.TryGetValue(gradoId, out var items) && items.TryGetValue(codigoItem, out var remunera
 44        {
 17345            return remuneracion;
 46        }
 47
 142048        return null;
 49    }
 50
 51    /// <summary>
 52    /// Retorna la tasa mínima registrada para un ítem entre todos los grados.
 53    /// Usado para obtener la tasa de subalterno del progresivo (044.001 = $114.01/año)
 54    /// cuando hay que calcular el tramo de tropa previo al ascenso a oficial.
 55    /// La tasa mínima corresponde siempre a los grados de tropa/subalterno.
 56    /// </summary>
 57    public decimal ObtenerTasaMinimaProgresivo(int codigoItem)
 58    {
 059        var minRate = 0m;
 060        foreach (var gradoItems in RemuneracionesPorGrado.Values)
 61        {
 062            if (gradoItems.TryGetValue(codigoItem, out var rem) && rem.Monto > 0)
 63            {
 064                if (minRate == 0m || rem.Monto < minRate)
 065                    minRate = rem.Monto;
 66            }
 67        }
 068        return minRate;
 69    }
 70
 71    public TablaPermanencia? ObtenerPermanencia(long escalafonId, long gradoId, int mesesServicio, bool riesgoVuelo)
 72    {
 4973        if (PermanenciasPorEscalafon.TryGetValue(escalafonId, out var filas))
 74        {
 75            // Lógica legacy (SUM33106.PRG / CALC_HAB.PRG):
 76            // Recorre los tramos mientras tiempo_pm (MesesHasta) <= meses del funcionario
 77            // y conserva el último que cumplió la condición (monto creciente por antigüedad).
 478            return filas
 479                .Where(p => p.GradoId == gradoId)
 480                .Where(p => p.AplicaRiesgoVuelo == riesgoVuelo)
 481                .Where(p => p.MesesHasta <= mesesServicio)
 482                .OrderByDescending(p => p.MesesHasta)
 483                .FirstOrDefault();
 84        }
 85
 4586        return null;
 87    }
 88
 89    /// <summary>
 90    /// Retorna el tramo de Sanidad Militar cuyo rango [Desde, Hasta] contiene la base imponible.
 91    /// Hasta == null representa el último tramo (sin tope superior).
 92    /// </summary>
 93    public TramoSanidadMilitar? ObtenerTramoSanidad(decimal baseImponible)
 94    {
 4595        return TramosSanidad.FirstOrDefault(t =>
 5896            baseImponible >= t.Desde && (t.Hasta is null || baseImponible <= t.Hasta));
 97    }
 98
 99    public IReadOnlyList<BeneficioSocial> ObtenerBeneficios(long personaId)
 100    {
 39101        return BeneficiosPorPersona.TryGetValue(personaId, out var beneficios)
 39102            ? beneficios
 39103            : Array.Empty<BeneficioSocial>();
 104    }
 105
 106    public IReadOnlyList<ItemLoteCompensacion> ObtenerCompensaciones(long personaId)
 107    {
 38108        return CompensacionesPorPersona.TryGetValue(personaId, out var items)
 38109            ? items
 38110            : Array.Empty<ItemLoteCompensacion>();
 111    }
 112
 113    public NovedadPeriodo? ObtenerNovedad(long personaId)
 114    {
 1115        return NovedadesPorPersona.TryGetValue(personaId, out var novedades)
 1116            ? novedades.FirstOrDefault()
 1117            : null;
 118    }
 119
 120    /// <summary>
 121    /// Retorna la novedad de tipo 'dias_eximidos' para el prorrateo salarial.
 122    /// 'subsidio_enfermedad' no reduce el sueldo base — tiene su propio cálculo (pendiente).
 123    /// </summary>
 124    public NovedadPeriodo? ObtenerNovedadEximidos(long personaId)
 125    {
 17126        if (!NovedadesPorPersona.TryGetValue(personaId, out var novedades))
 14127            return null;
 6128        return novedades.FirstOrDefault(n => n.Tipo == "dias_eximidos");
 129    }
 130
 131    public IReadOnlyList<NovedadPeriodo> ObtenerNovedades(long personaId)
 132    {
 37133        return NovedadesPorPersona.TryGetValue(personaId, out var novedades)
 37134            ? novedades
 37135            : Array.Empty<NovedadPeriodo>();
 136    }
 137
 138    public CompensacionDiferenciaAscenso? ObtenerDiferenciaAscenso(long personaId)
 139    {
 37140        return CompensacionesDiferenciaAscensoPorPersona.TryGetValue(personaId, out var diff)
 37141            ? diff
 37142            : null;
 143    }
 144
 145    public IReadOnlyList<DescuentoPersonalPeriodo> ObtenerDescuentosPersonales(long personaId)
 146    {
 0147        return DescuentosPersonalesPorPersona.TryGetValue(personaId, out var descuentos)
 0148            ? descuentos
 0149            : Array.Empty<DescuentoPersonalPeriodo>();
 150    }
 151}