< Summary

Information
Class: FAU.Logica.Services.InsumosPeriodoLoader
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Services/InsumosPeriodoLoader.cs
Line coverage
90%
Covered lines: 131
Uncovered lines: 14
Coverable lines: 145
Total lines: 201
Line coverage: 90.3%
Branch coverage
38%
Covered branches: 7
Total branches: 18
Branch coverage: 38.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
CargarAsync()60%101097.19%

File(s)

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

#LineLine coverage
 1using FAU.DataAccess;
 2using FAU.Entidades;
 3using FAU.Logica.DTOs;
 4using Microsoft.EntityFrameworkCore;
 5
 6namespace FAU.Logica.Services;
 7
 8public class InsumosPeriodoLoader : IInsumosPeriodoLoader
 9{
 10    private readonly ApplicationDbContext _context;
 11
 112    public InsumosPeriodoLoader(ApplicationDbContext context)
 13    {
 114        _context = context;
 115    }
 16
 17    public async Task<InsumosPeriodo> CargarAsync(long periodoId)
 18    {
 119        var periodo = await _context.PeriodosLiquidacion
 120            .AsNoTracking()
 121            .FirstOrDefaultAsync(p => p.Id == periodoId && p.Activo);
 22
 123        if (periodo is null)
 24        {
 025            throw new InvalidOperationException($"Periodo de liquidación {periodoId} no encontrado o no está activo.");
 26        }
 27
 128        var periodoDate = new DateTime(periodo.Anio, periodo.Mes, 1);
 29
 130        var parametros = await _context.ParametrosPeriodo
 131            .AsNoTracking()
 132            .FirstOrDefaultAsync(pp => pp.Anio == periodo.Anio && pp.Mes == periodo.Mes);
 33
 134        if (parametros is null)
 35        {
 036            throw new InvalidOperationException($"Parámetros de período para {periodo.Anio}/{periodo.Mes} no encontrados
 37        }
 38
 139        var catalogoItems = await _context.CatalogoItems
 140            .AsNoTracking()
 141            .ToListAsync();
 42
 143        var remuneraciones = await _context.RemuneracionesGrado
 144            .AsNoTracking()
 145            .Include(r => r.Item)
 146            .Where(r => r.VigenteDesde <= periodoDate && (r.VigenteHasta == null || r.VigenteHasta >= periodoDate))
 147            .ToListAsync();
 48
 149        var permanencias = await _context.Set<TablaPermanencia>()
 150            .AsNoTracking()
 151            .Where(t => t.VigenteDesde <= periodoDate && (t.VigenteHasta == null || t.VigenteHasta >= periodoDate))
 152            .ToListAsync();
 53
 154        var franjasIrpf = await _context.FranjasIrpf
 155            .AsNoTracking()
 156            .Where(f => f.VigenteDesde <= periodoDate && (f.VigenteHasta == null || f.VigenteHasta >= periodoDate))
 157            .OrderBy(f => f.NumeroFranja)
 158            .ToListAsync();
 59
 160        var beneficios = await _context.BeneficiosSociales
 161            .AsNoTracking()
 162            .Where(b => b.Estado == "activo" && b.VigenteDesde <= periodoDate && (b.VigenteHasta == null || b.VigenteHas
 163            .ToListAsync();
 64
 165        var tiposBeneficio = await _context.TiposBeneficio
 166            .AsNoTracking()
 167            .ToDictionaryAsync(t => t.Id);
 68
 469        foreach (var b in beneficios)
 70        {
 171            if (tiposBeneficio.TryGetValue(b.TipoBeneficioId, out var tipo))
 072                b.TipoBeneficio = tipo;
 73        }
 74
 75        // Cargar hijos registrados para beneficios de tipo Asignación Familiar
 176        var idsAsigFamiliar = beneficios
 177            .Where(b => b.TipoBeneficio is not null &&
 178                        (b.TipoBeneficio.Codigo == "ASIGNACION_FAMILIAR" ||
 179                         b.TipoBeneficio.Codigo.StartsWith("300") ||
 180                         b.TipoBeneficio.Nombre.ToUpperInvariant().Contains("ASIGNACION FAMILIAR") ||
 181                         b.TipoBeneficio.Nombre.ToUpperInvariant().Contains("ASIGNACIÓN FAMILIAR")))
 082            .Select(b => b.Id)
 183            .ToHashSet();
 84
 185        var beneficiariosAsigFam = idsAsigFamiliar.Count > 0
 186            ? await _context.BeneficioSocialBeneficiarios
 187                .AsNoTracking()
 188                .Where(bh => idsAsigFamiliar.Contains(bh.BeneficioId) &&
 189                             bh.Activo &&
 190                             bh.VigenteDesde <= periodoDate &&
 191                             (bh.VigenteHasta == null || bh.VigenteHasta >= periodoDate))
 192                .ToListAsync()
 193            : [];
 94
 195        var beneficiariosPorBeneficio = beneficiariosAsigFam
 096            .GroupBy(bh => bh.BeneficioId)
 197            .ToDictionary(g => g.Key, g => (IReadOnlyList<BeneficioSocialBeneficiario>)g.ToList());
 98
 199        var compensaciones = await _context.ItemsLoteCompensacion
 1100            .AsNoTracking()
 1101            .Include(i => i.LoteCompensacion)
 1102            .Where(i => i.LoteCompensacion.Estado == "aprobado"
 1103                        && i.LoteCompensacion.Periodo.Year == periodo.Anio
 1104                        && i.LoteCompensacion.Periodo.Month == periodo.Mes)
 1105            .ToListAsync();
 106
 1107        var novedadesConfirmadas = await _context.NovedadesPeriodo
 1108            .AsNoTracking()
 1109            .Where(n => n.PeriodoId == periodoId && n.Estado == "confirmada")
 1110            .ToListAsync();
 111
 1112        var remuneracionesPorGrado = remuneraciones
 1113            .GroupBy(r => r.GradoId)
 1114            .ToDictionary(
 1115                g => g.Key,
 2116                g => (IReadOnlyDictionary<int, RemuneracionGrado>)g
 1117                    .GroupBy(r => r.Item.Codigo)
 2118                    .ToDictionary(
 1119                        gg => gg.Key,
 4120                        gg => gg.OrderByDescending(r => r.VigenteDesde).First()));
 121
 1122        var permanenciasPorEscalafon = permanencias
 1123            .GroupBy(t => t.EscalafonId)
 4124            .ToDictionary(g => g.Key, g => (IReadOnlyList<TablaPermanencia>)g.OrderBy(t => t.AniosDesde).ToList());
 125
 1126        var beneficiosPorPersona = beneficios
 1127            .GroupBy(b => b.PersonaId)
 3128            .ToDictionary(g => g.Key, g => (IReadOnlyList<BeneficioSocial>)g.ToList());
 129
 1130        var compensacionesPorPersona = compensaciones
 1131            .GroupBy(i => i.PersonaId)
 3132            .ToDictionary(g => g.Key, g => (IReadOnlyList<ItemLoteCompensacion>)g.ToList());
 133
 1134        var novedadesPorPersona = novedadesConfirmadas
 3135            .ToDictionary(n => n.PersonaId, n => (NovedadPeriodo?)n);
 136
 137        // Instructivo Asignación Familiar: fila más reciente por tipo_franja
 1138        var instructivoAsigFamiliarRaw = await _context.InstructivosAsigFamiliar
 1139            .AsNoTracking()
 1140            .Where(i => i.VigenteDesde <= periodoDate)
 1141            .ToListAsync();
 142
 1143        var instructivoAsigFamiliar = instructivoAsigFamiliarRaw
 0144            .GroupBy(i => i.TipoFranja)
 1145            .ToDictionary(
 0146                g => g.Key,
 1147                g => g.OrderByDescending(i => i.VigenteDesde).First());
 148
 149        // Instructivo PSF: fila más reciente por numero_categoria
 1150        var instructivoPsfRaw = await _context.InstructivosPsf
 1151            .AsNoTracking()
 1152            .Where(i => i.VigenteDesde <= periodoDate)
 1153            .ToListAsync();
 154
 1155        var instructivoPsf = instructivoPsfRaw
 0156            .GroupBy(i => (int)i.NumeroCategoria)
 1157            .ToDictionary(
 0158                g => g.Key,
 1159                g => g.OrderByDescending(i => i.VigenteDesde).First());
 160
 161        // Tabla Hogar: tramos vigentes, ordenados ASC con NULL al final
 1162        var tablaPorHogarRaw = await _context.TablasHogarConstituido
 1163            .AsNoTracking()
 1164            .Where(t => t.VigenteDesde <= periodoDate)
 1165            .ToListAsync();
 166
 1167        var tablaPorHogar = tablaPorHogarRaw
 0168            .GroupBy(t => t.HastaHaberes)
 0169            .Select(g => g.OrderByDescending(t => t.VigenteDesde).First())
 0170            .OrderBy(t => t.HastaHaberes.HasValue ? 0 : 1)
 0171            .ThenBy(t => t.HastaHaberes ?? decimal.MaxValue)
 1172            .ToList();
 173
 1174        var aguinaldos = await _context.Set<Aguinaldo>()
 1175            .AsNoTracking()
 1176            .Where(a => a.Anio == periodo.Anio)
 1177            .ToListAsync();
 178
 1179        var aguinaldosPorPersona = aguinaldos
 0180            .GroupBy(a => a.PersonaId)
 1181            .ToDictionary(g => g.Key, g => (IReadOnlyList<Aguinaldo>)g.ToList());
 182
 1183        return new InsumosPeriodo
 1184        {
 1185            PeriodoId = periodoId,
 1186            ParametroPeriodo = parametros,
 1187            CatalogoItems = catalogoItems,
 1188            RemuneracionesPorGrado = remuneracionesPorGrado,
 1189            PermanenciasPorEscalafon = permanenciasPorEscalafon,
 1190            FranjasIrpf = franjasIrpf,
 1191            BeneficiosPorPersona = beneficiosPorPersona,
 1192            CompensacionesPorPersona = compensacionesPorPersona,
 1193            NovedadesPorPersona = novedadesPorPersona,
 1194            BeneficiariosPorBeneficio = beneficiariosPorBeneficio,
 1195            InstructivoAsigFamiliar = instructivoAsigFamiliar,
 1196            InstructivoPsf = instructivoPsf,
 1197            TablaPorHogar = tablaPorHogar,
 1198            AguinaldosPorPersona = aguinaldosPorPersona
 1199        };
 1200    }
 201}