< Summary

Information
Class: FAU.DataAccess.Repositories.BeneficioSocialRepository
Assembly: FAU.DataAccess
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.DataAccess/Repositories/BeneficioSocialRepository.cs
Line coverage
86%
Covered lines: 53
Uncovered lines: 8
Coverable lines: 61
Total lines: 119
Line coverage: 86.8%
Branch coverage
75%
Covered branches: 6
Total branches: 8
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ObtenerPorIdAsync()100%11100%
ObtenerPaginadoAsync()100%44100%
CrearAsync()100%11100%
ActualizarAsync()100%11100%
ExistePersonaActivaAsync()100%11100%
ExisteTipoBeneficioVigenteAsync()100%11100%
ObtenerTipoBeneficioAsync()100%11100%
ExisteDuplicadoEventoAsync()100%22100%
ExisteBeneficioActivoMismoTipoAsync()0%620%

File(s)

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

#LineLine coverage
 1using FAU.Entidades;
 2using Microsoft.EntityFrameworkCore;
 3
 4namespace FAU.DataAccess.Repositories;
 5
 6public class BeneficioSocialRepository : IBeneficioSocialRepository
 7{
 8    private readonly ApplicationDbContext _context;
 9
 1810    public BeneficioSocialRepository(ApplicationDbContext context)
 11    {
 1812        _context = context;
 1813    }
 14
 15    public async Task<BeneficioSocial?> ObtenerPorIdAsync(long id)
 16    {
 317        return await _context.BeneficiosSociales
 318            .Include(b => b.TipoBeneficio)
 319            .Include(b => b.Persona)
 320            .FirstOrDefaultAsync(b => b.Id == id);
 321    }
 22
 23    public async Task<(IEnumerable<BeneficioSocial> Items, int TotalCount)> ObtenerPaginadoAsync(
 24        int pagina,
 25        int tamano,
 26        long? personaId = null,
 27        string? estado = null)
 28    {
 329        var query = _context.BeneficiosSociales
 330            .Include(b => b.TipoBeneficio)
 331            .Include(b => b.Persona)
 332            .AsQueryable();
 33
 334        if (personaId.HasValue)
 35        {
 136            query = query.Where(b => b.PersonaId == personaId.Value);
 37        }
 38
 339        if (!string.IsNullOrWhiteSpace(estado))
 40        {
 141            var estadoNormalizado = estado.Trim().ToLowerInvariant();
 142            query = query.Where(b => b.Estado.ToLower() == estadoNormalizado);
 43        }
 44
 345        var total = await query.CountAsync();
 46
 347        var items = await query
 348            .OrderByDescending(b => b.VigenteDesde)
 349            .ThenByDescending(b => b.Id)
 350            .Skip((pagina - 1) * tamano)
 351            .Take(tamano)
 352            .ToListAsync();
 53
 354        return (items, total);
 355    }
 56
 57    public async Task<BeneficioSocial> CrearAsync(BeneficioSocial beneficioSocial)
 58    {
 359        _context.BeneficiosSociales.Add(beneficioSocial);
 360        await _context.SaveChangesAsync();
 361        return beneficioSocial;
 362    }
 63
 64    public async Task<BeneficioSocial> ActualizarAsync(BeneficioSocial beneficioSocial)
 65    {
 66        // La entidad ya viene trackeada desde ObtenerPorIdAsync dentro del mismo scope.
 67        // Evitamos Update() para no propagar cambios al grafo de navegación.
 168        await _context.SaveChangesAsync();
 169        return beneficioSocial;
 170    }
 71
 72    public async Task<bool> ExistePersonaActivaAsync(long personaId, DateTime fechaReferencia)
 73    {
 274        var fecha = fechaReferencia.Date;
 75
 276        return await _context.RelacionesLaborales.AnyAsync(rl =>
 277            rl.PersonaId == personaId
 278            && rl.Estado == EstadoRelacion.Activo
 279            && rl.FechaInicio.Date <= fecha
 280            && (!rl.FechaFin.HasValue || rl.FechaFin.Value.Date >= fecha));
 281    }
 82
 83    public async Task<bool> ExisteTipoBeneficioVigenteAsync(long tipoBeneficioId)
 84    {
 385        return await _context.TiposBeneficio.AnyAsync(tb => tb.Id == tipoBeneficioId && tb.Activo);
 386    }
 87
 88    public async Task<TipoBeneficio?> ObtenerTipoBeneficioAsync(long tipoBeneficioId)
 89    {
 290        return await _context.TiposBeneficio.FirstOrDefaultAsync(tb => tb.Id == tipoBeneficioId);
 291    }
 92
 93    public async Task<bool> ExisteDuplicadoEventoAsync(long personaId, long tipoBeneficioId, string claveEvento, long? e
 94    {
 495        var query = _context.BeneficiosSociales.Where(b =>
 496            b.PersonaId == personaId
 497            && b.TipoBeneficioId == tipoBeneficioId
 498            && b.ClaveEvento == claveEvento
 499            && b.Estado != "inactivo");
 100
 4101        if (excluirId.HasValue)
 1102            query = query.Where(b => b.Id != excluirId.Value);
 103
 4104        return await query.AnyAsync();
 4105    }
 106
 107    public async Task<bool> ExisteBeneficioActivoMismoTipoAsync(long personaId, long tipoBeneficioId, long? excluirId = 
 108    {
 0109        var query = _context.BeneficiosSociales.Where(b =>
 0110            b.PersonaId == personaId
 0111            && b.TipoBeneficioId == tipoBeneficioId
 0112            && b.Estado != "inactivo");
 113
 0114        if (excluirId.HasValue)
 0115            query = query.Where(b => b.Id != excluirId.Value);
 116
 0117        return await query.AnyAsync();
 0118    }
 119}