Backend:
Diseño de un AuditoriaController con un patrón para añadir endpoints de historial para diferentes entidades. Implementación de la lógica de servicio y repositorio para obtener datos de las tablas _H para: Usuarios (gral_Usuarios_H) Pagos de Distribuidores (cue_PagosDistribuidor_H) Notas de Crédito/Débito (cue_CreditosDebitos_H) Entradas/Salidas de Distribuidores (dist_EntradasSalidas_H) Entradas/Salidas de Canillitas (dist_EntradasSalidasCanillas_H) Novedades de Canillitas (dist_dtNovedadesCanillas_H) Ajustes Manuales de Saldo (cue_SaldoAjustesHistorial) Tipos de Pago (cue_dtTipopago_H) Canillitas (Maestro) (dist_dtCanillas_H) Distribuidores (Maestro) (dist_dtDistribuidores_H) Empresas (Maestro) (dist_dtEmpresas_H) DTOs específicos para cada tipo de historial, incluyendo NombreUsuarioModifico. Frontend: Servicio auditoriaService.ts con métodos para llamar a cada endpoint de historial. Página AuditoriaGeneralPage.tsx con: Selector de "Tipo de Entidad a Auditar". Filtros comunes (Fechas, Usuario Modificador, Tipo de Modificación, ID Entidad). Un DataGrid que muestra las columnas dinámicamente según el tipo de entidad seleccionada. Lógica para cargar los datos correspondientes. DTOs de historial en TypeScript. Actualizaciones en AppRoutes.tsx y MainLayout.tsx para la nueva sección de Auditoría (restringida a SuperAdmin).
This commit is contained in:
@@ -16,6 +16,9 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
Task<NotaCreditoDebito?> CreateAsync(NotaCreditoDebito nuevaNota, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> UpdateAsync(NotaCreditoDebito notaAActualizar, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> DeleteAsync(int idNota, int idUsuario, IDbTransaction transaction);
|
||||
// No se suele validar unicidad por referencia, ya que podría repetirse.
|
||||
Task<IEnumerable<(NotaCreditoDebitoHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idNotaOriginal); // Para filtrar por una nota específica
|
||||
}
|
||||
}
|
||||
@@ -17,5 +17,9 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
Task<bool> UpdateAsync(PagoDistribuidor pagoAActualizar, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> DeleteAsync(int idPago, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> ExistsByReciboAndTipoMovimientoAsync(int recibo, string tipoMovimiento, int? excludeIdPago = null);
|
||||
Task<IEnumerable<(PagoDistribuidorHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idPagoOriginal); // Para filtrar por un pago específico
|
||||
}
|
||||
}
|
||||
@@ -24,5 +24,9 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
Task<Saldo?> GetSaldoAsync(string destino, int idDestino, int idEmpresa, IDbTransaction? transaction = null);
|
||||
// Para registrar el historial de ajuste
|
||||
Task CreateSaldoAjusteHistorialAsync(SaldoAjusteHistorial historialEntry, IDbTransaction transaction);
|
||||
Task<IEnumerable<(SaldoAjusteHistorial Historial, string NombreUsuarioModifico)>> GetHistorialAjustesAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico,
|
||||
string? destino, int? idDestino, int? idEmpresa);
|
||||
}
|
||||
}
|
||||
@@ -13,5 +13,9 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
Task<bool> DeleteAsync(int id, int idUsuario); // Devuelve true si fue exitoso
|
||||
Task<bool> ExistsByNameAsync(string nombre, int? excludeId = null);
|
||||
Task<bool> IsInUseAsync(int id);
|
||||
Task<IEnumerable<(TipoPagoHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idTipoPagoOriginal);
|
||||
}
|
||||
}
|
||||
@@ -41,7 +41,7 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
if (idDestino.HasValue) { sqlBuilder.Append(" AND Id_Destino = @IdDestinoParam"); parameters.Add("IdDestinoParam", idDestino.Value); }
|
||||
if (idEmpresa.HasValue) { sqlBuilder.Append(" AND Id_Empresa = @IdEmpresaParam"); parameters.Add("IdEmpresaParam", idEmpresa.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoNota)) { sqlBuilder.Append(" AND Tipo = @TipoParam"); parameters.Add("TipoParam", tipoNota); }
|
||||
|
||||
|
||||
sqlBuilder.Append(" ORDER BY Fecha DESC, Id_Nota DESC;");
|
||||
|
||||
try
|
||||
@@ -86,11 +86,20 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
var inserted = await transaction.Connection!.QuerySingleAsync<NotaCreditoDebito>(sqlInsert, nuevaNota, transaction);
|
||||
if (inserted == null || inserted.IdNota == 0) throw new DataException("Error al crear la nota o ID no generado.");
|
||||
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new {
|
||||
IdNotaHist = inserted.IdNota, DestinoHist = inserted.Destino, IdDestinoHist = inserted.IdDestino,
|
||||
ReferenciaHist = inserted.Referencia, TipoHist = inserted.Tipo, FechaHist = inserted.Fecha, MontoHist = inserted.Monto,
|
||||
ObservacionesHist = inserted.Observaciones, IdEmpresaHist = inserted.IdEmpresa,
|
||||
IdUsuarioHist = idUsuario, FechaModHist = DateTime.Now, TipoModHist = "Creada"
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new
|
||||
{
|
||||
IdNotaHist = inserted.IdNota,
|
||||
DestinoHist = inserted.Destino,
|
||||
IdDestinoHist = inserted.IdDestino,
|
||||
ReferenciaHist = inserted.Referencia,
|
||||
TipoHist = inserted.Tipo,
|
||||
FechaHist = inserted.Fecha,
|
||||
MontoHist = inserted.Monto,
|
||||
ObservacionesHist = inserted.Observaciones,
|
||||
IdEmpresaHist = inserted.IdEmpresa,
|
||||
IdUsuarioHist = idUsuario,
|
||||
FechaModHist = DateTime.Now,
|
||||
TipoModHist = "Creada"
|
||||
}, transaction);
|
||||
return inserted;
|
||||
}
|
||||
@@ -107,23 +116,33 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
UPDATE dbo.cue_CreditosDebitos SET
|
||||
Monto = @Monto, Observaciones = @Observaciones
|
||||
WHERE Id_Nota = @IdNota;";
|
||||
const string sqlHistorico = @"
|
||||
const string sqlHistorico = @"
|
||||
INSERT INTO dbo.cue_CreditosDebitos_H
|
||||
(Id_Nota, Destino, Id_Destino, Referencia, Tipo, Fecha, Monto, Observaciones, Id_Empresa, Id_Usuario, FechaMod, TipoMod)
|
||||
VALUES (@IdNotaHist, @DestinoHist, @IdDestinoHist, @ReferenciaHist, @TipoHist, @FechaHist, @MontoHist, @ObservacionesHist, @IdEmpresaHist, @IdUsuarioHist, @FechaModHist, @TipoModHist);";
|
||||
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new {
|
||||
IdNotaHist = actual.IdNota, DestinoHist = actual.Destino, IdDestinoHist = actual.IdDestino, ReferenciaHist = actual.Referencia,
|
||||
TipoHist = actual.Tipo, FechaHist = actual.Fecha, MontoHist = actual.Monto, // Valor ANTERIOR
|
||||
ObservacionesHist = actual.Observaciones, IdEmpresaHist = actual.IdEmpresa, // Valor ANTERIOR
|
||||
IdUsuarioHist = idUsuario, FechaModHist = DateTime.Now, TipoModHist = "Actualizada"
|
||||
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new
|
||||
{
|
||||
IdNotaHist = actual.IdNota,
|
||||
DestinoHist = actual.Destino,
|
||||
IdDestinoHist = actual.IdDestino,
|
||||
ReferenciaHist = actual.Referencia,
|
||||
TipoHist = actual.Tipo,
|
||||
FechaHist = actual.Fecha,
|
||||
MontoHist = actual.Monto, // Valor ANTERIOR
|
||||
ObservacionesHist = actual.Observaciones,
|
||||
IdEmpresaHist = actual.IdEmpresa, // Valor ANTERIOR
|
||||
IdUsuarioHist = idUsuario,
|
||||
FechaModHist = DateTime.Now,
|
||||
TipoModHist = "Actualizada"
|
||||
}, transaction);
|
||||
|
||||
var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlUpdate, new {
|
||||
var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlUpdate, new
|
||||
{
|
||||
notaAActualizar.Monto,
|
||||
notaAActualizar.Observaciones,
|
||||
notaAActualizar.IdNota
|
||||
} , transaction);
|
||||
}, transaction);
|
||||
return rowsAffected == 1;
|
||||
}
|
||||
|
||||
@@ -140,14 +159,67 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
(Id_Nota, Destino, Id_Destino, Referencia, Tipo, Fecha, Monto, Observaciones, Id_Empresa, Id_Usuario, FechaMod, TipoMod)
|
||||
VALUES (@IdNotaHist, @DestinoHist, @IdDestinoHist, @ReferenciaHist, @TipoHist, @FechaHist, @MontoHist, @ObservacionesHist, @IdEmpresaHist, @IdUsuarioHist, @FechaModHist, @TipoModHist);";
|
||||
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new {
|
||||
IdNotaHist = actual.IdNota, DestinoHist = actual.Destino, IdDestinoHist = actual.IdDestino, ReferenciaHist = actual.Referencia,
|
||||
TipoHist = actual.Tipo, FechaHist = actual.Fecha, MontoHist = actual.Monto, ObservacionesHist = actual.Observaciones, IdEmpresaHist = actual.IdEmpresa,
|
||||
IdUsuarioHist = idUsuario, FechaModHist = DateTime.Now, TipoModHist = "Eliminada"
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new
|
||||
{
|
||||
IdNotaHist = actual.IdNota,
|
||||
DestinoHist = actual.Destino,
|
||||
IdDestinoHist = actual.IdDestino,
|
||||
ReferenciaHist = actual.Referencia,
|
||||
TipoHist = actual.Tipo,
|
||||
FechaHist = actual.Fecha,
|
||||
MontoHist = actual.Monto,
|
||||
ObservacionesHist = actual.Observaciones,
|
||||
IdEmpresaHist = actual.IdEmpresa,
|
||||
IdUsuarioHist = idUsuario,
|
||||
FechaModHist = DateTime.Now,
|
||||
TipoModHist = "Eliminada"
|
||||
}, transaction);
|
||||
|
||||
var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlDelete, new { IdNotaParam = idNota }, transaction);
|
||||
return rowsAffected == 1;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<(NotaCreditoDebitoHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idNotaOriginal)
|
||||
{
|
||||
using var connection = _cf.CreateConnection();
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.Id_Nota, h.Destino, h.Id_Destino, h.Referencia, h.Tipo, h.Fecha, h.Monto,
|
||||
h.Observaciones, h.Id_Empresa,
|
||||
h.Id_Usuario, h.FechaMod, h.TipoMod,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.cue_CreditosDebitos_H h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_Usuario = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaMod >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaMod <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_Usuario = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoModificacion)) { sqlBuilder.Append(" AND h.TipoMod = @TipoModParam"); parameters.Add("TipoModParam", tipoModificacion); }
|
||||
if (idNotaOriginal.HasValue) { sqlBuilder.Append(" AND h.Id_Nota = @IdNotaOriginalParam"); parameters.Add("IdNotaOriginalParam", idNotaOriginal.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaMod DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<NotaCreditoDebitoHistorico, string, (NotaCreditoDebitoHistorico, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_log.LogError(ex, "Error al obtener historial de Notas C/D.");
|
||||
return Enumerable.Empty<(NotaCreditoDebitoHistorico, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
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
|
||||
@@ -69,7 +69,7 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
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");
|
||||
@@ -109,11 +109,20 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
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"
|
||||
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;
|
||||
}
|
||||
@@ -136,12 +145,21 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
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"
|
||||
|
||||
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);
|
||||
@@ -161,15 +179,67 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
(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"
|
||||
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;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<(PagoDistribuidorHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idPagoOriginal)
|
||||
{
|
||||
using var connection = _cf.CreateConnection();
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.Id_Pago, h.Id_Distribuidor, h.Fecha, h.TipoMovimiento, h.Recibo, h.Monto,
|
||||
h.Id_TipoPago, h.Detalle, h.Id_Empresa,
|
||||
h.Id_Usuario, h.FechaMod, h.TipoMod,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.cue_PagosDistribuidor_H h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_Usuario = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaMod >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaMod <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_Usuario = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoModificacion)) { sqlBuilder.Append(" AND h.TipoMod = @TipoModParam"); parameters.Add("TipoModParam", tipoModificacion); }
|
||||
if (idPagoOriginal.HasValue) { sqlBuilder.Append(" AND h.Id_Pago = @IdPagoOriginalParam"); parameters.Add("IdPagoOriginalParam", idPagoOriginal.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaMod DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<PagoDistribuidorHistorico, string, (PagoDistribuidorHistorico, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_log.LogError(ex, "Error al obtener historial de Pagos de Distribuidores.");
|
||||
return Enumerable.Empty<(PagoDistribuidorHistorico, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -188,5 +188,49 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
|
||||
await transaction.Connection!.ExecuteAsync(sql, historialEntry, transaction);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<(SaldoAjusteHistorial Historial, string NombreUsuarioModifico)>> GetHistorialAjustesAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico,
|
||||
string? destino, int? idDestino, int? idEmpresa)
|
||||
{
|
||||
using var connection = _connectionFactory.CreateConnection();
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.IdSaldoAjusteHist, h.Destino, h.Id_Destino, h.Id_Empresa,
|
||||
h.MontoAjuste, h.SaldoAnterior, h.SaldoNuevo, h.Justificacion,
|
||||
h.FechaAjuste, h.Id_UsuarioAjuste,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.cue_SaldoAjustesHistorial h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_UsuarioAjuste = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaAjuste >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaAjuste <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_UsuarioAjuste = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(destino)) { sqlBuilder.Append(" AND h.Destino = @DestinoParam"); parameters.Add("DestinoParam", destino); }
|
||||
if (idDestino.HasValue) { sqlBuilder.Append(" AND h.Id_Destino = @IdDestinoParam"); parameters.Add("IdDestinoParam", idDestino.Value); }
|
||||
if (idEmpresa.HasValue) { sqlBuilder.Append(" AND h.Id_Empresa = @IdEmpresaParam"); parameters.Add("IdEmpresaParam", idEmpresa.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaAjuste DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<SaldoAjusteHistorial, string, (SaldoAjusteHistorial, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error al obtener historial de Ajustes de Saldo.");
|
||||
return Enumerable.Empty<(SaldoAjusteHistorial, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ using Dapper;
|
||||
using GestionIntegral.Api.Models.Contables;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
@@ -284,5 +285,47 @@ namespace GestionIntegral.Api.Data.Repositories.Contables
|
||||
return true; // Asumir que está en uso si hay error para prevenir borrado incorrecto
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<(TipoPagoHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idTipoPagoOriginal)
|
||||
{
|
||||
using var connection = _connectionFactory.CreateConnection(); // Asumiendo _cf es tu DbConnectionFactory
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.Id_TipoPago, h.Nombre, h.Detalle,
|
||||
h.Id_Usuario, h.FechaMod, h.TipoMod,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.cue_dtTipopago_H h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_Usuario = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaMod >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaMod <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_Usuario = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoModificacion)) { sqlBuilder.Append(" AND h.TipoMod = @TipoModParam"); parameters.Add("TipoModParam", tipoModificacion); }
|
||||
if (idTipoPagoOriginal.HasValue) { sqlBuilder.Append(" AND h.Id_TipoPago = @IdTipoPagoOriginalParam"); parameters.Add("IdTipoPagoOriginalParam", idTipoPagoOriginal.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaMod DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<TipoPagoHistorico, string, (TipoPagoHistorico, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error al obtener historial de Tipos de Pago."); // Asumiendo _log
|
||||
return Enumerable.Empty<(TipoPagoHistorico, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
using Dapper;
|
||||
using GestionIntegral.Api.Models.Distribucion;
|
||||
using Microsoft.Extensions.Logging; // Para ILogger
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text; // Para StringBuilder
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
{
|
||||
public class CambioParadaRepository : ICambioParadaRepository
|
||||
{
|
||||
private readonly DbConnectionFactory _cf;
|
||||
private readonly ILogger<CambioParadaRepository> _logger;
|
||||
|
||||
public CambioParadaRepository(DbConnectionFactory cf, ILogger<CambioParadaRepository> logger)
|
||||
{
|
||||
_cf = cf;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
private async Task LogHistorialAsync(CambioParadaCanilla paradaOriginal, int idUsuario, string tipoMod, IDbConnection connection, IDbTransaction? transaction)
|
||||
{
|
||||
var historial = new CambioParadaCanillaHistorial
|
||||
{
|
||||
Id_Registro = paradaOriginal.IdRegistro,
|
||||
Id_Canilla = paradaOriginal.IdCanilla,
|
||||
Parada = paradaOriginal.Parada,
|
||||
VigenciaD = paradaOriginal.VigenciaD,
|
||||
VigenciaH = paradaOriginal.VigenciaH,
|
||||
Id_Usuario = idUsuario,
|
||||
FechaMod = DateTime.Now,
|
||||
TipoMod = tipoMod
|
||||
};
|
||||
const string sqlHistorial = @"
|
||||
INSERT INTO dbo.dist_CambiosParadasCanillas_H
|
||||
(Id_Registro, Id_Canilla, Parada, VigenciaD, VigenciaH, Id_Usuario, FechaMod, TipoMod)
|
||||
VALUES
|
||||
(@Id_Registro, @Id_Canilla, @Parada, @VigenciaD, @VigenciaH, @Id_Usuario, @FechaMod, @TipoMod);";
|
||||
await connection.ExecuteAsync(sqlHistorial, historial, transaction);
|
||||
}
|
||||
|
||||
|
||||
public async Task<IEnumerable<CambioParadaCanilla>> GetByCanillaAsync(int idCanilla)
|
||||
{
|
||||
using var connection = _cf.CreateConnection();
|
||||
const string sql = @"
|
||||
SELECT Id_Registro AS IdRegistro, Id_Canilla AS IdCanilla, Parada, VigenciaD, VigenciaH
|
||||
FROM dbo.dist_CambiosParadasCanillas
|
||||
WHERE Id_Canilla = @IdCanilla
|
||||
ORDER BY VigenciaD DESC, Id_Registro DESC;";
|
||||
return await connection.QueryAsync<CambioParadaCanilla>(sql, new { IdCanilla = idCanilla });
|
||||
}
|
||||
|
||||
public async Task<CambioParadaCanilla?> GetByIdAsync(int idRegistro)
|
||||
{
|
||||
using var connection = _cf.CreateConnection();
|
||||
const string sql = @"
|
||||
SELECT Id_Registro AS IdRegistro, Id_Canilla AS IdCanilla, Parada, VigenciaD, VigenciaH
|
||||
FROM dbo.dist_CambiosParadasCanillas
|
||||
WHERE Id_Registro = @IdRegistro;";
|
||||
return await connection.QuerySingleOrDefaultAsync<CambioParadaCanilla>(sql, new { IdRegistro = idRegistro });
|
||||
}
|
||||
|
||||
public async Task<CambioParadaCanilla?> GetCurrentParadaAsync(int idCanilla, IDbTransaction? transaction = null)
|
||||
{
|
||||
const string sql = @"
|
||||
SELECT TOP 1 Id_Registro AS IdRegistro, Id_Canilla AS IdCanilla, Parada, VigenciaD, VigenciaH
|
||||
FROM dbo.dist_CambiosParadasCanillas
|
||||
WHERE Id_Canilla = @IdCanilla AND VigenciaH IS NULL
|
||||
ORDER BY VigenciaD DESC, Id_Registro DESC;"; // Por si hay un error y quedaron varias abiertas
|
||||
|
||||
var conn = transaction?.Connection ?? _cf.CreateConnection();
|
||||
bool manageConnection = transaction == null;
|
||||
if (manageConnection && conn.State != ConnectionState.Open) { if (conn is System.Data.Common.DbConnection dbConn) await dbConn.OpenAsync(); else conn.Open(); }
|
||||
try
|
||||
{
|
||||
return await conn.QuerySingleOrDefaultAsync<CambioParadaCanilla>(sql, new { IdCanilla = idCanilla }, transaction);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (manageConnection && conn.State == ConnectionState.Open) { if (conn is System.Data.Common.DbConnection dbConn) await dbConn.CloseAsync(); else conn.Close(); }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async Task<CambioParadaCanilla?> CreateAsync(CambioParadaCanilla nuevaParada, int idUsuario, IDbTransaction transaction)
|
||||
{
|
||||
const string sqlInsert = @"
|
||||
INSERT INTO dbo.dist_CambiosParadasCanillas (Id_Canilla, Parada, VigenciaD, VigenciaH)
|
||||
OUTPUT INSERTED.Id_Registro AS IdRegistro, INSERTED.Id_Canilla AS IdCanilla, INSERTED.Parada, INSERTED.VigenciaD, INSERTED.VigenciaH
|
||||
VALUES (@IdCanilla, @Parada, @VigenciaD, @VigenciaH);";
|
||||
|
||||
// VigenciaH es null al crear una nueva parada activa
|
||||
var inserted = await transaction.Connection!.QuerySingleAsync<CambioParadaCanilla>(sqlInsert,
|
||||
new { nuevaParada.IdCanilla, nuevaParada.Parada, nuevaParada.VigenciaD, VigenciaH = (DateTime?)null },
|
||||
transaction);
|
||||
|
||||
if (inserted == null || inserted.IdRegistro == 0) throw new DataException("Error al crear cambio de parada o ID no generado.");
|
||||
|
||||
await LogHistorialAsync(inserted, idUsuario, "Creada", transaction.Connection!, transaction);
|
||||
return inserted;
|
||||
}
|
||||
|
||||
public async Task<bool> UpdateVigenciaHAsync(int idRegistro, DateTime vigenciaH, int idUsuario, IDbTransaction transaction)
|
||||
{
|
||||
var paradaOriginal = await GetByIdAsync(idRegistro); // Obtener para el log
|
||||
if (paradaOriginal == null) throw new KeyNotFoundException("Registro de parada no encontrado para actualizar VigenciaH.");
|
||||
|
||||
// Loggear ANTES de actualizar
|
||||
await LogHistorialAsync(paradaOriginal, idUsuario, "Cerrada", transaction.Connection!, transaction);
|
||||
|
||||
const string sqlUpdate = @"
|
||||
UPDATE dbo.dist_CambiosParadasCanillas
|
||||
SET VigenciaH = @VigenciaH
|
||||
WHERE Id_Registro = @IdRegistro;";
|
||||
var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlUpdate,
|
||||
new { VigenciaH = vigenciaH.Date, IdRegistro = idRegistro },
|
||||
transaction);
|
||||
|
||||
return rowsAffected == 1;
|
||||
}
|
||||
|
||||
public async Task<bool> DeleteAsync(int idRegistro, int idUsuario, IDbTransaction transaction)
|
||||
{
|
||||
var paradaOriginal = await GetByIdAsync(idRegistro);
|
||||
if (paradaOriginal == null) throw new KeyNotFoundException("Registro de parada no encontrado para eliminar.");
|
||||
|
||||
// Loggear ANTES de eliminar
|
||||
await LogHistorialAsync(paradaOriginal, idUsuario, "Eliminada", transaction.Connection!, transaction);
|
||||
|
||||
const string sqlDelete = "DELETE FROM dbo.dist_CambiosParadasCanillas WHERE Id_Registro = @IdRegistro;";
|
||||
var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlDelete, new { IdRegistro = idRegistro }, transaction);
|
||||
return rowsAffected == 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -259,5 +259,47 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
var rowsAffected = await connection.ExecuteAsync(sqlUpdate, new { BajaParam = darDeBaja, FechaBajaParam = (darDeBaja ? fechaBaja : null), IdCanillaParam = id }, transaction);
|
||||
return rowsAffected == 1;
|
||||
}
|
||||
public async Task<IEnumerable<(CanillaHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idCanillaOriginal)
|
||||
{
|
||||
using var connection = _connectionFactory.CreateConnection(); // Asumiendo _cf es tu DbConnectionFactory
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.Id_Canilla, h.Legajo, h.NomApe, h.Parada, h.Id_Zona, h.Accionista, h.Obs,
|
||||
h.Empresa, h.Baja, h.FechaBaja,
|
||||
h.Id_Usuario, h.FechaMod, h.TipoMod,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.dist_dtCanillas_H h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_Usuario = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaMod >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaMod <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_Usuario = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoModificacion)) { sqlBuilder.Append(" AND h.TipoMod = @TipoModParam"); parameters.Add("TipoModParam", tipoModificacion); }
|
||||
if (idCanillaOriginal.HasValue) { sqlBuilder.Append(" AND h.Id_Canilla = @IdCanillaOriginalParam"); parameters.Add("IdCanillaOriginalParam", idCanillaOriginal.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaMod DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<CanillaHistorico, string, (CanillaHistorico, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error al obtener historial de Canillitas (Maestro).");
|
||||
return Enumerable.Empty<(CanillaHistorico, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -62,7 +62,7 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
return Enumerable.Empty<(Distribuidor, string?)>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async Task<IEnumerable<DistribuidorDropdownDto?>> GetAllDropdownAsync()
|
||||
{
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
@@ -70,7 +70,7 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
Id_Distribuidor AS IdDistribuidor, Nombre
|
||||
FROM dbo.dist_dtDistribuidores
|
||||
WHERE 1=1");
|
||||
var parameters = new DynamicParameters();
|
||||
var parameters = new DynamicParameters();
|
||||
sqlBuilder.Append(" ORDER BY Nombre;");
|
||||
try
|
||||
{
|
||||
@@ -129,7 +129,7 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error al obtener Distribuidor por ID: {IdDistribuidor}", id);
|
||||
_logger.LogError(ex, "Error al obtener Distribuidor por ID: {IdDistribuidor}", id);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -149,7 +149,7 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error al obtener Distribuidor (simple) por ID: {IdDistribuidor}", id);
|
||||
_logger.LogError(ex, "Error al obtener Distribuidor (simple) por ID: {IdDistribuidor}", id);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -171,7 +171,7 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error en ExistsByNroDocAsync. NroDoc: {NroDoc}", nroDoc);
|
||||
_logger.LogError(ex, "Error en ExistsByNroDocAsync. NroDoc: {NroDoc}", nroDoc);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -227,7 +227,7 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
OUTPUT INSERTED.Id_Distribuidor AS IdDistribuidor, INSERTED.Nombre, INSERTED.Contacto, INSERTED.NroDoc, INSERTED.Id_Zona AS IdZona,
|
||||
INSERTED.Calle, INSERTED.Numero, INSERTED.Piso, INSERTED.Depto, INSERTED.Telefono, INSERTED.Email, INSERTED.Localidad
|
||||
VALUES (@Nombre, @Contacto, @NroDoc, @IdZona, @Calle, @Numero, @Piso, @Depto, @Telefono, @Email, @Localidad);";
|
||||
|
||||
|
||||
var connection = transaction.Connection!;
|
||||
var inserted = await connection.QuerySingleAsync<Distribuidor>(sqlInsert, nuevoDistribuidor, transaction);
|
||||
if (inserted == null || inserted.IdDistribuidor == 0) throw new DataException("Error al crear distribuidor o al obtener el ID generado.");
|
||||
@@ -239,9 +239,21 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
|
||||
await connection.ExecuteAsync(sqlInsertHistorico, new
|
||||
{
|
||||
IdDistribuidorParam = inserted.IdDistribuidor, NombreParam = inserted.Nombre, ContactoParam = inserted.Contacto, NroDocParam = inserted.NroDoc, IdZonaParam = inserted.IdZona,
|
||||
CalleParam = inserted.Calle, NumeroParam = inserted.Numero, PisoParam = inserted.Piso, DeptoParam = inserted.Depto, TelefonoParam = inserted.Telefono, EmailParam = inserted.Email, LocalidadParam = inserted.Localidad,
|
||||
IdUsuarioParam = idUsuario, FechaModParam = DateTime.Now, TipoModParam = "Creado"
|
||||
IdDistribuidorParam = inserted.IdDistribuidor,
|
||||
NombreParam = inserted.Nombre,
|
||||
ContactoParam = inserted.Contacto,
|
||||
NroDocParam = inserted.NroDoc,
|
||||
IdZonaParam = inserted.IdZona,
|
||||
CalleParam = inserted.Calle,
|
||||
NumeroParam = inserted.Numero,
|
||||
PisoParam = inserted.Piso,
|
||||
DeptoParam = inserted.Depto,
|
||||
TelefonoParam = inserted.Telefono,
|
||||
EmailParam = inserted.Email,
|
||||
LocalidadParam = inserted.Localidad,
|
||||
IdUsuarioParam = idUsuario,
|
||||
FechaModParam = DateTime.Now,
|
||||
TipoModParam = "Creado"
|
||||
}, transaction);
|
||||
return inserted;
|
||||
}
|
||||
@@ -268,9 +280,21 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
|
||||
await connection.ExecuteAsync(sqlInsertHistorico, new
|
||||
{
|
||||
IdDistribuidorParam = actual.IdDistribuidor, NombreParam = actual.Nombre, ContactoParam = actual.Contacto, NroDocParam = actual.NroDoc, IdZonaParam = actual.IdZona,
|
||||
CalleParam = actual.Calle, NumeroParam = actual.Numero, PisoParam = actual.Piso, DeptoParam = actual.Depto, TelefonoParam = actual.Telefono, EmailParam = actual.Email, LocalidadParam = actual.Localidad,
|
||||
IdUsuarioParam = idUsuario, FechaModParam = DateTime.Now, TipoModParam = "Actualizado"
|
||||
IdDistribuidorParam = actual.IdDistribuidor,
|
||||
NombreParam = actual.Nombre,
|
||||
ContactoParam = actual.Contacto,
|
||||
NroDocParam = actual.NroDoc,
|
||||
IdZonaParam = actual.IdZona,
|
||||
CalleParam = actual.Calle,
|
||||
NumeroParam = actual.Numero,
|
||||
PisoParam = actual.Piso,
|
||||
DeptoParam = actual.Depto,
|
||||
TelefonoParam = actual.Telefono,
|
||||
EmailParam = actual.Email,
|
||||
LocalidadParam = actual.Localidad,
|
||||
IdUsuarioParam = idUsuario,
|
||||
FechaModParam = DateTime.Now,
|
||||
TipoModParam = "Actualizado"
|
||||
}, transaction);
|
||||
|
||||
var rowsAffected = await connection.ExecuteAsync(sqlUpdate, distribuidorAActualizar, transaction);
|
||||
@@ -295,13 +319,68 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
|
||||
await connection.ExecuteAsync(sqlInsertHistorico, new
|
||||
{
|
||||
IdDistribuidorParam = actual.IdDistribuidor, NombreParam = actual.Nombre, ContactoParam = actual.Contacto, NroDocParam = actual.NroDoc, IdZonaParam = actual.IdZona,
|
||||
CalleParam = actual.Calle, NumeroParam = actual.Numero, PisoParam = actual.Piso, DeptoParam = actual.Depto, TelefonoParam = actual.Telefono, EmailParam = actual.Email, LocalidadParam = actual.Localidad,
|
||||
IdUsuarioParam = idUsuario, FechaModParam = DateTime.Now, TipoModParam = "Eliminado"
|
||||
IdDistribuidorParam = actual.IdDistribuidor,
|
||||
NombreParam = actual.Nombre,
|
||||
ContactoParam = actual.Contacto,
|
||||
NroDocParam = actual.NroDoc,
|
||||
IdZonaParam = actual.IdZona,
|
||||
CalleParam = actual.Calle,
|
||||
NumeroParam = actual.Numero,
|
||||
PisoParam = actual.Piso,
|
||||
DeptoParam = actual.Depto,
|
||||
TelefonoParam = actual.Telefono,
|
||||
EmailParam = actual.Email,
|
||||
LocalidadParam = actual.Localidad,
|
||||
IdUsuarioParam = idUsuario,
|
||||
FechaModParam = DateTime.Now,
|
||||
TipoModParam = "Eliminado"
|
||||
}, transaction);
|
||||
|
||||
var rowsAffected = await connection.ExecuteAsync(sqlDelete, new { IdParam = id }, transaction);
|
||||
return rowsAffected == 1;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<(DistribuidorHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idDistribuidorOriginal)
|
||||
{
|
||||
using var connection = _connectionFactory.CreateConnection(); // Asumiendo _connectionFactory
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.Id_Distribuidor, h.Nombre, h.Contacto, h.NroDoc, h.Id_Zona, h.Calle, h.Numero,
|
||||
h.Piso, h.Depto, h.Telefono, h.Email, h.Localidad,
|
||||
h.Id_Usuario, h.FechaMod, h.TipoMod,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.dist_dtDistribuidores_H h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_Usuario = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaMod >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaMod <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_Usuario = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoModificacion)) { sqlBuilder.Append(" AND h.TipoMod = @TipoModParam"); parameters.Add("TipoModParam", tipoModificacion); }
|
||||
if (idDistribuidorOriginal.HasValue) { sqlBuilder.Append(" AND h.Id_Distribuidor = @IdDistribuidorOriginalParam"); parameters.Add("IdDistribuidorOriginalParam", idDistribuidorOriginal.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaMod DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<DistribuidorHistorico, string, (DistribuidorHistorico, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error al obtener historial de Distribuidores (Maestro)."); // Asumiendo _logger
|
||||
return Enumerable.Empty<(DistribuidorHistorico, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -257,5 +257,47 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
|
||||
return rowsAffected == 1;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<(EmpresaHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idEmpresaOriginal)
|
||||
{
|
||||
using var connection = _connectionFactory.CreateConnection(); // Asumiendo _cf
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.Id_Empresa, h.Nombre, h.Detalle,
|
||||
h.Id_Usuario, h.FechaMod, h.TipoMod,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.dist_dtEmpresas_H h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_Usuario = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaMod >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaMod <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_Usuario = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoModificacion)) { sqlBuilder.Append(" AND h.TipoMod = @TipoModParam"); parameters.Add("TipoModParam", tipoModificacion); }
|
||||
if (idEmpresaOriginal.HasValue) { sqlBuilder.Append(" AND h.Id_Empresa = @IdEmpresaOriginalParam"); parameters.Add("IdEmpresaOriginalParam", idEmpresaOriginal.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaMod DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<EmpresaHistorico, string, (EmpresaHistorico, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error al obtener historial de Empresas (Maestro)."); // Asumiendo _logger
|
||||
return Enumerable.Empty<(EmpresaHistorico, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -292,5 +292,48 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlDelete, new { IdParteParam = idParte }, transaction);
|
||||
return rowsAffected == 1;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<(EntradaSalidaCanillaHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idParteOriginal)
|
||||
{
|
||||
using var connection = _cf.CreateConnection();
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.Id_Parte, h.Id_Publicacion, h.Id_Canilla, h.Fecha,
|
||||
h.CantSalida, h.CantEntrada, h.Id_Precio, h.Id_Recargo, h.Id_PorcMon, h.Observacion,
|
||||
h.Id_Usuario, h.FechaMod, h.TipoMod,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.dist_EntradasSalidasCanillas_H h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_Usuario = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaMod >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaMod <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_Usuario = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoModificacion)) { sqlBuilder.Append(" AND h.TipoMod = @TipoModParam"); parameters.Add("TipoModParam", tipoModificacion); }
|
||||
if (idParteOriginal.HasValue) { sqlBuilder.Append(" AND h.Id_Parte = @IdParteOriginalParam"); parameters.Add("IdParteOriginalParam", idParteOriginal.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaMod DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<EntradaSalidaCanillaHistorico, string, (EntradaSalidaCanillaHistorico, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_log.LogError(ex, "Error al obtener historial de Entradas/Salidas Canillitas.");
|
||||
return Enumerable.Empty<(EntradaSalidaCanillaHistorico, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -71,7 +71,7 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async Task<bool> ExistsByRemitoAndTipoForPublicacionAsync(int remito, string tipoMovimiento, int idPublicacion, int? excludeIdParte = null)
|
||||
{
|
||||
var sqlBuilder = new StringBuilder("SELECT COUNT(1) FROM dbo.dist_EntradasSalidas WHERE Remito = @RemitoParam AND TipoMovimiento = @TipoMovimientoParam AND Id_Publicacion = @IdPublicacionParam");
|
||||
@@ -114,11 +114,22 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
var inserted = await transaction.Connection!.QuerySingleAsync<EntradaSalidaDist>(sqlInsert, nuevaES, transaction);
|
||||
if (inserted == null || inserted.IdParte == 0) throw new DataException("Error al crear Entrada/Salida o ID no generado.");
|
||||
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new {
|
||||
IdParteHist = inserted.IdParte, IdPublicacionHist = inserted.IdPublicacion, IdDistribuidorHist = inserted.IdDistribuidor,
|
||||
FechaHist = inserted.Fecha, TipoMovimientoHist = inserted.TipoMovimiento, CantidadHist = inserted.Cantidad, RemitoHist = inserted.Remito, ObservacionHist = inserted.Observacion,
|
||||
IdPrecioHist = inserted.IdPrecio, IdRecargoHist = inserted.IdRecargo, IdPorcentajeHist = inserted.IdPorcentaje,
|
||||
IdUsuarioHist = idUsuario, FechaModHist = DateTime.Now, TipoModHist = "Creada"
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new
|
||||
{
|
||||
IdParteHist = inserted.IdParte,
|
||||
IdPublicacionHist = inserted.IdPublicacion,
|
||||
IdDistribuidorHist = inserted.IdDistribuidor,
|
||||
FechaHist = inserted.Fecha,
|
||||
TipoMovimientoHist = inserted.TipoMovimiento,
|
||||
CantidadHist = inserted.Cantidad,
|
||||
RemitoHist = inserted.Remito,
|
||||
ObservacionHist = inserted.Observacion,
|
||||
IdPrecioHist = inserted.IdPrecio,
|
||||
IdRecargoHist = inserted.IdRecargo,
|
||||
IdPorcentajeHist = inserted.IdPorcentaje,
|
||||
IdUsuarioHist = idUsuario,
|
||||
FechaModHist = DateTime.Now,
|
||||
TipoModHist = "Creada"
|
||||
}, transaction);
|
||||
return inserted;
|
||||
}
|
||||
@@ -136,16 +147,27 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
Cantidad = @Cantidad, Observacion = @Observacion
|
||||
-- Publicacion, Distribuidor, Fecha, TipoMovimiento, Remito, Ids de precio/recargo/porc no se modifican aquí
|
||||
WHERE Id_Parte = @IdParte;";
|
||||
const string sqlHistorico = @"
|
||||
const string sqlHistorico = @"
|
||||
INSERT INTO dbo.dist_EntradasSalidas_H
|
||||
(Id_Parte, Id_Publicacion, Id_Distribuidor, Fecha, TipoMovimiento, Cantidad, Remito, Observacion, Id_Precio, Id_Recargo, Id_Porcentaje, Id_Usuario, FechaMod, TipoMod)
|
||||
VALUES (@IdParteHist, @IdPublicacionHist, @IdDistribuidorHist, @FechaHist, @TipoMovimientoHist, @CantidadHist, @RemitoHist, @ObservacionHist, @IdPrecioHist, @IdRecargoHist, @IdPorcentajeHist, @IdUsuarioHist, @FechaModHist, @TipoModHist);";
|
||||
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new {
|
||||
IdParteHist = actual.IdParte, IdPublicacionHist = actual.IdPublicacion, IdDistribuidorHist = actual.IdDistribuidor,
|
||||
FechaHist = actual.Fecha, TipoMovimientoHist = actual.TipoMovimiento, CantidadHist = actual.Cantidad, RemitoHist = actual.Remito, ObservacionHist = actual.Observacion,
|
||||
IdPrecioHist = actual.IdPrecio, IdRecargoHist = actual.IdRecargo, IdPorcentajeHist = actual.IdPorcentaje, // Valores ANTERIORES
|
||||
IdUsuarioHist = idUsuario, FechaModHist = DateTime.Now, TipoModHist = "Actualizada"
|
||||
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new
|
||||
{
|
||||
IdParteHist = actual.IdParte,
|
||||
IdPublicacionHist = actual.IdPublicacion,
|
||||
IdDistribuidorHist = actual.IdDistribuidor,
|
||||
FechaHist = actual.Fecha,
|
||||
TipoMovimientoHist = actual.TipoMovimiento,
|
||||
CantidadHist = actual.Cantidad,
|
||||
RemitoHist = actual.Remito,
|
||||
ObservacionHist = actual.Observacion,
|
||||
IdPrecioHist = actual.IdPrecio,
|
||||
IdRecargoHist = actual.IdRecargo,
|
||||
IdPorcentajeHist = actual.IdPorcentaje, // Valores ANTERIORES
|
||||
IdUsuarioHist = idUsuario,
|
||||
FechaModHist = DateTime.Now,
|
||||
TipoModHist = "Actualizada"
|
||||
}, transaction);
|
||||
|
||||
var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlUpdate, esAActualizar, transaction);
|
||||
@@ -166,15 +188,69 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
(Id_Parte, Id_Publicacion, Id_Distribuidor, Fecha, TipoMovimiento, Cantidad, Remito, Observacion, Id_Precio, Id_Recargo, Id_Porcentaje, Id_Usuario, FechaMod, TipoMod)
|
||||
VALUES (@IdParteHist, @IdPublicacionHist, @IdDistribuidorHist, @FechaHist, @TipoMovimientoHist, @CantidadHist, @RemitoHist, @ObservacionHist, @IdPrecioHist, @IdRecargoHist, @IdPorcentajeHist, @IdUsuarioHist, @FechaModHist, @TipoModHist);";
|
||||
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new {
|
||||
IdParteHist = actual.IdParte, IdPublicacionHist = actual.IdPublicacion, IdDistribuidorHist = actual.IdDistribuidor,
|
||||
FechaHist = actual.Fecha, TipoMovimientoHist = actual.TipoMovimiento, CantidadHist = actual.Cantidad, RemitoHist = actual.Remito, ObservacionHist = actual.Observacion,
|
||||
IdPrecioHist = actual.IdPrecio, IdRecargoHist = actual.IdRecargo, IdPorcentajeHist = actual.IdPorcentaje,
|
||||
IdUsuarioHist = idUsuario, FechaModHist = DateTime.Now, TipoModHist = "Eliminada"
|
||||
await transaction.Connection!.ExecuteAsync(sqlHistorico, new
|
||||
{
|
||||
IdParteHist = actual.IdParte,
|
||||
IdPublicacionHist = actual.IdPublicacion,
|
||||
IdDistribuidorHist = actual.IdDistribuidor,
|
||||
FechaHist = actual.Fecha,
|
||||
TipoMovimientoHist = actual.TipoMovimiento,
|
||||
CantidadHist = actual.Cantidad,
|
||||
RemitoHist = actual.Remito,
|
||||
ObservacionHist = actual.Observacion,
|
||||
IdPrecioHist = actual.IdPrecio,
|
||||
IdRecargoHist = actual.IdRecargo,
|
||||
IdPorcentajeHist = actual.IdPorcentaje,
|
||||
IdUsuarioHist = idUsuario,
|
||||
FechaModHist = DateTime.Now,
|
||||
TipoModHist = "Eliminada"
|
||||
}, transaction);
|
||||
|
||||
var rowsAffected = await transaction.Connection!.ExecuteAsync(sqlDelete, new { IdParteParam = idParte }, transaction);
|
||||
return rowsAffected == 1;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<(EntradaSalidaDistHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idParteOriginal)
|
||||
{
|
||||
using var connection = _cf.CreateConnection();
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.Id_Parte, h.Id_Publicacion, h.Id_Distribuidor, h.Fecha, h.TipoMovimiento,
|
||||
h.Cantidad, h.Remito, h.Observacion, h.Id_Precio, h.Id_Recargo, h.Id_Porcentaje,
|
||||
h.Id_Usuario, h.FechaMod, h.TipoMod,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.dist_EntradasSalidas_H h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_Usuario = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaMod >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaMod <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_Usuario = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoModificacion)) { sqlBuilder.Append(" AND h.TipoMod = @TipoModParam"); parameters.Add("TipoModParam", tipoModificacion); }
|
||||
if (idParteOriginal.HasValue) { sqlBuilder.Append(" AND h.Id_Parte = @IdParteOriginalParam"); parameters.Add("IdParteOriginalParam", idParteOriginal.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaMod DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<EntradaSalidaDistHistorico, string, (EntradaSalidaDistHistorico, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_log.LogError(ex, "Error al obtener historial de Entradas/Salidas Distribuidores.");
|
||||
return Enumerable.Empty<(EntradaSalidaDistHistorico, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
using GestionIntegral.Api.Models.Distribucion;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
{
|
||||
public interface ICambioParadaRepository
|
||||
{
|
||||
Task<IEnumerable<CambioParadaCanilla>> GetByCanillaAsync(int idCanilla);
|
||||
Task<CambioParadaCanilla?> GetByIdAsync(int idRegistro);
|
||||
Task<CambioParadaCanilla?> GetCurrentParadaAsync(int idCanilla, IDbTransaction? transaction = null);
|
||||
Task<CambioParadaCanilla?> CreateAsync(CambioParadaCanilla nuevaParada, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> UpdateVigenciaHAsync(int idRegistro, DateTime vigenciaH, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> DeleteAsync(int idRegistro, int idUsuario, IDbTransaction transaction);
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,9 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
Task<bool> UpdateAsync(Canilla canillaAActualizar, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> ToggleBajaAsync(int id, bool darDeBaja, DateTime? fechaBaja, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> ExistsByLegajoAsync(int legajo, int? excludeIdCanilla = null);
|
||||
// IsInUse no es tan directo, ya que las liquidaciones se marcan. Se podría verificar dist_EntradasSalidasCanillas no liquidadas.
|
||||
Task<IEnumerable<(CanillaHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idCanillaOriginal); // Para filtrar por un canillita específico
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,11 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
Task<bool> ExistsByNroDocAsync(string nroDoc, int? excludeIdDistribuidor = null);
|
||||
Task<bool> ExistsByNameAsync(string nombre, int? excludeIdDistribuidor = null);
|
||||
Task<bool> IsInUseAsync(int id); // Verificar en dist_EntradasSalidas, cue_PagosDistribuidor, dist_PorcPago
|
||||
Task<IEnumerable<DistribuidorDropdownDto?>> GetAllDropdownAsync();
|
||||
Task<IEnumerable<DistribuidorDropdownDto?>> GetAllDropdownAsync();
|
||||
Task<DistribuidorLookupDto?> ObtenerLookupPorIdAsync(int id);
|
||||
Task<IEnumerable<(DistribuidorHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idDistribuidorOriginal);
|
||||
}
|
||||
}
|
||||
@@ -17,5 +17,9 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
Task<bool> IsInUseAsync(int id);
|
||||
Task<IEnumerable<EmpresaDropdownDto>> GetAllDropdownAsync();
|
||||
Task<Empresa?> ObtenerLookupPorIdAsync(int id);
|
||||
Task<IEnumerable<(EmpresaHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idEmpresaOriginal);
|
||||
}
|
||||
}
|
||||
@@ -19,5 +19,9 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
Task<bool> DeleteAsync(int idParte, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> LiquidarAsync(IEnumerable<int> idsPartes, DateTime fechaLiquidacion, int idUsuarioLiquidador, IDbTransaction transaction);
|
||||
Task<bool> ExistsByPublicacionCanillaFechaAsync(int idPublicacion, int idCanilla, DateTime fecha, IDbTransaction? transaction = null, int? excludeIdParte = null);
|
||||
Task<IEnumerable<(EntradaSalidaCanillaHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idParteOriginal);
|
||||
}
|
||||
}
|
||||
@@ -14,5 +14,9 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
Task<bool> UpdateAsync(EntradaSalidaDist esAActualizar, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> DeleteAsync(int idParte, int idUsuario, IDbTransaction transaction);
|
||||
Task<bool> ExistsByRemitoAndTipoForPublicacionAsync(int remito, string tipoMovimiento, int idPublicacion, int? excludeIdParte = null);
|
||||
Task<IEnumerable<(EntradaSalidaDistHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idParteOriginal); // Para filtrar por un movimiento específico
|
||||
}
|
||||
}
|
||||
@@ -19,5 +19,9 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
Task<bool> ExistsByCanillaAndFechaAsync(int idCanilla, DateTime fecha, int? excludeIdNovedad = null);
|
||||
Task<IEnumerable<NovedadesCanillasReporteDto>> GetReporteNovedadesAsync(int idEmpresa, DateTime fechaDesde, DateTime fechaHasta);
|
||||
Task<IEnumerable<CanillaGananciaReporteDto>> GetReporteGananciasAsync(int idEmpresa, DateTime fechaDesde, DateTime fechaHasta);
|
||||
Task<IEnumerable<(NovedadCanillaHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idNovedadOriginal);
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ using Microsoft.Data.SqlClient; // O el proveedor de tu BD
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using GestionIntegral.Api.Dtos.Reportes;
|
||||
using System.Text;
|
||||
|
||||
namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
{
|
||||
@@ -232,5 +233,46 @@ namespace GestionIntegral.Api.Data.Repositories.Distribucion
|
||||
commandType: CommandType.StoredProcedure
|
||||
);
|
||||
}
|
||||
public async Task<IEnumerable<(NovedadCanillaHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
|
||||
DateTime? fechaDesde, DateTime? fechaHasta,
|
||||
int? idUsuarioModifico, string? tipoModificacion,
|
||||
int? idNovedadOriginal)
|
||||
{
|
||||
using var connection = _connectionFactory.CreateConnection();
|
||||
var sqlBuilder = new StringBuilder(@"
|
||||
SELECT
|
||||
h.Id_Novedad, h.Id_Canilla, h.Fecha, h.Detalle,
|
||||
h.Id_Usuario, h.FechaMod, h.TipoMod,
|
||||
u.Nombre + ' ' + u.Apellido AS NombreUsuarioModifico
|
||||
FROM dbo.dist_dtNovedadesCanillas_H h
|
||||
JOIN dbo.gral_Usuarios u ON h.Id_Usuario = u.Id
|
||||
WHERE 1=1");
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
|
||||
if (fechaDesde.HasValue) { sqlBuilder.Append(" AND h.FechaMod >= @FechaDesdeParam"); parameters.Add("FechaDesdeParam", fechaDesde.Value.Date); }
|
||||
if (fechaHasta.HasValue) { sqlBuilder.Append(" AND h.FechaMod <= @FechaHastaParam"); parameters.Add("FechaHastaParam", fechaHasta.Value.Date.AddDays(1).AddTicks(-1)); }
|
||||
if (idUsuarioModifico.HasValue) { sqlBuilder.Append(" AND h.Id_Usuario = @IdUsuarioModificoParam"); parameters.Add("IdUsuarioModificoParam", idUsuarioModifico.Value); }
|
||||
if (!string.IsNullOrWhiteSpace(tipoModificacion)) { sqlBuilder.Append(" AND h.TipoMod = @TipoModParam"); parameters.Add("TipoModParam", tipoModificacion); }
|
||||
if (idNovedadOriginal.HasValue) { sqlBuilder.Append(" AND h.Id_Novedad = @IdNovedadOriginalParam"); parameters.Add("IdNovedadOriginalParam", idNovedadOriginal.Value); }
|
||||
|
||||
sqlBuilder.Append(" ORDER BY h.FechaMod DESC;");
|
||||
|
||||
try
|
||||
{
|
||||
var result = await connection.QueryAsync<NovedadCanillaHistorico, string, (NovedadCanillaHistorico, string)>(
|
||||
sqlBuilder.ToString(),
|
||||
(hist, userName) => (hist, userName),
|
||||
parameters,
|
||||
splitOn: "NombreUsuarioModifico"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error al obtener historial de Novedades de Canillitas.");
|
||||
return Enumerable.Empty<(NovedadCanillaHistorico, string)>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user