| | | 1 | | using FAU.Entidades; |
| | | 2 | | using Microsoft.EntityFrameworkCore; |
| | | 3 | | |
| | | 4 | | namespace FAU.DataAccess.Repositories; |
| | | 5 | | |
| | | 6 | | public class ArchivoOrganismoRepository : IArchivoOrganismoRepository |
| | | 7 | | { |
| | | 8 | | private readonly ApplicationDbContext _context; |
| | | 9 | | |
| | 0 | 10 | | public ArchivoOrganismoRepository(ApplicationDbContext context) |
| | | 11 | | { |
| | 0 | 12 | | _context = context; |
| | 0 | 13 | | } |
| | | 14 | | |
| | | 15 | | public async Task<int> ObtenerVersionMaximaAsync(long periodoId) |
| | | 16 | | { |
| | 0 | 17 | | return await _context.LiquidacionItems |
| | 0 | 18 | | .AsNoTracking() |
| | 0 | 19 | | .Where(i => i.PeriodoId == periodoId) |
| | 0 | 20 | | .MaxAsync(i => (int?)i.Version) ?? 0; |
| | 0 | 21 | | } |
| | | 22 | | |
| | | 23 | | public async Task<List<BrouDatoFuncionario>> ObtenerDatosBrouAsync(long periodoId, int version) |
| | | 24 | | { |
| | | 25 | | // Agrupar líquido por cédula |
| | 0 | 26 | | var liquidosPorCedula = await _context.LiquidacionItems |
| | 0 | 27 | | .AsNoTracking() |
| | 0 | 28 | | .Where(i => i.PeriodoId == periodoId && i.Version == version) |
| | 0 | 29 | | .GroupBy(i => i.Cedula) |
| | 0 | 30 | | .Select(g => new { Cedula = g.Key, Liquido = g.Sum(i => i.Importe) }) |
| | 0 | 31 | | .ToDictionaryAsync(x => x.Cedula, x => x.Liquido); |
| | | 32 | | |
| | 0 | 33 | | if (liquidosPorCedula.Count == 0) |
| | 0 | 34 | | return new List<BrouDatoFuncionario>(); |
| | | 35 | | |
| | | 36 | | // Cargar relaciones activas con persona, cuentas bancarias activas y régimen |
| | 0 | 37 | | var relaciones = await _context.RelacionesLaborales |
| | 0 | 38 | | .AsNoTracking() |
| | 0 | 39 | | .Include(r => r.Persona) |
| | 0 | 40 | | .ThenInclude(p => p.CuentasBancarias.Where(c => c.Estado == "activa")) |
| | 0 | 41 | | .Include(r => r.Regimen) |
| | 0 | 42 | | .Where(r => r.Estado == EstadoRelacion.Activo) |
| | 0 | 43 | | .ToListAsync(); |
| | | 44 | | |
| | 0 | 45 | | return relaciones |
| | 0 | 46 | | .Where(r => liquidosPorCedula.ContainsKey(r.Persona.Cedula)) |
| | 0 | 47 | | .Select(r => new BrouDatoFuncionario( |
| | 0 | 48 | | Cedula: r.Persona.Cedula, |
| | 0 | 49 | | NombreCompleto: r.Persona.NombreCompleto, |
| | 0 | 50 | | Liquido: liquidosPorCedula[r.Persona.Cedula], |
| | 0 | 51 | | NumeroCuenta: r.Persona.CuentasBancarias.FirstOrDefault()?.NumeroCuenta, |
| | 0 | 52 | | Regimen: r.Regimen.NumeroLey |
| | 0 | 53 | | )) |
| | 0 | 54 | | .ToList(); |
| | 0 | 55 | | } |
| | | 56 | | |
| | | 57 | | public async Task<List<SiifItemRaw>> ObtenerItemsSiifAsync(long periodoId, int version) |
| | | 58 | | { |
| | 0 | 59 | | var items = await _context.LiquidacionItems |
| | 0 | 60 | | .AsNoTracking() |
| | 0 | 61 | | .Where(i => i.PeriodoId == periodoId && i.Version == version) |
| | 0 | 62 | | .ToListAsync(); |
| | | 63 | | |
| | 0 | 64 | | if (items.Count == 0) |
| | 0 | 65 | | return new List<SiifItemRaw>(); |
| | | 66 | | |
| | | 67 | | // Cargar nombres de programas y regímenes involucrados |
| | 0 | 68 | | var programaIds = items |
| | 0 | 69 | | .Where(i => i.ProgramaId.HasValue) |
| | 0 | 70 | | .Select(i => i.ProgramaId!.Value) |
| | 0 | 71 | | .ToHashSet(); |
| | | 72 | | |
| | 0 | 73 | | var regimenIds = items |
| | 0 | 74 | | .Where(i => i.RegimenId.HasValue) |
| | 0 | 75 | | .Select(i => i.RegimenId!.Value) |
| | 0 | 76 | | .ToHashSet(); |
| | | 77 | | |
| | 0 | 78 | | var programas = await _context.Programas |
| | 0 | 79 | | .AsNoTracking() |
| | 0 | 80 | | .Where(p => programaIds.Contains(p.Id)) |
| | 0 | 81 | | .ToDictionaryAsync(p => p.Id, p => p.Denominacion); |
| | | 82 | | |
| | 0 | 83 | | var regimenes = await _context.Regimenes |
| | 0 | 84 | | .AsNoTracking() |
| | 0 | 85 | | .Where(r => regimenIds.Contains(r.Id)) |
| | 0 | 86 | | .ToDictionaryAsync(r => r.Id, r => r.NumeroLey); |
| | | 87 | | |
| | | 88 | | // Cargar clasificaciones SIIF del catálogo |
| | 0 | 89 | | var codigosNumericos = items |
| | 0 | 90 | | .Select(i => i.CodigoConcepto) |
| | 0 | 91 | | .Where(c => int.TryParse(c, out _)) |
| | 0 | 92 | | .Select(int.Parse) |
| | 0 | 93 | | .ToHashSet(); |
| | | 94 | | |
| | 0 | 95 | | var clasificaciones = await _context.CatalogoItems |
| | 0 | 96 | | .AsNoTracking() |
| | 0 | 97 | | .Where(c => codigosNumericos.Contains(c.Codigo)) |
| | 0 | 98 | | .ToDictionaryAsync(c => c.Codigo.ToString(), c => c.ClasificacionSiif); |
| | | 99 | | |
| | 0 | 100 | | return items.Select(i => new SiifItemRaw( |
| | 0 | 101 | | ProgramaId: i.ProgramaId, |
| | 0 | 102 | | ProgramaNombre: i.ProgramaId.HasValue && programas.TryGetValue(i.ProgramaId.Value, out var prog) |
| | 0 | 103 | | ? prog : string.Empty, |
| | 0 | 104 | | RegimenId: i.RegimenId, |
| | 0 | 105 | | RegimenNombre: i.RegimenId.HasValue && regimenes.TryGetValue(i.RegimenId.Value, out var reg) |
| | 0 | 106 | | ? reg : string.Empty, |
| | 0 | 107 | | Rubro083: i.Rubro083, |
| | 0 | 108 | | Importe: i.Importe, |
| | 0 | 109 | | ClasificacionSiif: clasificaciones.TryGetValue(i.CodigoConcepto, out var clas) ? clas : null |
| | 0 | 110 | | )).ToList(); |
| | 0 | 111 | | } |
| | | 112 | | } |