< 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
87%
Covered lines: 62
Uncovered lines: 9
Coverable lines: 71
Total lines: 185
Line coverage: 87.3%
Branch coverage
66%
Covered branches: 28
Total branches: 42
Branch coverage: 66.6%
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{
 677    public long PeriodoId { get; init; }
 9288    public ParametroPeriodo ParametroPeriodo { get; init; } = null!;
 19929    public IReadOnlyDictionary<long, IReadOnlyDictionary<int, RemuneracionGrado>> RemuneracionesPorGrado { get; init; } 
 22110    public IReadOnlyDictionary<long, IReadOnlyList<TablaPermanencia>> PermanenciasPorEscalafon { get; init; } = new Dict
 20911    public IReadOnlyList<FranjaIrpf> FranjasIrpf { get; init; } = Array.Empty<FranjaIrpf>();
 12    // Tramos de Sanidad Militar (Art. 94 Ley 18.834), ordenados por Desde ASC
 17513    public IReadOnlyList<TramoSanidadMilitar> TramosSanidad { get; init; } = Array.Empty<TramoSanidadMilitar>();
 56814    public IReadOnlyList<CatalogoItem> CatalogoItems { get; init; } = Array.Empty<CatalogoItem>();
 16115    public IReadOnlyDictionary<long, IReadOnlyList<BeneficioSocial>> BeneficiosPorPersona { get; init; } = new Dictionar
 16016    public IReadOnlyDictionary<long, IReadOnlyList<ItemLoteCompensacion>> CompensacionesPorPersona { get; init; } = new 
 17817    public IReadOnlyDictionary<long, IReadOnlyList<NovedadPeriodo>> NovedadesPorPersona { get; init; } = new Dictionary<
 18    // beneficioId → hijos registrados (para ASIGNACION_FAMILIAR)
 16019    public IReadOnlyDictionary<long, IReadOnlyList<BeneficioSocialBeneficiario>> BeneficiariosPorBeneficio { get; init; 
 20
 21    // Instructivos DFC — tipoFranja → registro vigente
 16022    public IReadOnlyDictionary<string, InstructivoAsigFamiliar> InstructivoAsigFamiliar { get; init; } = new Dictionary<
 23    // Instructivos DFC — numCategoria → registro vigente
 16024    public IReadOnlyDictionary<int, InstructivoPsf> InstructivoPsf { get; init; } = new Dictionary<int, InstructivoPsf>(
 25    // Tabla hogar constituido — tramos ordenados (hasta_haberes ASC, NULL al final)
 16026    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)
 12529    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
 15932    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
 26236    public IReadOnlyDictionary<long, short> OrdenPorGrado { get; init; } = new Dictionary<long, short>();
 37
 38    // Descuentos personales aprobados por persona (COFAnS, retenciones y otros).
 11739    public IReadOnlyDictionary<long, IReadOnlyList<DescuentoPersonalPeriodo>> DescuentosPersonalesPorPersona { get; init
 40
 7741    public IReadOnlyDictionary<long, IReadOnlyList<FictoPersona>> FictosPorPersona { get; init; } =
 10142        new Dictionary<long, IReadOnlyList<FictoPersona>>();
 43
 44    // Tarifas por categoría (no por grado) — ej. Prima Técnica A/B/C, ASID_VUELO, SAR.
 45    // key externa = categoría (p.ej. "A"), key interna = código de catalogo_items.
 6746    public IReadOnlyDictionary<string, IReadOnlyDictionary<int, TarifaPorCategoria>> TarifasPorCategoria { get; init; } 
 10147        new Dictionary<string, IReadOnlyDictionary<int, TarifaPorCategoria>>();
 48
 49    // 048.018 — Compensación Personal: importe individual por persona, vigente al período.
 12450    public IReadOnlyDictionary<long, CompPersonal048018> CompPersonal048018PorPersona { get; init; } =
 10151        new Dictionary<long, CompPersonal048018>();
 52
 53    public RemuneracionGrado? ObtenerRemuneracion(long gradoId, int codigoItem)
 54    {
 182955        if (RemuneracionesPorGrado.TryGetValue(gradoId, out var items) && items.TryGetValue(codigoItem, out var remunera
 56        {
 18857            return remuneracion;
 58        }
 59
 164160        return null;
 61    }
 62
 63    public TarifaPorCategoria? ObtenerTarifaCategoria(string categoria, int codigoItem)
 64    {
 665        if (TarifasPorCategoria.TryGetValue(categoria, out var items) && items.TryGetValue(codigoItem, out var tarifa))
 66        {
 567            return tarifa;
 68        }
 69
 170        return null;
 71    }
 72
 73    public CompPersonal048018? ObtenerCompPersonal048018(long personaId)
 74    {
 6375        return CompPersonal048018PorPersona.TryGetValue(personaId, out var comp) ? comp : null;
 76    }
 77
 78    /// <summary>
 79    /// Retorna la tasa mínima registrada para un ítem entre todos los grados.
 80    /// Usado para obtener la tasa de subalterno del progresivo (044.001 = $114.01/año)
 81    /// cuando hay que calcular el tramo de tropa previo al ascenso a oficial.
 82    /// La tasa mínima corresponde siempre a los grados de tropa/subalterno.
 83    /// </summary>
 84    public decimal ObtenerTasaMinimaProgresivo(int codigoItem)
 85    {
 086        var minRate = 0m;
 087        foreach (var gradoItems in RemuneracionesPorGrado.Values)
 88        {
 089            if (gradoItems.TryGetValue(codigoItem, out var rem) && rem.Monto > 0)
 90            {
 091                if (minRate == 0m || rem.Monto < minRate)
 092                    minRate = rem.Monto;
 93            }
 94        }
 095        return minRate;
 96    }
 97
 98    public TablaPermanencia? ObtenerPermanencia(long escalafonId, long gradoId, int mesesServicio, bool riesgoVuelo)
 99    {
 59100        if (PermanenciasPorEscalafon.TryGetValue(escalafonId, out var filas))
 101        {
 102            // Lógica legacy (SUM33106.PRG / CALC_HAB.PRG):
 103            // Recorre los tramos mientras tiempo_pm (MesesHasta) <= meses del funcionario
 104            // y conserva el último que cumplió la condición (monto creciente por antigüedad).
 3105            return filas
 3106                .Where(p => p.GradoId == gradoId)
 3107                .Where(p => p.AplicaRiesgoVuelo == riesgoVuelo)
 3108                .Where(p => p.MesesHasta <= mesesServicio)
 3109                .OrderByDescending(p => p.MesesHasta)
 3110                .FirstOrDefault();
 111        }
 112
 56113        return null;
 114    }
 115
 116    /// <summary>
 117    /// Retorna el tramo de Sanidad Militar cuyo rango [Desde, Hasta] contiene la base imponible.
 118    /// Hasta == null representa el último tramo (sin tope superior).
 119    /// </summary>
 120    public TramoSanidadMilitar? ObtenerTramoSanidad(decimal baseImponible)
 121    {
 50122        return TramosSanidad.FirstOrDefault(t =>
 64123            baseImponible >= t.Desde && (t.Hasta is null || baseImponible <= t.Hasta));
 124    }
 125
 126    public IReadOnlyList<BeneficioSocial> ObtenerBeneficios(long personaId)
 127    {
 44128        return BeneficiosPorPersona.TryGetValue(personaId, out var beneficios)
 44129            ? beneficios
 44130            : Array.Empty<BeneficioSocial>();
 131    }
 132
 133    public IReadOnlyList<ItemLoteCompensacion> ObtenerCompensaciones(long personaId)
 134    {
 43135        return CompensacionesPorPersona.TryGetValue(personaId, out var items)
 43136            ? items
 43137            : Array.Empty<ItemLoteCompensacion>();
 138    }
 139
 140    public NovedadPeriodo? ObtenerNovedad(long personaId)
 141    {
 1142        return NovedadesPorPersona.TryGetValue(personaId, out var novedades)
 1143            ? novedades.FirstOrDefault()
 1144            : null;
 145    }
 146
 147    /// <summary>
 148    /// Retorna la novedad de tipo 'dias_eximidos' para el prorrateo salarial.
 149    /// 'subsidio_enfermedad' no reduce el sueldo base — tiene su propio cálculo (pendiente).
 150    /// </summary>
 151    public NovedadPeriodo? ObtenerNovedadEximidos(long personaId)
 152    {
 18153        if (!NovedadesPorPersona.TryGetValue(personaId, out var novedades))
 15154            return null;
 6155        return novedades.FirstOrDefault(n => n.Tipo == "dias_eximidos");
 156    }
 157
 158    public IReadOnlyList<NovedadPeriodo> ObtenerNovedades(long personaId)
 159    {
 42160        return NovedadesPorPersona.TryGetValue(personaId, out var novedades)
 42161            ? novedades
 42162            : Array.Empty<NovedadPeriodo>();
 163    }
 164
 165    public CompensacionDiferenciaAscenso? ObtenerDiferenciaAscenso(long personaId)
 166    {
 42167        return CompensacionesDiferenciaAscensoPorPersona.TryGetValue(personaId, out var diff)
 42168            ? diff
 42169            : null;
 170    }
 171
 172    public IReadOnlyList<DescuentoPersonalPeriodo> ObtenerDescuentosPersonales(long personaId)
 173    {
 0174        return DescuentosPersonalesPorPersona.TryGetValue(personaId, out var descuentos)
 0175            ? descuentos
 0176            : Array.Empty<DescuentoPersonalPeriodo>();
 177    }
 178
 179    public IReadOnlyList<FictoPersona> ObtenerFictos(long personaId)
 180    {
 44181        return FictosPorPersona.TryGetValue(personaId, out var fictos)
 44182            ? fictos
 44183            : Array.Empty<FictoPersona>();
 184    }
 185}