< Summary

Information
Class: FAU.DataAccess.Repositories.IrpfRepository
Assembly: FAU.DataAccess
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.DataAccess/Repositories/IrpfRepository.cs
Line coverage
51%
Covered lines: 67
Uncovered lines: 64
Coverable lines: 131
Total lines: 263
Line coverage: 51.1%
Branch coverage
45%
Covered branches: 11
Total branches: 24
Branch coverage: 45.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

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

#LineLine coverage
 1using FAU.Entidades;
 2using Microsoft.EntityFrameworkCore;
 3
 4namespace FAU.DataAccess.Repositories;
 5
 6public class IrpfRepository : IIrpfRepository
 7{
 8    private readonly ApplicationDbContext _context;
 9
 1510    public IrpfRepository(ApplicationDbContext context)
 11    {
 1512        _context = context;
 1513    }
 14
 15    // ── Franjas ──────────────────────────────────────────────────────────────
 16
 17    public async Task<IEnumerable<FranjaIrpf>> GetFranjasVigentesAsync(DateTime? fecha = null)
 18    {
 219        var fechaRef = fecha?.Date ?? DateTime.UtcNow.Date;
 220        return await _context.FranjasIrpf
 221            .Where(f => f.VigenteDesde <= fechaRef && (f.VigenteHasta == null || f.VigenteHasta >= fechaRef))
 222            .OrderBy(f => f.NumeroFranja)
 223            .ToListAsync();
 224    }
 25
 26    public async Task<IEnumerable<FranjaIrpf>> GetFranjasPorFechaVigenciaAsync(DateTime vigenteDesde)
 27    {
 028        return await _context.FranjasIrpf
 029            .Where(f => f.VigenteDesde.Date == vigenteDesde.Date)
 030            .OrderBy(f => f.NumeroFranja)
 031            .ToListAsync();
 032    }
 33
 34    public async Task<IEnumerable<FranjaIrpf>> GetHistorialFranjasAsync()
 35    {
 036        return await _context.FranjasIrpf
 037            .OrderByDescending(f => f.VigenteDesde)
 038            .ThenBy(f => f.NumeroFranja)
 039            .ToListAsync();
 040    }
 41
 42    public async Task<FranjaIrpf?> GetFranjaByIdAsync(long id)
 43    {
 444        return await _context.FranjasIrpf.FindAsync(id);
 445    }
 46
 47    public async Task<FranjaIrpf?> GetFranjaActivaByNumeroAsync(short numeroFranja)
 48    {
 249        return await _context.FranjasIrpf
 250            .Where(f => f.NumeroFranja == numeroFranja && f.VigenteHasta == null)
 251            .FirstOrDefaultAsync();
 252    }
 53
 54    public async Task<DateTime?> ObtenerSiguienteFechaVigenciaAsync(DateTime vigenteDesde)
 55    {
 056        return await _context.FranjasIrpf
 057            .Where(f => f.VigenteDesde > vigenteDesde)
 058            .OrderBy(f => f.VigenteDesde)
 059            .Select(f => (DateTime?)f.VigenteDesde)
 060            .FirstOrDefaultAsync();
 061    }
 62
 63    public async Task<bool> ExisteFranjaAsync(short numeroFranja, DateTime vigenteDesde)
 64    {
 265        return await _context.FranjasIrpf
 266            .AnyAsync(f => f.NumeroFranja == numeroFranja && f.VigenteDesde.Date == vigenteDesde.Date);
 267    }
 68
 69    public async Task<FranjaIrpf> CreateFranjaAsync(FranjaIrpf franja)
 70    {
 471        _context.FranjasIrpf.Add(franja);
 472        await _context.SaveChangesAsync();
 473        return franja;
 474    }
 75
 76    public async Task CreateFranjasAsync(IEnumerable<FranjaIrpf> franjas)
 77    {
 078        _context.FranjasIrpf.AddRange(franjas);
 079        await _context.SaveChangesAsync();
 080    }
 81
 82    public async Task<FranjaIrpf> UpdateFranjaAsync(FranjaIrpf franja)
 83    {
 184        _context.FranjasIrpf.Update(franja);
 185        await _context.SaveChangesAsync();
 186        return franja;
 187    }
 88
 89    public async Task UpdateFranjasAsync(IEnumerable<FranjaIrpf> franjas)
 90    {
 091        _context.FranjasIrpf.UpdateRange(franjas);
 092        await _context.SaveChangesAsync();
 093    }
 94
 95    public async Task DeleteFranjaAsync(long id)
 96    {
 297        var franja = await _context.FranjasIrpf.FindAsync(id);
 298        if (franja != null)
 99        {
 1100            _context.FranjasIrpf.Remove(franja);
 1101            await _context.SaveChangesAsync();
 102        }
 2103    }
 104
 105    // ── IRPF Mensual ─────────────────────────────────────────────────────────
 106
 107    /// <summary>
 108    /// Crea un registro IrpfMensual con sus detalles de franjas en transacción.
 109    /// </summary>
 110    public async Task<IrpfMensual> CrearIrpfMensualAsync(IrpfMensual irpfMensual, IEnumerable<IrpfDetalleFranjas> detall
 111    {
 3112        var provider = _context.Database.ProviderName ?? string.Empty;
 3113        if (provider.Contains("InMemory"))
 114        {
 3115            _context.IrpfsMensual.Add(irpfMensual);
 3116            await _context.SaveChangesAsync();
 117
 14118            foreach (var detalle in detalleFranjas)
 119            {
 4120                detalle.IrpfMensualId = irpfMensual.Id;
 4121                _context.IrpfsDetalleFranjas.Add(detalle);
 122            }
 3123            await _context.SaveChangesAsync();
 3124            return irpfMensual;
 125        }
 126
 0127        using (var transaction = await _context.Database.BeginTransactionAsync())
 128        {
 129            try
 130            {
 0131                _context.IrpfsMensual.Add(irpfMensual);
 0132                await _context.SaveChangesAsync();
 133
 0134                foreach (var detalle in detalleFranjas)
 135                {
 0136                    detalle.IrpfMensualId = irpfMensual.Id;
 0137                    _context.IrpfsDetalleFranjas.Add(detalle);
 138                }
 0139                await _context.SaveChangesAsync();
 140
 0141                await transaction.CommitAsync();
 0142                return irpfMensual;
 143            }
 0144            catch
 145            {
 0146                await transaction.RollbackAsync();
 0147                throw;
 148            }
 0149        }
 3150    }
 151
 152    /// <summary>
 153    /// Actualiza un IrpfMensual y reemplaza sus detalles de franjas.
 154    /// </summary>
 155    public async Task<IrpfMensual> ActualizarIrpfMensualAsync(IrpfMensual irpfMensual, IEnumerable<IrpfDetalleFranjas> d
 156    {
 1157        var provider = _context.Database.ProviderName ?? string.Empty;
 1158        if (provider.Contains("InMemory"))
 159        {
 1160            _context.IrpfsMensual.Update(irpfMensual);
 1161            await _context.SaveChangesAsync();
 162
 1163            var detallesAntiguos = await _context.IrpfsDetalleFranjas
 1164                .Where(d => d.IrpfMensualId == irpfMensual.Id)
 1165                .ToListAsync();
 1166            _context.IrpfsDetalleFranjas.RemoveRange(detallesAntiguos);
 1167            await _context.SaveChangesAsync();
 168
 4169            foreach (var detalle in detalleFranjas)
 170            {
 1171                detalle.IrpfMensualId = irpfMensual.Id;
 1172                _context.IrpfsDetalleFranjas.Add(detalle);
 173            }
 1174            await _context.SaveChangesAsync();
 1175            return irpfMensual;
 176        }
 177
 0178        using (var transaction = await _context.Database.BeginTransactionAsync())
 179        {
 180            try
 181            {
 0182                _context.IrpfsMensual.Update(irpfMensual);
 0183                await _context.SaveChangesAsync();
 184
 185                // Eliminar detalles antiguos
 0186                var detallesAntiguos = await _context.IrpfsDetalleFranjas
 0187                    .Where(d => d.IrpfMensualId == irpfMensual.Id)
 0188                    .ToListAsync();
 0189                _context.IrpfsDetalleFranjas.RemoveRange(detallesAntiguos);
 0190                await _context.SaveChangesAsync();
 191
 192                // Insertar nuevos detalles
 0193                foreach (var detalle in detalleFranjas)
 194                {
 0195                    detalle.IrpfMensualId = irpfMensual.Id;
 0196                    _context.IrpfsDetalleFranjas.Add(detalle);
 197                }
 0198                await _context.SaveChangesAsync();
 199
 0200                await transaction.CommitAsync();
 0201                return irpfMensual;
 202            }
 0203            catch
 204            {
 0205                await transaction.RollbackAsync();
 0206                throw;
 207            }
 0208        }
 1209    }
 210
 211    /// <summary>
 212    /// Obtiene un IrpfMensual con sus detalles de franjas.
 213    /// </summary>
 214    public async Task<IrpfMensual?> ObtenerIrpfMensualPorIdAsync(long id)
 215    {
 1216        return await _context.IrpfsMensual
 1217            .Include(i => i.IrpfDetalleFranjas)
 1218            .FirstOrDefaultAsync(i => i.Id == id);
 1219    }
 220
 221    /// <summary>
 222    /// Obtiene el IrpfMensual para una persona en una liquidación específica.
 223    /// </summary>
 224    public async Task<IrpfMensual?> ObtenerIrpfMensualPorLiquidacionYPersonaAsync(long liquidacionId, long personaId)
 225    {
 1226        return await _context.IrpfsMensual
 1227            .Include(i => i.IrpfDetalleFranjas)
 1228            .FirstOrDefaultAsync(i => i.LiquidacionId == liquidacionId && i.PersonaId == personaId);
 1229    }
 230
 231    /// <summary>
 232    /// Obtiene todos los IrpfMensual para una liquidación (paginated).
 233    /// </summary>
 234    public async Task<(IEnumerable<IrpfMensual> Items, int TotalCount)> ObtenerIrpfsMensualPorLiquidacionAsync(
 235        long liquidacionId,
 236        int pagina,
 237        int tamano)
 238    {
 0239        var query = _context.IrpfsMensual
 0240            .Include(i => i.IrpfDetalleFranjas)
 0241            .Where(i => i.LiquidacionId == liquidacionId);
 242
 0243        var totalCount = await query.CountAsync();
 0244        var items = await query
 0245            .OrderBy(i => i.PersonaId)
 0246            .Skip((pagina - 1) * tamano)
 0247            .Take(tamano)
 0248            .ToListAsync();
 249
 0250        return (items, totalCount);
 0251    }
 252
 253    /// <summary>
 254    /// Verifica si existe un IrpfMensual para una persona en una liquidación.
 255    /// </summary>
 256    public async Task<bool> ExisteIrpfMensualAsync(long liquidacionId, long personaId)
 257    {
 1258        return await _context.IrpfsMensual
 1259            .AnyAsync(i => i.LiquidacionId == liquidacionId && i.PersonaId == personaId);
 1260    }
 261
 262}
 263