using Dapper; using GestionIntegral.Api.Models.Suscripciones; using System.Data; namespace GestionIntegral.Api.Data.Repositories.Suscripciones { public class AjusteRepository : IAjusteRepository { private readonly DbConnectionFactory _connectionFactory; private readonly ILogger _logger; public AjusteRepository(DbConnectionFactory factory, ILogger logger) { _connectionFactory = factory; _logger = logger; } public async Task CreateAsync(Ajuste nuevoAjuste, IDbTransaction transaction) { const string sql = @" INSERT INTO dbo.susc_Ajustes (IdSuscriptor, TipoAjuste, Monto, Motivo, Estado, IdUsuarioAlta, FechaAlta) OUTPUT INSERTED.* VALUES (@IdSuscriptor, @TipoAjuste, @Monto, @Motivo, 'Pendiente', @IdUsuarioAlta, GETDATE());"; if (transaction?.Connection == null) { throw new ArgumentNullException(nameof(transaction.Connection), "La conexión de la transacción no puede ser nula."); } return await transaction.Connection.QuerySingleOrDefaultAsync(sql, nuevoAjuste, transaction); } public async Task> GetAjustesPorSuscriptorAsync(int idSuscriptor) { const string sql = "SELECT * FROM dbo.susc_Ajustes WHERE IdSuscriptor = @IdSuscriptor ORDER BY FechaAlta DESC;"; using var connection = _connectionFactory.CreateConnection(); return await connection.QueryAsync(sql, new { IdSuscriptor = idSuscriptor }); } public async Task> GetAjustesPendientesPorSuscriptorAsync(int idSuscriptor, IDbTransaction transaction) { const string sql = "SELECT * FROM dbo.susc_Ajustes WHERE IdSuscriptor = @IdSuscriptor AND Estado = 'Pendiente';"; if (transaction?.Connection == null) { throw new ArgumentNullException(nameof(transaction.Connection), "La conexión de la transacción no puede ser nula."); } return await transaction.Connection.QueryAsync(sql, new { IdSuscriptor = idSuscriptor }, transaction); } public async Task MarcarAjustesComoAplicadosAsync(IEnumerable idsAjustes, int idFactura, IDbTransaction transaction) { if (!idsAjustes.Any()) return true; const string sql = @" UPDATE dbo.susc_Ajustes SET Estado = 'Aplicado', IdFacturaAplicado = @IdFactura WHERE IdAjuste IN @IdsAjustes;"; if (transaction?.Connection == null) { throw new ArgumentNullException(nameof(transaction.Connection), "La conexión de la transacción no puede ser nula."); } var rowsAffected = await transaction.Connection.ExecuteAsync(sql, new { IdsAjustes = idsAjustes, IdFactura = idFactura }, transaction); return rowsAffected == idsAjustes.Count(); } public async Task GetByIdAsync(int idAjuste) { const string sql = "SELECT * FROM dbo.susc_Ajustes WHERE IdAjuste = @IdAjuste;"; using var connection = _connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync(sql, new { idAjuste }); } public async Task AnularAjusteAsync(int idAjuste, int idUsuario, IDbTransaction transaction) { const string sql = @" UPDATE dbo.susc_Ajustes SET Estado = 'Anulado', IdUsuarioAnulo = @IdUsuario, FechaAnulacion = GETDATE() WHERE IdAjuste = @IdAjuste AND Estado = 'Pendiente';"; // Solo se pueden anular los pendientes if (transaction?.Connection == null) { throw new ArgumentNullException(nameof(transaction.Connection), "La conexión de la transacción no puede ser nula."); } var rows = await transaction.Connection.ExecuteAsync(sql, new { IdAjuste = idAjuste, IdUsuario = idUsuario }, transaction); return rows == 1; } } }