1. Funcionalidad Principal: Auditoría General

Se creó una nueva sección de "Auditoría" en la aplicación, diseñada para ser accedida por SuperAdmins.
Se implementó una página AuditoriaGeneralPage.tsx que actúa como un visor centralizado para el historial de cambios de múltiples entidades del sistema.
2. Backend:
Nuevo Controlador (AuditoriaController.cs): Centraliza los endpoints para obtener datos de las tablas de historial (_H).
Servicios y Repositorios Extendidos:
Se añadieron métodos GetHistorialAsync y ObtenerHistorialAsync a las capas de repositorio y servicio para cada una de las siguientes entidades, permitiendo consultar sus tablas _H con filtros:
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)
Tipos de Pago (cue_dtTipopago_H)
Canillitas (Maestro) (dist_dtCanillas_H)
Distribuidores (Maestro) (dist_dtDistribuidores_H)
Empresas (Maestro) (dist_dtEmpresas_H)
Zonas (Maestro) (dist_dtZonas_H)
Otros Destinos (Maestro) (dist_dtOtrosDestinos_H)
Publicaciones (Maestro) (dist_dtPublicaciones_H)
Secciones de Publicación (dist_dtPubliSecciones_H)
Precios de Publicación (dist_Precios_H)
Recargos por Zona (dist_RecargoZona_H)
Porcentajes Pago Distribuidores (dist_PorcPago_H)
Porcentajes/Montos Canillita (dist_PorcMonPagoCanilla_H)
Control de Devoluciones (dist_dtCtrlDevoluciones_H)
Tipos de Bobina (bob_dtBobinas_H)
Estados de Bobina (bob_dtEstadosBobinas_H)
Plantas de Impresión (bob_dtPlantas_H)
Stock de Bobinas (bob_StockBobinas_H)
Tiradas (Registro Principal) (bob_RegTiradas_H)
Secciones de Tirada (bob_RegPublicaciones_H)
Cambios de Parada de Canillitas (dist_CambiosParadasCanillas_H)
Ajustes Manuales de Saldo (cue_SaldoAjustesHistorial)
DTOs de Historial: Se crearon DTOs específicos para cada tabla de historial (ej. UsuarioHistorialDto, PagoDistribuidorHistorialDto, etc.) para transferir los datos al frontend, incluyendo el nombre del usuario que realizó la modificación.
Corrección de Lógica de Saldos: Se revisó y corrigió la lógica de afectación de saldos en los servicios PagoDistribuidorService y NotaCreditoDebitoService para asegurar que los débitos y créditos se apliquen correctamente.
3. Frontend:
Nuevo Servicio (auditoriaService.ts): Contiene métodos para llamar a cada uno de los nuevos endpoints de auditoría del backend.
Nueva Página (AuditoriaGeneralPage.tsx):
Permite al SuperAdmin seleccionar el "Tipo de Entidad" a auditar desde un dropdown.
Ofrece filtros comunes (rango de fechas, usuario modificador, tipo de acción) y filtros específicos que aparecen dinámicamente según la entidad seleccionada.
Utiliza un DataGrid de Material-UI para mostrar el historial, con columnas que se adaptan dinámicamente al tipo de entidad consultada.
Nuevos DTOs en TypeScript: Se crearon las interfaces correspondientes a los DTOs de historial del backend.
Gestión de Permisos:
La sección de Auditoría en MainLayout.tsx y su ruta en AppRoutes.tsx están protegidas para ser visibles y accesibles solo por SuperAdmins.
Se añadió un permiso de ejemplo AU_GENERAL_VIEW para ser usado si se decide extender el acceso en el futuro.
Corrección de Errores Menores: Se solucionó el problema del "parpadeo" del selector de fecha en GestionarNovedadesCanillaPage al adoptar un patrón de carga de datos más controlado, similar a otras páginas funcionales.
This commit is contained in:
2025-06-12 19:36:21 -03:00
parent 437b1e8864
commit b04a3b99bf
145 changed files with 5033 additions and 1070 deletions

View File

@@ -0,0 +1,19 @@
using System;
namespace GestionIntegral.Api.Dtos.Distribucion // O Auditoria
{
public class CambioParadaHistorialDto
{
public int Id_Registro { get; set; }
public int Id_Canilla { get; set; }
public string NombreCanilla { get; set; } = string.Empty; // Para mostrar
public string Parada { get; set; } = string.Empty; // Dirección de la parada en ese momento
public DateTime VigenciaD { get; set; }
public DateTime? VigenciaH { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -1,6 +1,6 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria // O Auditoria
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class CanillaHistorialDto
{

View File

@@ -0,0 +1,21 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class ControlDevolucionesHistorialDto
{
public int Id_Control { get; set; }
public int Id_Empresa { get; set; }
// public string NombreEmpresa { get; set; } // Opcional
public DateTime Fecha { get; set; } // Fecha original del control
public int Entrada { get; set; }
public int Sobrantes { get; set; }
public string? Detalle { get; set; }
public int SinCargo { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -1,6 +1,6 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria // O Auditoria
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class EmpresaHistorialDto
{

View File

@@ -0,0 +1,16 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class EstadoBobinaHistorialDto
{
public int Id_EstadoBobina { get; set; }
public string Denominacion { get; set; } = string.Empty;
public string? Obs { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,16 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class OtroDestinoHistorialDto
{
public int Id_Destino { get; set; }
public string Nombre { get; set; } = string.Empty;
public string? Obs { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,19 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class PerfilHistorialDto
{
public int IdPerfil { get; set; } // ID del Perfil original
public string Perfil { get; set; } = string.Empty; // Nombre del perfil
public string? DescPerfil { get; set; }
public int Id_Usuario { get; set; } // Quién hizo el cambio
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
// El IdHist (PK de _H) no es estrictamente necesario en el DTO para mostrar,
// pero se puede incluir un identificador único para cada entrada de historial.
// public int IdHistorial { get; set;}
}
}

View File

@@ -0,0 +1,19 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class PermisoHistorialDto
{
public int IdPermiso { get; set; } // ID del Permiso original
public string Modulo { get; set; } = string.Empty;
public string DescPermiso { get; set; } = string.Empty;
public string CodAcc { get; set; } = string.Empty;
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
// El IdHist de la tabla _H puede ser útil para la key en el frontend
public int IdHistorial { get; set; }
}
}

View File

@@ -0,0 +1,19 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class PermisosPerfilesHistorialDto
{
public int IdHistorial { get; set; } // El ID de la entrada de historial
public int IdPerfil { get; set; }
public string NombrePerfil { get; set; } = string.Empty;
public int IdPermiso { get; set; }
public string DescPermiso { get; set; } = string.Empty;
public string CodAccPermiso { get; set; } = string.Empty;
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty; // "Asignado", "Removido"
}
}

View File

@@ -0,0 +1,16 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class PlantaHistorialDto
{
public int Id_Planta { get; set; }
public string Nombre { get; set; } = string.Empty;
public string Detalle { get; set; } = string.Empty;
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,22 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class PorcMonCanillaHistorialDto
{
public int Id_PorcMon { get; set; }
public int Id_Publicacion { get; set; }
// public string NombrePublicacion { get; set; } // Opcional
public int Id_Canilla { get; set; }
// public string NombreCanilla { get; set; } // Opcional
public DateTime VigenciaD { get; set; }
public DateTime? VigenciaH { get; set; }
public decimal PorcMon { get; set; }
public bool EsPorcentaje { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,21 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class PorcPagoHistorialDto
{
public int Id_Porcentaje { get; set; }
public int Id_Publicacion { get; set; }
// public string NombrePublicacion { get; set; } // Opcional
public int Id_Distribuidor { get; set; }
// public string NombreDistribuidor { get; set; } // Opcional
public DateTime VigenciaD { get; set; }
public DateTime? VigenciaH { get; set; }
public decimal Porcentaje { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,25 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class PrecioHistorialDto
{
public int Id_Precio { get; set; }
public int Id_Publicacion { get; set; }
// public string NombrePublicacion { get; set; } // Opcional
public DateTime VigenciaD { get; set; }
public DateTime? VigenciaH { get; set; }
public decimal? Lunes { get; set; }
public decimal? Martes { get; set; }
public decimal? Miercoles { get; set; }
public decimal? Jueves { get; set; }
public decimal? Viernes { get; set; }
public decimal? Sabado { get; set; }
public decimal? Domingo { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,18 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class PubliSeccionHistorialDto
{
public int Id_Seccion { get; set; }
public int Id_Publicacion { get; set; }
// public string NombrePublicacion { get; set; } // Opcional, si quieres traerlo con JOIN
public string Nombre { get; set; } = string.Empty; // Nombre de la sección
public bool Estado { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,20 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class PublicacionHistorialDto
{
public int Id_Publicacion { get; set; }
public string Nombre { get; set; } = string.Empty;
public string? Observacion { get; set; }
public int Id_Empresa { get; set; }
// public string NombreEmpresa { get; set; } // Opcional
// public bool CtrlDevoluciones { get; set; } // Si la añades a _H y al modelo
public bool? Habilitada { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,21 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class RecargoZonaHistorialDto
{
public int Id_Recargo { get; set; }
public int Id_Publicacion { get; set; }
// public string NombrePublicacion { get; set; } // Opcional
public int Id_Zona { get; set; }
// public string NombreZona { get; set; } // Opcional
public DateTime VigenciaD { get; set; }
public DateTime? VigenciaH { get; set; }
public decimal Valor { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,22 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class RegSeccionTiradaHistorialDto
{
public int Id_Tirada { get; set; } // ID del registro original de la sección de la tirada
public int Id_Publicacion { get; set; }
public string NombrePublicacion { get; set; } = string.Empty;
public int Id_Seccion { get; set; }
public string NombreSeccion { get; set; } = string.Empty;
public int CantPag { get; set; }
public DateTime Fecha { get; set; } // Fecha original de la tirada
public int Id_Planta { get; set; }
public string NombrePlanta { get; set; } = string.Empty;
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,20 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class RegTiradaHistorialDto
{
public int Id_Registro { get; set; }
public int Ejemplares { get; set; }
public int Id_Publicacion { get; set; }
public string NombrePublicacion { get; set; } = string.Empty; // Para mostrar
public DateTime Fecha { get; set; }
public int Id_Planta { get; set; }
public string NombrePlanta { get; set; } = string.Empty; // Para mostrar
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,30 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class StockBobinaHistorialDto
{
public int Id_Bobina { get; set; }
public int Id_TipoBobina { get; set; }
public string NombreTipoBobina { get; set; } = string.Empty; // Para mostrar
public string NroBobina { get; set; } = string.Empty;
public int Peso { get; set; }
public int Id_Planta { get; set; }
public string NombrePlanta { get; set; } = string.Empty; // Para mostrar
public int Id_EstadoBobina { get; set; }
public string NombreEstadoBobina { get; set; } = string.Empty; // Para mostrar
public string Remito { get; set; } = string.Empty;
public DateTime FechaRemito { get; set; }
public DateTime? FechaEstado { get; set; }
public int? Id_Publicacion { get; set; }
public string? NombrePublicacion { get; set; } // Para mostrar
public int? Id_Seccion { get; set; }
public string? NombreSeccion { get; set; } // Para mostrar
public string? Obs { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,15 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class TipoBobinaHistorialDto
{
public int Id_TipoBobina { get; set; }
public string Denominacion { get; set; } = string.Empty;
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,17 @@
using System;
namespace GestionIntegral.Api.Dtos.Auditoria
{
public class ZonaHistorialDto
{
public int Id_Zona { get; set; }
public string Nombre { get; set; } = string.Empty;
public string? Descripcion { get; set; }
public bool Estado { get; set; }
public int Id_Usuario { get; set; }
public string NombreUsuarioModifico { get; set; } = string.Empty;
public DateTime FechaMod { get; set; }
public string TipoMod { get; set; } = string.Empty;
}
}

View File

@@ -6,8 +6,6 @@ namespace GestionIntegral.Api.Dtos.Distribucion
{
// IdPublicacion no se puede cambiar una vez creado el precio (se borraría y crearía uno nuevo)
// VigenciaD tampoco se debería cambiar directamente, se maneja creando nuevos periodos.
[Required(ErrorMessage = "La fecha de Vigencia Hasta es obligatoria si se modifica un periodo existente para cerrarlo.")]
public DateTime? VigenciaH { get; set; } // Para cerrar un periodo
[Range(0, 999999.99, ErrorMessage = "El precio debe ser un valor positivo.")]