Ya perdí el hilo de los cambios pero ahi van.
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user