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:
		| @@ -25,6 +25,34 @@ apiClient.interceptors.request.use( | ||||
|   } | ||||
| ); | ||||
|  | ||||
| apiClient.interceptors.response.use( | ||||
|   (response) => { | ||||
|     // Cualquier código de estado que este dentro del rango de 2xx causa la ejecución de esta función | ||||
|     return response; | ||||
|   }, | ||||
|   (error) => { | ||||
|     // Cualquier código de estado que este fuera del rango de 2xx causa la ejecución de esta función | ||||
|     if (axios.isAxiosError(error) && error.response) { | ||||
|       if (error.response.status === 401) { | ||||
|         // Token inválido o expirado | ||||
|         console.warn("Error 401: Token inválido o expirado. Deslogueando..."); | ||||
|          | ||||
|         // Limpiar localStorage y recargar la página. | ||||
|         // AuthContext se encargará de redirigir a /login al recargar porque no encontrará token. | ||||
|         localStorage.removeItem('authToken'); | ||||
|         localStorage.removeItem('authUser'); // Asegurar limpiar también el usuario | ||||
|         // Forzar un hard refresh para que AuthContext se reinicialice y redirija | ||||
|         // Esto también limpiará cualquier estado de React. | ||||
|         // --- Mostrar mensaje antes de redirigir --- | ||||
|         alert("Tu sesión ha expirado o no es válida. Serás redirigido a la página de inicio de sesión."); | ||||
|         window.location.href = '/login'; // Redirección más directa | ||||
|       } | ||||
|     } | ||||
|     // Es importante devolver el error para que el componente que hizo la llamada pueda manejarlo también si es necesario | ||||
|     return Promise.reject(error); | ||||
|   } | ||||
| ); | ||||
|  | ||||
| // Puedes añadir interceptores de respuesta para manejar errores globales (ej: 401 Unauthorized) | ||||
|  | ||||
| export default apiClient; | ||||
		Reference in New Issue
	
	Block a user