175 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			175 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using Dapper; | ||
|  | using GestionIntegral.Api.Models.Contables; | ||
|  | using Microsoft.Extensions.Logging; | ||
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Data; | ||
|  | using System.Linq; | ||
|  | using System.Text; | ||
|  | using System.Threading.Tasks; | ||
|  | 
 | ||
|  | namespace GestionIntegral.Api.Data.Repositories.Contables | ||
|  | { | ||
|  |     public class PagoDistribuidorRepository : IPagoDistribuidorRepository | ||
|  |     { | ||
|  |         private readonly DbConnectionFactory _cf; | ||
|  |         private readonly ILogger<PagoDistribuidorRepository> _log; | ||
|  | 
 | ||
|  |         public PagoDistribuidorRepository(DbConnectionFactory cf, ILogger<PagoDistribuidorRepository> log) | ||
|  |         { | ||
|  |             _cf = cf; | ||
|  |             _log = log; | ||
|  |         } | ||
|  | 
 | ||
|  |         private string SelectQueryBase() => @"
 | ||
|  |             SELECT  | ||
|  |                 Id_Pago AS IdPago, Id_Distribuidor AS IdDistribuidor, Fecha, TipoMovimiento, Recibo, Monto, | ||
|  |                 Id_TipoPago AS IdTipoPago, Detalle, Id_Empresa AS IdEmpresa | ||
|  |             FROM dbo.cue_PagosDistribuidor";
 | ||
|  | 
 | ||
|  |         public async Task<IEnumerable<PagoDistribuidor>> GetAllAsync( | ||
|  |             DateTime? fechaDesde, DateTime? fechaHasta, | ||
|  |             int? idDistribuidor, int? idEmpresa, string? tipoMovimiento) | ||
|  |         { | ||
|  |             var sqlBuilder = new StringBuilder(SelectQueryBase()); | ||
|  |             sqlBuilder.Append(" WHERE 1=1"); | ||
|  |             var parameters = new DynamicParameters(); | ||
|  | 
 | ||
|  |             if (fechaDesde.HasValue) { sqlBuilder.Append(" AND Fecha >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); } | ||
|  |             if (fechaHasta.HasValue) { sqlBuilder.Append(" AND Fecha <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date); } | ||
|  |             if (idDistribuidor.HasValue) { sqlBuilder.Append(" AND Id_Distribuidor = @IdDistribuidorParam"); parameters.Add("IdDistribuidorParam", idDistribuidor.Value); } | ||
|  |             if (idEmpresa.HasValue) { sqlBuilder.Append(" AND Id_Empresa = @IdEmpresaParam"); parameters.Add("IdEmpresaParam", idEmpresa.Value); } | ||
|  |             if (!string.IsNullOrWhiteSpace(tipoMovimiento)) { sqlBuilder.Append(" AND TipoMovimiento = @TipoMovParam"); parameters.Add("TipoMovParam", tipoMovimiento); } | ||
|  |              | ||
|  |             sqlBuilder.Append(" ORDER BY Fecha DESC, Id_Pago DESC;"); | ||
|  | 
 | ||
|  |             try | ||
|  |             { | ||
|  |                 using var connection = _cf.CreateConnection(); | ||
|  |                 return await connection.QueryAsync<PagoDistribuidor>(sqlBuilder.ToString(), parameters); | ||
|  |             } | ||
|  |             catch (Exception ex) | ||
|  |             { | ||
|  |                 _log.LogError(ex, "Error al obtener todos los Pagos de Distribuidores."); | ||
|  |                 return Enumerable.Empty<PagoDistribuidor>(); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public async Task<PagoDistribuidor?> GetByIdAsync(int idPago) | ||
|  |         { | ||
|  |             var sql = SelectQueryBase() + " WHERE Id_Pago = @IdPagoParam"; | ||
|  |             try | ||
|  |             { | ||
|  |                 using var connection = _cf.CreateConnection(); | ||
|  |                 return await connection.QuerySingleOrDefaultAsync<PagoDistribuidor>(sql, new { IdPagoParam = idPago }); | ||
|  |             } | ||
|  |             catch (Exception ex) | ||
|  |             { | ||
|  |                 _log.LogError(ex, "Error al obtener PagoDistribuidor por ID: {IdPago}", idPago); | ||
|  |                 return null; | ||
|  |             } | ||
|  |         } | ||
|  |          | ||
|  |         public async Task<bool> ExistsByReciboAndTipoMovimientoAsync(int recibo, string tipoMovimiento, int? excludeIdPago = null) | ||
|  |         { | ||
|  |             var sqlBuilder = new StringBuilder("SELECT COUNT(1) FROM dbo.cue_PagosDistribuidor WHERE Recibo = @ReciboParam AND TipoMovimiento = @TipoMovParam"); | ||
|  |             var parameters = new DynamicParameters(); | ||
|  |             parameters.Add("ReciboParam", recibo); | ||
|  |             parameters.Add("TipoMovParam", tipoMovimiento); | ||
|  | 
 | ||
|  |             if (excludeIdPago.HasValue) | ||
|  |             { | ||
|  |                 sqlBuilder.Append(" AND Id_Pago != @ExcludeIdPagoParam"); | ||
|  |                 parameters.Add("ExcludeIdPagoParam", excludeIdPago.Value); | ||
|  |             } | ||
|  |             try | ||
|  |             { | ||
|  |                 using var connection = _cf.CreateConnection(); | ||
|  |                 return await connection.ExecuteScalarAsync<bool>(sqlBuilder.ToString(), parameters); | ||
|  |             } | ||
|  |             catch (Exception ex) | ||
|  |             { | ||
|  |                 _log.LogError(ex, "Error en ExistsByReciboAndTipoMovimientoAsync. Recibo: {Recibo}, Tipo: {Tipo}", recibo, tipoMovimiento); | ||
|  |                 return true; // Asumir que existe en caso de error para prevenir duplicados | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public async Task<PagoDistribuidor?> CreateAsync(PagoDistribuidor nuevoPago, int idUsuario, IDbTransaction transaction) | ||
|  |         { | ||
|  |             const string sqlInsert = @"
 | ||
|  |                 INSERT INTO dbo.cue_PagosDistribuidor (Id_Distribuidor, Fecha, TipoMovimiento, Recibo, Monto, Id_TipoPago, Detalle, Id_Empresa) | ||
|  |                 OUTPUT INSERTED.Id_Pago AS IdPago, INSERTED.Id_Distribuidor AS IdDistribuidor, INSERTED.Fecha, INSERTED.TipoMovimiento,  | ||
|  |                        INSERTED.Recibo, INSERTED.Monto, INSERTED.Id_TipoPago AS IdTipoPago, INSERTED.Detalle, INSERTED.Id_Empresa AS IdEmpresa | ||
|  |                 VALUES (@IdDistribuidor, @Fecha, @TipoMovimiento, @Recibo, @Monto, @IdTipoPago, @Detalle, @IdEmpresa);";
 | ||
|  |             const string sqlHistorico = @"
 | ||
|  |                 INSERT INTO dbo.cue_PagosDistribuidor_H  | ||
|  |                     (Id_Pago, Id_Distribuidor, Fecha, TipoMovimiento, Recibo, Monto, Id_TipoPago, Detalle, Id_Empresa, Id_Usuario, FechaMod, TipoMod) | ||
|  |                 VALUES (@IdPagoHist, @IdDistribuidorHist, @FechaHist, @TipoMovimientoHist, @ReciboHist, @MontoHist, @IdTipoPagoHist, @DetalleHist, @IdEmpresaHist, @IdUsuarioHist, @FechaModHist, @TipoModHist);";
 | ||
|  | 
 | ||
|  |             var inserted = await transaction.Connection!.QuerySingleAsync<PagoDistribuidor>(sqlInsert, nuevoPago, transaction); | ||
|  |             if (inserted == null || inserted.IdPago == 0) throw new DataException("Error al crear pago o ID no generado."); | ||
|  | 
 | ||
|  |             await transaction.Connection!.ExecuteAsync(sqlHistorico, new { | ||
|  |                 IdPagoHist = inserted.IdPago, IdDistribuidorHist = inserted.IdDistribuidor, FechaHist = inserted.Fecha, | ||
|  |                 TipoMovimientoHist = inserted.TipoMovimiento, ReciboHist = inserted.Recibo, MontoHist = inserted.Monto, | ||
|  |                 IdTipoPagoHist = inserted.IdTipoPago, DetalleHist = inserted.Detalle, IdEmpresaHist = inserted.IdEmpresa, | ||
|  |                 IdUsuarioHist = idUsuario, FechaModHist = DateTime.Now, TipoModHist = "Creado" | ||
|  |             }, transaction); | ||
|  |             return inserted; | ||
|  |         } | ||
|  | 
 | ||
|  |         public async Task<bool> UpdateAsync(PagoDistribuidor pagoAActualizar, int idUsuario, IDbTransaction transaction) | ||
|  |         { | ||
|  |             var actual = await transaction.Connection!.QuerySingleOrDefaultAsync<PagoDistribuidor>( | ||
|  |                 SelectQueryBase() + " WHERE Id_Pago = @IdPagoParam", | ||
|  |                 new { IdPagoParam = pagoAActualizar.IdPago }, transaction); | ||
|  |             if (actual == null) throw new KeyNotFoundException("Pago no encontrado."); | ||
|  | 
 | ||
|  |             // Campos que se permiten actualizar: Monto, Id_TipoPago, Detalle | ||
|  |             // Otros campos como IdDistribuidor, Fecha, TipoMovimiento, Recibo, IdEmpresa no deberían cambiar | ||
|  |             // para un pago ya registrado. Si necesitan cambiar, se debería anular/eliminar y crear uno nuevo. | ||
|  |             const string sqlUpdate = @"
 | ||
|  |                 UPDATE dbo.cue_PagosDistribuidor SET | ||
|  |                     Monto = @Monto, Id_TipoPago = @IdTipoPago, Detalle = @Detalle | ||
|  |                 WHERE Id_Pago = @IdPago;";
 | ||
|  |             const string sqlHistorico = @"
 | ||
|  |                 INSERT INTO dbo.cue_PagosDistribuidor_H  | ||
|  |                     (Id_Pago, Id_Distribuidor, Fecha, TipoMovimiento, Recibo, Monto, Id_TipoPago, Detalle, Id_Empresa, Id_Usuario, FechaMod, TipoMod) | ||
|  |                 VALUES (@IdPagoHist, @IdDistribuidorHist, @FechaHist, @TipoMovimientoHist, @ReciboHist, @MontoHist, @IdTipoPagoHist, @DetalleHist, @IdEmpresaHist, @IdUsuarioHist, @FechaModHist, @TipoModHist);";
 | ||
|  |              | ||
|  |             await transaction.Connection!.ExecuteAsync(sqlHistorico, new { | ||
|  |                 IdPagoHist = actual.IdPago, IdDistribuidorHist = actual.IdDistribuidor, FechaHist = actual.Fecha, | ||
|  |                 TipoMovimientoHist = actual.TipoMovimiento, ReciboHist = actual.Recibo, MontoHist = actual.Monto, // Valor ANTERIOR | ||
|  |                 IdTipoPagoHist = actual.IdTipoPago, DetalleHist = actual.Detalle, IdEmpresaHist = actual.IdEmpresa, // Valores ANTERIORES | ||
|  |                 IdUsuarioHist = idUsuario, FechaModHist = DateTime.Now, TipoModHist = "Actualizado" | ||
|  |             }, transaction); | ||
|  | 
 | ||
|  |             var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlUpdate, pagoAActualizar, transaction); | ||
|  |             return rowsAffected == 1; | ||
|  |         } | ||
|  | 
 | ||
|  |         public async Task<bool> DeleteAsync(int idPago, int idUsuario, IDbTransaction transaction) | ||
|  |         { | ||
|  |             var actual = await transaction.Connection!.QuerySingleOrDefaultAsync<PagoDistribuidor>( | ||
|  |                SelectQueryBase() + " WHERE Id_Pago = @IdPagoParam", | ||
|  |                new { IdPagoParam = idPago }, transaction); | ||
|  |             if (actual == null) throw new KeyNotFoundException("Pago no encontrado para eliminar."); | ||
|  | 
 | ||
|  |             const string sqlDelete = "DELETE FROM dbo.cue_PagosDistribuidor WHERE Id_Pago = @IdPagoParam"; | ||
|  |             const string sqlHistorico = @"
 | ||
|  |                  INSERT INTO dbo.cue_PagosDistribuidor_H  | ||
|  |                     (Id_Pago, Id_Distribuidor, Fecha, TipoMovimiento, Recibo, Monto, Id_TipoPago, Detalle, Id_Empresa, Id_Usuario, FechaMod, TipoMod) | ||
|  |                 VALUES (@IdPagoHist, @IdDistribuidorHist, @FechaHist, @TipoMovimientoHist, @ReciboHist, @MontoHist, @IdTipoPagoHist, @DetalleHist, @IdEmpresaHist, @IdUsuarioHist, @FechaModHist, @TipoModHist);";
 | ||
|  | 
 | ||
|  |             await transaction.Connection!.ExecuteAsync(sqlHistorico, new { | ||
|  |                 IdPagoHist = actual.IdPago, IdDistribuidorHist = actual.IdDistribuidor, FechaHist = actual.Fecha, | ||
|  |                 TipoMovimientoHist = actual.TipoMovimiento, ReciboHist = actual.Recibo, MontoHist = actual.Monto, | ||
|  |                 IdTipoPagoHist = actual.IdTipoPago, DetalleHist = actual.Detalle, IdEmpresaHist = actual.IdEmpresa, | ||
|  |                 IdUsuarioHist = idUsuario, FechaModHist = DateTime.Now, TipoModHist = "Eliminado" | ||
|  |             }, transaction); | ||
|  | 
 | ||
|  |             var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlDelete, new { IdPagoParam = idPago }, transaction); | ||
|  |             return rowsAffected == 1; | ||
|  |         } | ||
|  |     } | ||
|  | } |