< Summary

Information
Class: FAU.Logica.Services.CalcularDiferencia615Service
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/CalcularDiferencia615Service.cs
Line coverage
95%
Covered lines: 38
Uncovered lines: 2
Coverable lines: 40
Total lines: 90
Line coverage: 95%
Branch coverage
81%
Covered branches: 26
Total branches: 32
Branch coverage: 81.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
CalcularAsync(...)81.25%323294.28%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/CalcularDiferencia615Service.cs

#LineLine coverage
 1namespace FAU.Logica.Services;
 2
 3public class CalcularDiferencia615Service : ICalcularDiferencia615Service
 4{
 15    private static readonly DateTime FechaMinAscenso = new DateTime(2018, 1, 1);
 6
 7    // Catalog codes that accumulate into Σhaberes for Cbo.2da case
 18    private static readonly HashSet<int> CodigosHaberesCbo = new() { 30, 37, 58, 15, 165, 40, 170, 172, 225, 38, 39, 41,
 9    // Catalog codes that accumulate into Σhaberes for Sgto case (adds 33)
 110    private static readonly HashSet<int> CodigosHaberesSgto = new() { 30, 33, 37, 58, 15, 165, 170, 40, 172, 225, 38, 39
 11    // Codes handled separately with /0.835 divisor
 12    // 299 = 043.003 (Comp. DI Oficial/Subalterno), 43002 = 043.002 (Complemento DI),
 13    // 230 = 045.002, 315 = 043.003 Subalterno
 114    private static readonly int[] CodigosSeparados = { 299, 43002, 230, 315 };
 15    // Additional codes only for Cbo.2da
 116    private static readonly int[] CodigosSeparadosCboExtra = { 280, 276, 308 };
 17    // Code for 041.003 (permanencia) — deducted in "con permanencia" sub-case
 18    private const int CodigoPermanencia = 40;
 19
 20    public Task<decimal?> CalcularAsync(
 21        long personaId,
 22        long gradoNuevoId,
 23        string gradoNuevoCodigo,
 24        DateTime fechaUltimoAscenso,
 25        DateTime fechaPeriodo,
 26        IReadOnlyList<LiquidacionItemAnterior> itemsPeriodoActual,
 27        IReadOnlyList<LiquidacionItemAnterior> itemsPeriodoAnterior)
 28    {
 29        // Filter: only ascensos from 01/01/2018
 730        if (fechaUltimoAscenso < FechaMinAscenso)
 131            return Task.FromResult<decimal?>(null);
 32
 633        var diasDesdeAscenso = (int)(fechaPeriodo - fechaUltimoAscenso).TotalDays;
 634        bool esCbo2da = gradoNuevoCodigo == "CBO_2DA";
 635        bool esSgto = gradoNuevoCodigo == "SGTO";
 36
 637        if (!esCbo2da && !esSgto)
 138            return Task.FromResult<decimal?>(null);
 39
 40        // Sub-case determination
 41        bool tienePermanencia;
 542        if (esCbo2da)
 43        {
 644            if (diasDesdeAscenso < 365) tienePermanencia = false;
 345            else if (diasDesdeAscenso < 730) tienePermanencia = true;
 146            else return Task.FromResult<decimal?>(null); // out of range
 47        }
 48        else // esSgto
 49        {
 250            if (diasDesdeAscenso < 730) tienePermanencia = false;
 051            else if (diasDesdeAscenso < 1095) tienePermanencia = true;
 052            else return Task.FromResult<decimal?>(null);
 53        }
 54
 455        var codigosHaberes = esCbo2da ? CodigosHaberesCbo : CodigosHaberesSgto;
 56
 57        // Σhaberes: sum of normal codes (viejo - nuevo)
 458        decimal sumHaberesViejo = itemsPeriodoAnterior
 759            .Where(i => codigosHaberes.Contains(i.CodigoConcepto))
 1160            .Sum(i => i.Importe);
 461        decimal sumHaberesNuevo = itemsPeriodoActual
 762            .Where(i => codigosHaberes.Contains(i.CodigoConcepto))
 1163            .Sum(i => i.Importe);
 464        decimal diferencia = sumHaberesViejo - sumHaberesNuevo;
 65
 66        // Codes separated with /0.835
 467        var todosCodsSep = esCbo2da
 468            ? CodigosSeparados.Concat(CodigosSeparadosCboExtra)
 469            : CodigosSeparados;
 70
 5871        foreach (var cod in todosCodsSep)
 72        {
 6873            var viejo = itemsPeriodoAnterior.FirstOrDefault(i => i.CodigoConcepto == cod)?.Importe ?? 0m;
 6874            var nuevo = itemsPeriodoActual.FirstOrDefault(i => i.CodigoConcepto == cod)?.Importe ?? 0m;
 2575            diferencia += (viejo - nuevo) / 0.835m;
 76        }
 77
 78        // Permanencia deduction
 479        if (tienePermanencia)
 80        {
 181            var permNuevo = itemsPeriodoActual
 382                .FirstOrDefault(i => i.CodigoConcepto == CodigoPermanencia)?.Importe ?? 0m;
 183            diferencia -= permNuevo;
 84        }
 85
 486        diferencia = Math.Round(diferencia, 2);
 87
 488        return Task.FromResult(diferencia > 0 ? (decimal?)diferencia : null);
 89    }
 90}