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).
		
			
				
	
	
		
			68 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import React from 'react';
 | |
| import { Navigate, Outlet } from 'react-router-dom';
 | |
| import { useAuth } from '../contexts/AuthContext';
 | |
| import { usePermissions } from '../hooks/usePermissions';
 | |
| import { Alert, Box, CircularProgress } from '@mui/material';
 | |
| 
 | |
| interface SectionProtectedRouteProps {
 | |
|   requiredPermission?: string | null; // Hacerlo opcional
 | |
|   onlySuperAdmin?: boolean;           // Nueva prop
 | |
|   sectionName: string;
 | |
|   children?: React.ReactNode;
 | |
| }
 | |
| 
 | |
| const SectionProtectedRoute: React.FC<SectionProtectedRouteProps> = ({
 | |
|   requiredPermission,
 | |
|   onlySuperAdmin = false, // Default a false
 | |
|   sectionName,
 | |
|   children
 | |
| }) => {
 | |
|   const { isAuthenticated, isLoading: authIsLoading } = useAuth();
 | |
|   const { tienePermiso, isSuperAdmin, currentUser } = usePermissions();
 | |
| 
 | |
|   if (authIsLoading) {
 | |
|     return (
 | |
|       <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '80vh' }}>
 | |
|         <CircularProgress />
 | |
|       </Box>
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   if (!isAuthenticated) {
 | |
|     return <Navigate to="/login" replace />;
 | |
|   }
 | |
|   if (!currentUser) {
 | |
|     console.error("SectionProtectedRoute: Usuario autenticado pero currentUser es null.");
 | |
|     return <Navigate to="/login" replace />;
 | |
|   }
 | |
| 
 | |
|   let canAccessSection = false;
 | |
|   if (onlySuperAdmin) {
 | |
|     canAccessSection = isSuperAdmin;
 | |
|   } else if (requiredPermission) {
 | |
|     canAccessSection = isSuperAdmin || tienePermiso(requiredPermission);
 | |
|   } else {
 | |
|     // Si no es onlySuperAdmin y no hay requiredPermission, por defecto se permite si está autenticado
 | |
|     // Esto podría ser para secciones públicas post-login pero sin permiso específico.
 | |
|     // O podrías querer que siempre haya un requiredPermission o onlySuperAdmin.
 | |
|     // Por ahora, lo dejaremos pasar si no se especifica ninguno y no es onlySuperAdmin.
 | |
|     // Sin embargo, para los SSxxx, siempre habrá un requiredPermission.
 | |
|     // Este else es más un fallback teórico.
 | |
|     canAccessSection = true; 
 | |
|   }
 | |
| 
 | |
| 
 | |
|   if (!canAccessSection) {
 | |
|     return (
 | |
|       <Box sx={{p: 3, display:'flex', justifyContent:'center', mt: 2}}>
 | |
|         <Alert severity="error" sx={{width: '100%', maxWidth: 'md'}}>
 | |
|           No tiene permiso para acceder a la sección de {sectionName}.
 | |
|         </Alert>
 | |
|       </Box>
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   return children ? <>{children}</> : <Outlet />;
 | |
| };
 | |
| 
 | |
| export default SectionProtectedRoute; |