diff --git a/PRODUCTION-FIXES-FINAL.md b/PRODUCTION-FIXES-FINAL.md index 8e56783..912e6dd 100644 --- a/PRODUCTION-FIXES-FINAL.md +++ b/PRODUCTION-FIXES-FINAL.md @@ -6,7 +6,19 @@ ## CORRECTIONS À APPLIQUER SUR VOTRE SERVEUR PRIVÉ -### 1️⃣ FICHIER: server/routes.ts SEULEMENT +### 1️⃣ FICHIER: client/src/pages/Tasks.tsx +**Correction erreur 403 /api/users** + +#### A) Ligne 84-85 (requête des utilisateurs): +```typescript +// REMPLACER: +enabled: !!user, + +// PAR: +enabled: !!user && (user.role === 'admin' || user.role === 'manager' || user.role === 'directeur'), +``` + +### 2️⃣ FICHIER: server/routes.ts **Les permissions dans shared/permissions.ts restent inchangées** #### A) Route GET /api/suppliers (environ ligne 188-194): diff --git a/attached_assets/{F8DF25B7-AAB8-4266-9F4E-3717C4CA43C3}_1754989295935.png b/attached_assets/{F8DF25B7-AAB8-4266-9F4E-3717C4CA43C3}_1754989295935.png new file mode 100644 index 0000000..45928ca Binary files /dev/null and b/attached_assets/{F8DF25B7-AAB8-4266-9F4E-3717C4CA43C3}_1754989295935.png differ diff --git a/client/src/pages/Tasks.tsx b/client/src/pages/Tasks.tsx index f6cf865..cf6fcc0 100644 --- a/client/src/pages/Tasks.tsx +++ b/client/src/pages/Tasks.tsx @@ -70,7 +70,7 @@ export default function Tasks() { enabled: !!user, }); - // Fetch users for task assignment + // Fetch users for task assignment - seulement pour admin/manager/directeur const { data: users = [] } = useQuery({ queryKey: ["/api/users"], queryFn: () => fetch('/api/users', { @@ -81,7 +81,7 @@ export default function Tasks() { } return res.json(); }), - enabled: !!user, + enabled: !!user && (user.role === 'admin' || user.role === 'manager' || user.role === 'directeur'), }); @@ -218,7 +218,8 @@ export default function Tasks() { } }; - const canCreateTasks = user?.role === 'admin' || user?.role === 'manager'; + const canCreateTasks = user?.role === 'admin' || user?.role === 'manager' || user?.role === 'directeur'; + const canEditTasks = user?.role === 'admin' || user?.role === 'manager' || user?.role === 'directeur'; if (isLoading) { return ( @@ -382,29 +383,35 @@ export default function Tasks() {
- - - + {canEditTasks && ( + + )} + {canEditTasks && ( + + )} + {canEditTasks && ( + + )}
diff --git a/fix-employee-403-final.js b/fix-employee-403-final.js new file mode 100644 index 0000000..da801db --- /dev/null +++ b/fix-employee-403-final.js @@ -0,0 +1,117 @@ +#!/usr/bin/env node + +/** + * Script de correction finale des erreurs 403 pour les employés + * Applique les corrections nécessaires au serveur de production + */ + +console.log('🔧 SCRIPT DE CORRECTION DES ERREURS 403 EMPLOYÉS'); +console.log('================================================'); +console.log(''); + +console.log('✅ CORRECTIONS APPLIQUÉES DANS REPLIT:'); +console.log(''); + +console.log('1️⃣ client/src/pages/Tasks.tsx - Ligne ~84:'); +console.log(' AVANT: enabled: !!user,'); +console.log(' APRÈS: enabled: !!user && (user.role === "admin" || user.role === "manager" || user.role === "directeur"),'); +console.log(' ➜ Évite l\'appel à /api/users pour les employés'); +console.log(''); + +console.log('2️⃣ Boutons d\'action conditionnels pour les employés'); +console.log(' ➜ Les employés ne voient plus les boutons modifier/supprimer des tâches'); +console.log(''); + +console.log('📋 CORRECTIONS À APPLIQUER SUR VOTRE SERVEUR PRIVÉ:'); +console.log(''); + +console.log('💡 SOLUTION SIMPLE - 2 FICHIERS À MODIFIER:'); +console.log(''); + +console.log('🔸 A) client/src/pages/Tasks.tsx (environ ligne 84):'); +console.log(''); +console.log('// REMPLACER:'); +console.log('const { data: users = [] } = useQuery({'); +console.log(' queryKey: ["/api/users"],'); +console.log(' queryFn: () => fetch(\'/api/users\', {'); +console.log(' credentials: \'include\''); +console.log(' }).then(res => {'); +console.log(' if (!res.ok) {'); +console.log(' throw new Error(`HTTP error! status: ${res.status}`);'); +console.log(' }'); +console.log(' return res.json();'); +console.log(' }),'); +console.log(' enabled: !!user, // ← LIGNE À CHANGER'); +console.log('});'); +console.log(''); +console.log('// PAR:'); +console.log('const { data: users = [] } = useQuery({'); +console.log(' queryKey: ["/api/users"],'); +console.log(' queryFn: () => fetch(\'/api/users\', {'); +console.log(' credentials: \'include\''); +console.log(' }).then(res => {'); +console.log(' if (!res.ok) {'); +console.log(' throw new Error(`HTTP error! status: ${res.status}`);'); +console.log(' }'); +console.log(' return res.json();'); +console.log(' }),'); +console.log(' enabled: !!user && (user.role === \'admin\' || user.role === \'manager\' || user.role === \'directeur\'),'); +console.log('});'); +console.log(''); + +console.log('🔸 B) server/routes.ts - 5 corrections de permissions fournisseurs:'); +console.log(''); + +console.log('B.1) Route GET /api/suppliers (environ ligne 188-194):'); +console.log('// REMPLACER:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\')) {'); +console.log('// PAR:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\' && user.role !== \'directeur\' && user.role !== \'employee\')) {'); +console.log(''); + +console.log('B.2) Route POST /api/suppliers (environ ligne 240-242):'); +console.log('// REMPLACER:'); +console.log('if (user.role !== \'admin\' && user.role !== \'manager\') {'); +console.log('// PAR:'); +console.log('if (user.role !== \'admin\' && user.role !== \'manager\' && user.role !== \'directeur\') {'); +console.log(''); + +console.log('B.3) Route PUT /api/suppliers/:id (environ ligne 281-283):'); +console.log('// REMPLACER:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\')) {'); +console.log('// PAR:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\' && user.role !== \'directeur\')) {'); +console.log(''); + +console.log('B.4) Route DELETE /api/suppliers/:id (environ ligne 298-300):'); +console.log('// REMPLACER:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\')) {'); +console.log('// PAR:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'directeur\')) {'); +console.log(''); + +console.log('B.5) Route POST /api/dlc-products/:id/validate (environ ligne 2332-2334):'); +console.log('// REMPLACER:'); +console.log('if (!user || ![\'admin\', \'manager\'].includes(user.role)) {'); +console.log('// PAR:'); +console.log('if (!user || ![\'admin\', \'manager\', \'directeur\'].includes(user.role)) {'); +console.log(''); + +console.log('⚡ ÉTAPES D\'APPLICATION:'); +console.log('1. Sauvegarde: cp client/src/pages/Tasks.tsx client/src/pages/Tasks.tsx.backup'); +console.log('2. Sauvegarde: cp server/routes.ts server/routes.ts.backup'); +console.log('3. Effectuer les corrections A) et B) ci-dessus'); +console.log('4. Redémarrer votre serveur Node.js'); +console.log('5. Tester avec un compte employé'); +console.log(''); + +console.log('✅ RÉSULTAT ATTENDU:'); +console.log('- Plus d\'erreurs 403 dans la console pour les employés'); +console.log('- Employés peuvent voir les tâches (mais pas les créer/modifier)'); +console.log('- Employés peuvent voir les fournisseurs (pour Commandes Client et DLC)'); +console.log('- Directeurs peuvent valider les produits DLC'); +console.log(''); + +console.log('🚨 IMPORTANT:'); +console.log('Les permissions dans shared/permissions.ts restent inchangées:'); +console.log('tasks: { employee: [\'view\'] } // ← Correct, ne pas modifier'); \ No newline at end of file