| | | 1 | | using FAU.DataAccess; |
| | | 2 | | using FAU.Entidades; |
| | | 3 | | using FAU.Logica.DTOs; |
| | | 4 | | using Microsoft.EntityFrameworkCore; |
| | | 5 | | |
| | | 6 | | namespace FAU.Logica.Services; |
| | | 7 | | |
| | | 8 | | public class InsumosPeriodoLoader : IInsumosPeriodoLoader |
| | | 9 | | { |
| | | 10 | | private readonly ApplicationDbContext _context; |
| | | 11 | | |
| | 1 | 12 | | public InsumosPeriodoLoader(ApplicationDbContext context) |
| | | 13 | | { |
| | 1 | 14 | | _context = context; |
| | 1 | 15 | | } |
| | | 16 | | |
| | | 17 | | public async Task<InsumosPeriodo> CargarAsync(long periodoId) |
| | | 18 | | { |
| | 1 | 19 | | var periodo = await _context.PeriodosLiquidacion |
| | 1 | 20 | | .AsNoTracking() |
| | 1 | 21 | | .FirstOrDefaultAsync(p => p.Id == periodoId && p.Activo); |
| | | 22 | | |
| | 1 | 23 | | if (periodo is null) |
| | | 24 | | { |
| | 0 | 25 | | throw new InvalidOperationException($"Periodo de liquidación {periodoId} no encontrado o no está activo."); |
| | | 26 | | } |
| | | 27 | | |
| | 1 | 28 | | var periodoDate = new DateTime(periodo.Anio, periodo.Mes, 1); |
| | | 29 | | |
| | 1 | 30 | | var parametros = await _context.ParametrosPeriodo |
| | 1 | 31 | | .AsNoTracking() |
| | 1 | 32 | | .FirstOrDefaultAsync(pp => pp.Anio == periodo.Anio && pp.Mes == periodo.Mes); |
| | | 33 | | |
| | 1 | 34 | | if (parametros is null) |
| | | 35 | | { |
| | 0 | 36 | | throw new InvalidOperationException($"Parámetros de período para {periodo.Anio}/{periodo.Mes} no encontrados |
| | | 37 | | } |
| | | 38 | | |
| | 1 | 39 | | var catalogoItems = await _context.CatalogoItems |
| | 1 | 40 | | .AsNoTracking() |
| | 1 | 41 | | .ToListAsync(); |
| | | 42 | | |
| | 1 | 43 | | var remuneraciones = await _context.RemuneracionesGrado |
| | 1 | 44 | | .AsNoTracking() |
| | 1 | 45 | | .Include(r => r.Item) |
| | 1 | 46 | | .Where(r => r.VigenteDesde <= periodoDate && (r.VigenteHasta == null || r.VigenteHasta >= periodoDate)) |
| | 1 | 47 | | .ToListAsync(); |
| | | 48 | | |
| | 1 | 49 | | var permanencias = await _context.Set<TablaPermanencia>() |
| | 1 | 50 | | .AsNoTracking() |
| | 1 | 51 | | .Where(t => t.VigenteDesde <= periodoDate && (t.VigenteHasta == null || t.VigenteHasta >= periodoDate)) |
| | 1 | 52 | | .ToListAsync(); |
| | | 53 | | |
| | 1 | 54 | | var franjasIrpf = await _context.FranjasIrpf |
| | 1 | 55 | | .AsNoTracking() |
| | 1 | 56 | | .Where(f => f.VigenteDesde <= periodoDate && (f.VigenteHasta == null || f.VigenteHasta >= periodoDate)) |
| | 1 | 57 | | .OrderBy(f => f.NumeroFranja) |
| | 1 | 58 | | .ToListAsync(); |
| | | 59 | | |
| | 1 | 60 | | var beneficios = await _context.BeneficiosSociales |
| | 1 | 61 | | .AsNoTracking() |
| | 1 | 62 | | .Where(b => b.Estado == "activo" && b.VigenteDesde <= periodoDate && (b.VigenteHasta == null || b.VigenteHas |
| | 1 | 63 | | .ToListAsync(); |
| | | 64 | | |
| | 1 | 65 | | var compensaciones = await _context.ItemsLoteCompensacion |
| | 1 | 66 | | .AsNoTracking() |
| | 1 | 67 | | .Include(i => i.LoteCompensacion) |
| | 1 | 68 | | .Where(i => i.LoteCompensacion.Estado == "aprobado" |
| | 1 | 69 | | && i.LoteCompensacion.Periodo.Year == periodo.Anio |
| | 1 | 70 | | && i.LoteCompensacion.Periodo.Month == periodo.Mes) |
| | 1 | 71 | | .ToListAsync(); |
| | | 72 | | |
| | 1 | 73 | | var novedadesConfirmadas = await _context.NovedadesPeriodo |
| | 1 | 74 | | .AsNoTracking() |
| | 1 | 75 | | .Where(n => n.PeriodoId == periodoId && n.Estado == "confirmado") |
| | 1 | 76 | | .ToListAsync(); |
| | | 77 | | |
| | 1 | 78 | | var remuneracionesPorGrado = remuneraciones |
| | 1 | 79 | | .GroupBy(r => r.GradoId) |
| | 1 | 80 | | .ToDictionary( |
| | 1 | 81 | | g => g.Key, |
| | 2 | 82 | | g => (IReadOnlyDictionary<int, RemuneracionGrado>)g |
| | 4 | 83 | | .ToDictionary(r => r.Item.Codigo, r => r)); |
| | | 84 | | |
| | 1 | 85 | | var permanenciasPorEscalafon = permanencias |
| | 1 | 86 | | .GroupBy(t => t.EscalafonId) |
| | 4 | 87 | | .ToDictionary(g => g.Key, g => (IReadOnlyList<TablaPermanencia>)g.OrderBy(t => t.AniosDesde).ToList()); |
| | | 88 | | |
| | 1 | 89 | | var beneficiosPorPersona = beneficios |
| | 1 | 90 | | .GroupBy(b => b.PersonaId) |
| | 3 | 91 | | .ToDictionary(g => g.Key, g => (IReadOnlyList<BeneficioSocial>)g.ToList()); |
| | | 92 | | |
| | 1 | 93 | | var compensacionesPorPersona = compensaciones |
| | 1 | 94 | | .GroupBy(i => i.PersonaId) |
| | 3 | 95 | | .ToDictionary(g => g.Key, g => (IReadOnlyList<ItemLoteCompensacion>)g.ToList()); |
| | | 96 | | |
| | 1 | 97 | | var novedadesPorPersona = novedadesConfirmadas |
| | 3 | 98 | | .ToDictionary(n => n.PersonaId, n => (NovedadPeriodo?)n); |
| | | 99 | | |
| | 1 | 100 | | return new InsumosPeriodo |
| | 1 | 101 | | { |
| | 1 | 102 | | PeriodoId = periodoId, |
| | 1 | 103 | | ParametroPeriodo = parametros, |
| | 1 | 104 | | CatalogoItems = catalogoItems, |
| | 1 | 105 | | RemuneracionesPorGrado = remuneracionesPorGrado, |
| | 1 | 106 | | PermanenciasPorEscalafon = permanenciasPorEscalafon, |
| | 1 | 107 | | FranjasIrpf = franjasIrpf, |
| | 1 | 108 | | BeneficiosPorPersona = beneficiosPorPersona, |
| | 1 | 109 | | CompensacionesPorPersona = compensacionesPorPersona, |
| | 1 | 110 | | NovedadesPorPersona = novedadesPorPersona |
| | 1 | 111 | | }; |
| | 1 | 112 | | } |
| | | 113 | | } |