< 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
24%
Covered lines: 31
Uncovered lines: 94
Coverable lines: 125
Total lines: 233
Line coverage: 24.8%
Branch coverage
12%
Covered branches: 3
Total branches: 24
Branch coverage: 12.5%
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 System.Data;
 2using FAU.Entidades;
 3using Microsoft.EntityFrameworkCore;
 4
 5namespace FAU.DataAccess.Repositories;
 6
 7public class IrpfRepository : IIrpfRepository
 8{
 9    private readonly ApplicationDbContext _context;
 10
 1211    public IrpfRepository(ApplicationDbContext context)
 12    {
 1213        _context = context;
 1214    }
 15
 16    // ── Franjas ──────────────────────────────────────────────────────────────
 17
 18    public async Task<IEnumerable<FranjaIrpf>> GetFranjasVigentesAsync(DateTime? fecha = null)
 19    {
 220        var fechaRef = fecha?.Date ?? DateTime.UtcNow.Date;
 221        return await _context.FranjasIrpf
 222            .Where(f => f.VigenteDesde <= fechaRef && (f.VigenteHasta == null || f.VigenteHasta >= fechaRef))
 223            .OrderBy(f => f.NumeroFranja)
 224            .ToListAsync();
 225    }
 26
 27    public async Task<IEnumerable<FranjaIrpf>> GetFranjasPorFechaVigenciaAsync(DateTime vigenteDesde)
 28    {
 029        return await _context.FranjasIrpf
 030            .Where(f => f.VigenteDesde.Date == vigenteDesde.Date)
 031            .OrderBy(f => f.NumeroFranja)
 032            .ToListAsync();
 033    }
 34
 35    public async Task<IEnumerable<FranjaIrpf>> GetHistorialFranjasAsync()
 36    {
 037        return await _context.FranjasIrpf
 038            .OrderByDescending(f => f.VigenteDesde)
 039            .ThenBy(f => f.NumeroFranja)
 040            .ToListAsync();
 041    }
 42
 43    public async Task<FranjaIrpf?> GetFranjaByIdAsync(long id)
 44    {
 445        return await _context.FranjasIrpf.FindAsync(id);
 446    }
 47
 48    public async Task<FranjaIrpf?> GetFranjaActivaByNumeroAsync(short numeroFranja)
 49    {
 250        return await _context.FranjasIrpf
 251            .Where(f => f.NumeroFranja == numeroFranja && f.VigenteHasta == null)
 252            .FirstOrDefaultAsync();
 253    }
 54
 55    public async Task<DateTime?> ObtenerSiguienteFechaVigenciaAsync(DateTime vigenteDesde)
 56    {
 057        return await _context.FranjasIrpf
 058            .Where(f => f.VigenteDesde > vigenteDesde)
 059            .OrderBy(f => f.VigenteDesde)
 060            .Select(f => (DateTime?)f.VigenteDesde)
 061            .FirstOrDefaultAsync();
 062    }
 63
 64    public async Task<bool> ExisteFranjaAsync(short numeroFranja, DateTime vigenteDesde)
 65    {
 266        return await _context.FranjasIrpf
 267            .AnyAsync(f => f.NumeroFranja == numeroFranja && f.VigenteDesde.Date == vigenteDesde.Date);
 268    }
 69
 70    public async Task<FranjaIrpf> CreateFranjaAsync(FranjaIrpf franja)
 71    {
 472        _context.FranjasIrpf.Add(franja);
 473        await _context.SaveChangesAsync();
 474        return franja;
 475    }
 76
 77    public async Task CreateFranjasAsync(IEnumerable<FranjaIrpf> franjas)
 78    {
 079        _context.FranjasIrpf.AddRange(franjas);
 080        await _context.SaveChangesAsync();
 081    }
 82
 83    public async Task<FranjaIrpf> UpdateFranjaAsync(FranjaIrpf franja)
 84    {
 185        _context.FranjasIrpf.Update(franja);
 186        await _context.SaveChangesAsync();
 187        return franja;
 188    }
 89
 90    public async Task UpdateFranjasAsync(IEnumerable<FranjaIrpf> franjas)
 91    {
 092        _context.FranjasIrpf.UpdateRange(franjas);
 093        await _context.SaveChangesAsync();
 094    }
 95
 96    public async Task DeleteFranjaAsync(long id)
 97    {
 298        var franja = await _context.FranjasIrpf.FindAsync(id);
 299        if (franja != null)
 100        {
 1101            _context.FranjasIrpf.Remove(franja);
 1102            await _context.SaveChangesAsync();
 103        }
 2104    }
 105
 106    public async Task<bool> EstaFranjaUsadaEnLiquidacionesCerradasAsync(long franjaId)
 107    {
 0108        if (!_context.Database.IsRelational())
 109        {
 0110            return false;
 111        }
 112
 0113        var conexion = _context.Database.GetDbConnection();
 0114        var abrirConexion = conexion.State != ConnectionState.Open;
 115
 0116        if (abrirConexion)
 117        {
 0118            await conexion.OpenAsync();
 119        }
 120
 121        try
 122        {
 0123            var existeDetalle = await ExisteTablaAsync(conexion, "irpf_detalle_franjas");
 0124            var existeMensual = await ExisteTablaAsync(conexion, "irpf_mensual");
 0125            var existeLiquidaciones = await ExisteTablaAsync(conexion, "liquidaciones");
 126
 0127            if (!existeDetalle || !existeMensual || !existeLiquidaciones)
 128            {
 0129                return false;
 130            }
 131
 0132            return await ExisteUsoEnLiquidacionesCerradasAsync(conexion, franjaId);
 133        }
 134        finally
 135        {
 0136            if (abrirConexion)
 137            {
 0138                await conexion.CloseAsync();
 139            }
 140        }
 0141    }
 142
 143    public async Task<bool> EstaFranjaUsadaEnIrpfMensualAsync(long franjaId)
 144    {
 0145        if (!_context.Database.IsRelational())
 146        {
 0147            return false;
 148        }
 149
 0150        var conexion = _context.Database.GetDbConnection();
 0151        var abrirConexion = conexion.State != ConnectionState.Open;
 152
 0153        if (abrirConexion)
 154        {
 0155            await conexion.OpenAsync();
 156        }
 157
 158        try
 159        {
 0160            var existeDetalle = await ExisteTablaAsync(conexion, "irpf_detalle_franjas");
 0161            if (!existeDetalle)
 162            {
 0163                return false;
 164            }
 165
 0166            using var comando = conexion.CreateCommand();
 0167            comando.CommandText = @"
 0168                SELECT EXISTS (
 0169                    SELECT 1
 0170                    FROM irpf_detalle_franjas d
 0171                    WHERE d.franja_irpf_id = @franjaId
 0172                );";
 173
 0174            var parametro = comando.CreateParameter();
 0175            parametro.ParameterName = "@franjaId";
 0176            parametro.Value = franjaId;
 0177            comando.Parameters.Add(parametro);
 178
 0179            var resultado = await comando.ExecuteScalarAsync();
 0180            return Convert.ToBoolean(resultado);
 181        }
 182        finally
 183        {
 0184            if (abrirConexion)
 185            {
 0186                await conexion.CloseAsync();
 187            }
 188        }
 0189    }
 190
 191    private static async Task<bool> ExisteTablaAsync(System.Data.Common.DbConnection conexion, string nombreTabla)
 192    {
 0193        using var comando = conexion.CreateCommand();
 0194        comando.CommandText = @"
 0195            SELECT EXISTS (
 0196                SELECT 1
 0197                FROM information_schema.tables
 0198                WHERE table_schema = 'public'
 0199                  AND table_name = @tabla
 0200            );";
 201
 0202        var parametro = comando.CreateParameter();
 0203        parametro.ParameterName = "@tabla";
 0204        parametro.Value = nombreTabla;
 0205        comando.Parameters.Add(parametro);
 206
 0207        var resultado = await comando.ExecuteScalarAsync();
 0208        return Convert.ToBoolean(resultado);
 0209    }
 210
 211    private static async Task<bool> ExisteUsoEnLiquidacionesCerradasAsync(System.Data.Common.DbConnection conexion, long
 212    {
 0213        using var comando = conexion.CreateCommand();
 0214        comando.CommandText = @"
 0215            SELECT EXISTS (
 0216                SELECT 1
 0217                FROM irpf_detalle_franjas d
 0218                INNER JOIN irpf_mensual m ON m.id = d.irpf_mensual_id
 0219                INNER JOIN liquidaciones l ON l.id = m.liquidacion_id
 0220                WHERE d.franja_irpf_id = @franjaId
 0221                  AND LOWER(COALESCE(l.estado, '')) IN ('cerrada', 'cerrado')
 0222            );";
 223
 0224        var parametro = comando.CreateParameter();
 0225        parametro.ParameterName = "@franjaId";
 0226        parametro.Value = franjaId;
 0227        comando.Parameters.Add(parametro);
 228
 0229        var resultado = await comando.ExecuteScalarAsync();
 0230        return Convert.ToBoolean(resultado);
 0231    }
 232
 233}