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