< Summary

Information
Class: FAU.DataAccess.Repositories.ArchivoOrganismoRepository
Assembly: FAU.DataAccess
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.DataAccess/Repositories/ArchivoOrganismoRepository.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 77
Coverable lines: 77
Total lines: 112
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 18
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
ObtenerVersionMaximaAsync()100%210%
ObtenerDatosBrouAsync()0%620%
ObtenerItemsSiifAsync()0%2040%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.DataAccess/Repositories/ArchivoOrganismoRepository.cs

#LineLine coverage
 1using FAU.Entidades;
 2using Microsoft.EntityFrameworkCore;
 3
 4namespace FAU.DataAccess.Repositories;
 5
 6public class ArchivoOrganismoRepository : IArchivoOrganismoRepository
 7{
 8    private readonly ApplicationDbContext _context;
 9
 010    public ArchivoOrganismoRepository(ApplicationDbContext context)
 11    {
 012        _context = context;
 013    }
 14
 15    public async Task<int> ObtenerVersionMaximaAsync(long periodoId)
 16    {
 017        return await _context.LiquidacionItems
 018            .AsNoTracking()
 019            .Where(i => i.PeriodoId == periodoId)
 020            .MaxAsync(i => (int?)i.Version) ?? 0;
 021    }
 22
 23    public async Task<List<BrouDatoFuncionario>> ObtenerDatosBrouAsync(long periodoId, int version)
 24    {
 25        // Agrupar líquido por cédula
 026        var liquidosPorCedula = await _context.LiquidacionItems
 027            .AsNoTracking()
 028            .Where(i => i.PeriodoId == periodoId && i.Version == version)
 029            .GroupBy(i => i.Cedula)
 030            .Select(g => new { Cedula = g.Key, Liquido = g.Sum(i => i.Importe) })
 031            .ToDictionaryAsync(x => x.Cedula, x => x.Liquido);
 32
 033        if (liquidosPorCedula.Count == 0)
 034            return new List<BrouDatoFuncionario>();
 35
 36        // Cargar relaciones activas con persona, cuentas bancarias activas y régimen
 037        var relaciones = await _context.RelacionesLaborales
 038            .AsNoTracking()
 039            .Include(r => r.Persona)
 040                .ThenInclude(p => p.CuentasBancarias.Where(c => c.Estado == "activa"))
 041            .Include(r => r.Regimen)
 042            .Where(r => r.Estado == EstadoRelacion.Activo)
 043            .ToListAsync();
 44
 045        return relaciones
 046            .Where(r => liquidosPorCedula.ContainsKey(r.Persona.Cedula))
 047            .Select(r => new BrouDatoFuncionario(
 048                Cedula: r.Persona.Cedula,
 049                NombreCompleto: r.Persona.NombreCompleto,
 050                Liquido: liquidosPorCedula[r.Persona.Cedula],
 051                NumeroCuenta: r.Persona.CuentasBancarias.FirstOrDefault()?.NumeroCuenta,
 052                Regimen: r.Regimen.NumeroLey
 053            ))
 054            .ToList();
 055    }
 56
 57    public async Task<List<SiifItemRaw>> ObtenerItemsSiifAsync(long periodoId, int version)
 58    {
 059        var items = await _context.LiquidacionItems
 060            .AsNoTracking()
 061            .Where(i => i.PeriodoId == periodoId && i.Version == version)
 062            .ToListAsync();
 63
 064        if (items.Count == 0)
 065            return new List<SiifItemRaw>();
 66
 67        // Cargar nombres de programas y regímenes involucrados
 068        var programaIds = items
 069            .Where(i => i.ProgramaId.HasValue)
 070            .Select(i => i.ProgramaId!.Value)
 071            .ToHashSet();
 72
 073        var regimenIds = items
 074            .Where(i => i.RegimenId.HasValue)
 075            .Select(i => i.RegimenId!.Value)
 076            .ToHashSet();
 77
 078        var programas = await _context.Programas
 079            .AsNoTracking()
 080            .Where(p => programaIds.Contains(p.Id))
 081            .ToDictionaryAsync(p => p.Id, p => p.Denominacion);
 82
 083        var regimenes = await _context.Regimenes
 084            .AsNoTracking()
 085            .Where(r => regimenIds.Contains(r.Id))
 086            .ToDictionaryAsync(r => r.Id, r => r.NumeroLey);
 87
 88        // Cargar clasificaciones SIIF del catálogo
 089        var codigosNumericos = items
 090            .Select(i => i.CodigoConcepto)
 091            .Where(c => int.TryParse(c, out _))
 092            .Select(int.Parse)
 093            .ToHashSet();
 94
 095        var clasificaciones = await _context.CatalogoItems
 096            .AsNoTracking()
 097            .Where(c => codigosNumericos.Contains(c.Codigo))
 098            .ToDictionaryAsync(c => c.Codigo.ToString(), c => c.ClasificacionSiif);
 99
 0100        return items.Select(i => new SiifItemRaw(
 0101            ProgramaId: i.ProgramaId,
 0102            ProgramaNombre: i.ProgramaId.HasValue && programas.TryGetValue(i.ProgramaId.Value, out var prog)
 0103                ? prog : string.Empty,
 0104            RegimenId: i.RegimenId,
 0105            RegimenNombre: i.RegimenId.HasValue && regimenes.TryGetValue(i.RegimenId.Value, out var reg)
 0106                ? reg : string.Empty,
 0107            Rubro083: i.Rubro083,
 0108            Importe: i.Importe,
 0109            ClasificacionSiif: clasificaciones.TryGetValue(i.CodigoConcepto, out var clas) ? clas : null
 0110        )).ToList();
 0111    }
 112}