195 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			195 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								using Dapper;
							 | 
						||
| 
								 | 
							
								using GestionIntegral.Api.Models.Suscripciones;
							 | 
						||
| 
								 | 
							
								using System.Data;
							 | 
						||
| 
								 | 
							
								using System.Text;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace GestionIntegral.Api.Data.Repositories.Suscripciones
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public class SuscriptorRepository : ISuscriptorRepository
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        private readonly DbConnectionFactory _connectionFactory;
							 | 
						||
| 
								 | 
							
								        private readonly ILogger<SuscriptorRepository> _logger;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public SuscriptorRepository(DbConnectionFactory connectionFactory, ILogger<SuscriptorRepository> logger)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            _connectionFactory = connectionFactory;
							 | 
						||
| 
								 | 
							
								            _logger = logger;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<IEnumerable<Suscriptor>> GetAllAsync(string? nombreFilter, string? nroDocFilter, bool soloActivos)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var sqlBuilder = new StringBuilder(@"
							 | 
						||
| 
								 | 
							
								                SELECT IdSuscriptor, NombreCompleto, Email, Telefono, Direccion, TipoDocumento, 
							 | 
						||
| 
								 | 
							
								                       NroDocumento, CBU, IdFormaPagoPreferida, Observaciones, Activo, 
							 | 
						||
| 
								 | 
							
								                       IdUsuarioAlta, FechaAlta, IdUsuarioMod, FechaMod
							 | 
						||
| 
								 | 
							
								                FROM dbo.susc_Suscriptores WHERE 1=1");
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            var parameters = new DynamicParameters();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (soloActivos)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                sqlBuilder.Append(" AND Activo = 1");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (!string.IsNullOrWhiteSpace(nombreFilter))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                sqlBuilder.Append(" AND NombreCompleto LIKE @NombreFilter");
							 | 
						||
| 
								 | 
							
								                parameters.Add("NombreFilter", $"%{nombreFilter}%");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (!string.IsNullOrWhiteSpace(nroDocFilter))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                sqlBuilder.Append(" AND NroDocumento LIKE @NroDocFilter");
							 | 
						||
| 
								 | 
							
								                parameters.Add("NroDocFilter", $"%{nroDocFilter}%");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            sqlBuilder.Append(" ORDER BY NombreCompleto;");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _connectionFactory.CreateConnection();
							 | 
						||
| 
								 | 
							
								                return await connection.QueryAsync<Suscriptor>(sqlBuilder.ToString(), parameters);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _logger.LogError(ex, "Error al obtener todos los Suscriptores.");
							 | 
						||
| 
								 | 
							
								                return Enumerable.Empty<Suscriptor>();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<Suscriptor?> GetByIdAsync(int id)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            const string sql = @"
							 | 
						||
| 
								 | 
							
								                SELECT IdSuscriptor, NombreCompleto, Email, Telefono, Direccion, TipoDocumento, 
							 | 
						||
| 
								 | 
							
								                       NroDocumento, CBU, IdFormaPagoPreferida, Observaciones, Activo, 
							 | 
						||
| 
								 | 
							
								                       IdUsuarioAlta, FechaAlta, IdUsuarioMod, FechaMod
							 | 
						||
| 
								 | 
							
								                FROM dbo.susc_Suscriptores WHERE IdSuscriptor = @Id;";
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _connectionFactory.CreateConnection();
							 | 
						||
| 
								 | 
							
								                return await connection.QuerySingleOrDefaultAsync<Suscriptor>(sql, new { Id = id });
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _logger.LogError(ex, "Error al obtener Suscriptor por ID: {IdSuscriptor}", id);
							 | 
						||
| 
								 | 
							
								                return null;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        public async Task<bool> ExistsByDocumentoAsync(string tipoDocumento, string nroDocumento, int? excludeId = null)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var sqlBuilder = new StringBuilder("SELECT COUNT(1) FROM dbo.susc_Suscriptores WHERE TipoDocumento = @TipoDocumento AND NroDocumento = @NroDocumento");
							 | 
						||
| 
								 | 
							
								            var parameters = new DynamicParameters();
							 | 
						||
| 
								 | 
							
								            parameters.Add("TipoDocumento", tipoDocumento);
							 | 
						||
| 
								 | 
							
								            parameters.Add("NroDocumento", nroDocumento);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (excludeId.HasValue)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                sqlBuilder.Append(" AND IdSuscriptor != @ExcludeId");
							 | 
						||
| 
								 | 
							
								                parameters.Add("ExcludeId", excludeId.Value);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _connectionFactory.CreateConnection();
							 | 
						||
| 
								 | 
							
								                return await connection.ExecuteScalarAsync<bool>(sqlBuilder.ToString(), parameters);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _logger.LogError(ex, "Error en ExistsByDocumentoAsync para Suscriptor.");
							 | 
						||
| 
								 | 
							
								                return true; // Asumir que existe si hay error para prevenir duplicados.
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<bool> IsInUseAsync(int id)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            // Un suscriptor está en uso si tiene suscripciones activas.
							 | 
						||
| 
								 | 
							
								            const string sql = "SELECT TOP 1 1 FROM dbo.susc_Suscripciones WHERE IdSuscriptor = @Id AND Estado = 'Activa'";
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using var connection = _connectionFactory.CreateConnection();
							 | 
						||
| 
								 | 
							
								                var inUse = await connection.ExecuteScalarAsync<int?>(sql, new { Id = id });
							 | 
						||
| 
								 | 
							
								                return inUse.HasValue && inUse.Value == 1;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _logger.LogError(ex, "Error en IsInUseAsync para Suscriptor ID: {IdSuscriptor}", id);
							 | 
						||
| 
								 | 
							
								                return true; // Asumir en uso si hay error.
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<Suscriptor?> CreateAsync(Suscriptor nuevoSuscriptor, IDbTransaction transaction)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (transaction == null || transaction.Connection == null)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                throw new ArgumentNullException(nameof(transaction), "La transacción o su conexión no pueden ser nulas.");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            const string sqlInsert = @"
							 | 
						||
| 
								 | 
							
								                INSERT INTO dbo.susc_Suscriptores 
							 | 
						||
| 
								 | 
							
								                    (NombreCompleto, Email, Telefono, Direccion, TipoDocumento, NroDocumento, 
							 | 
						||
| 
								 | 
							
								                     CBU, IdFormaPagoPreferida, Observaciones, Activo, IdUsuarioAlta, FechaAlta)
							 | 
						||
| 
								 | 
							
								                OUTPUT INSERTED.*
							 | 
						||
| 
								 | 
							
								                VALUES 
							 | 
						||
| 
								 | 
							
								                    (@NombreCompleto, @Email, @Telefono, @Direccion, @TipoDocumento, @NroDocumento, 
							 | 
						||
| 
								 | 
							
								                     @CBU, @IdFormaPagoPreferida, @Observaciones, 1, @IdUsuarioAlta, GETDATE());";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            var suscriptorCreado = await transaction.Connection.QuerySingleAsync<Suscriptor>(
							 | 
						||
| 
								 | 
							
								                sqlInsert,
							 | 
						||
| 
								 | 
							
								                nuevoSuscriptor,
							 | 
						||
| 
								 | 
							
								                transaction: transaction
							 | 
						||
| 
								 | 
							
								            );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // No se necesita historial para la creación, ya que la propia tabla tiene campos de auditoría.
							 | 
						||
| 
								 | 
							
								            // Si se necesitara una tabla _H, aquí iría el INSERT a esa tabla.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return suscriptorCreado;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<bool> UpdateAsync(Suscriptor suscriptor, IDbTransaction transaction)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            // El servicio ya ha poblado IdUsuarioMod y FechaMod en la entidad.
							 | 
						||
| 
								 | 
							
								            const string sqlUpdate = @"
							 | 
						||
| 
								 | 
							
								                UPDATE dbo.susc_Suscriptores SET
							 | 
						||
| 
								 | 
							
								                    NombreCompleto = @NombreCompleto,
							 | 
						||
| 
								 | 
							
								                    Email = @Email,
							 | 
						||
| 
								 | 
							
								                    Telefono = @Telefono,
							 | 
						||
| 
								 | 
							
								                    Direccion = @Direccion,
							 | 
						||
| 
								 | 
							
								                    TipoDocumento = @TipoDocumento,
							 | 
						||
| 
								 | 
							
								                    NroDocumento = @NroDocumento,
							 | 
						||
| 
								 | 
							
								                    CBU = @CBU,
							 | 
						||
| 
								 | 
							
								                    IdFormaPagoPreferida = @IdFormaPagoPreferida,
							 | 
						||
| 
								 | 
							
								                    Observaciones = @Observaciones,
							 | 
						||
| 
								 | 
							
								                    IdUsuarioMod = @IdUsuarioMod,
							 | 
						||
| 
								 | 
							
								                    FechaMod = @FechaMod
							 | 
						||
| 
								 | 
							
								                WHERE IdSuscriptor = @IdSuscriptor;";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (transaction == null || transaction.Connection == null)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                throw new ArgumentNullException(nameof(transaction), "La transacción o su conexión no pueden ser nulas.");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            var rowsAffected = await transaction.Connection.ExecuteAsync(sqlUpdate, suscriptor, transaction: transaction);
							 | 
						||
| 
								 | 
							
								            return rowsAffected == 1;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<bool> ToggleActivoAsync(int id, bool activar, int idUsuario, IDbTransaction transaction)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            const string sqlToggle = @"
							 | 
						||
| 
								 | 
							
								                UPDATE dbo.susc_Suscriptores SET
							 | 
						||
| 
								 | 
							
								                    Activo = @Activar,
							 | 
						||
| 
								 | 
							
								                    IdUsuarioMod = @IdUsuario,
							 | 
						||
| 
								 | 
							
								                    FechaMod = GETDATE()
							 | 
						||
| 
								 | 
							
								                WHERE IdSuscriptor = @Id;";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (transaction == null || transaction.Connection == null)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                throw new ArgumentNullException(nameof(transaction), "La transacción o su conexión no pueden ser nulas.");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            var rowsAffected = await transaction.Connection.ExecuteAsync(
							 | 
						||
| 
								 | 
							
								                sqlToggle, 
							 | 
						||
| 
								 | 
							
								                new { Activar = activar, IdUsuario = idUsuario, Id = id }, 
							 | 
						||
| 
								 | 
							
								                transaction: transaction
							 | 
						||
| 
								 | 
							
								            );
							 | 
						||
| 
								 | 
							
								            return rowsAffected == 1;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |