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;
 | |
|         }
 | |
|     }
 | |
| } |