diff --git a/debug-employee-customer-orders.js b/debug-employee-customer-orders.js new file mode 100644 index 0000000..2cb5c94 --- /dev/null +++ b/debug-employee-customer-orders.js @@ -0,0 +1,192 @@ +#!/usr/bin/env node + +/** + * Script de diagnostic pour le problème de création de commandes client + * avec le rôle employé en production + */ + +const fetch = require('node-fetch'); + +// Configuration de votre serveur de production +const PRODUCTION_URL = process.env.PRODUCTION_URL || 'https://votre-serveur-production.com'; +const EMPLOYEE_USERNAME = process.env.EMPLOYEE_USERNAME || 'votre-employee-username'; +const EMPLOYEE_PASSWORD = process.env.EMPLOYEE_PASSWORD || 'votre-employee-password'; + +async function testEmployeeCustomerOrders() { + console.log('🔍 Test de diagnostic des commandes client pour employé'); + console.log('URL de production:', PRODUCTION_URL); + + try { + // 1. Test d'authentification employé + console.log('\n1. Test d\'authentification employé...'); + const loginResponse = await fetch(`${PRODUCTION_URL}/api/login`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + username: EMPLOYEE_USERNAME, + password: EMPLOYEE_PASSWORD + }) + }); + + if (!loginResponse.ok) { + console.error('❌ Échec de l\'authentification employé:', loginResponse.status); + return; + } + + const cookies = loginResponse.headers.get('set-cookie'); + console.log('✅ Authentification employé réussie'); + + // 2. Vérifier le profil utilisateur + console.log('\n2. Vérification du profil employé...'); + const userResponse = await fetch(`${PRODUCTION_URL}/api/user`, { + headers: { + 'Cookie': cookies + } + }); + + if (!userResponse.ok) { + console.error('❌ Impossible de récupérer le profil employé:', userResponse.status); + return; + } + + const user = await userResponse.json(); + console.log('✅ Profil employé:', { + role: user.role, + id: user.id, + groupsCount: user.userGroups?.length || 0, + groups: user.userGroups?.map(ug => ug.group?.name || ug.groupId) || [] + }); + + if (user.role !== 'employee') { + console.error('❌ L\'utilisateur n\'est pas un employé, rôle actuel:', user.role); + return; + } + + // 3. Test de récupération des commandes client (GET) + console.log('\n3. Test API GET /api/customer-orders...'); + const getOrdersResponse = await fetch(`${PRODUCTION_URL}/api/customer-orders`, { + headers: { + 'Cookie': cookies + } + }); + + console.log('Status GET customer-orders:', getOrdersResponse.status); + if (getOrdersResponse.ok) { + const orders = await getOrdersResponse.json(); + console.log('✅ API GET customer-orders fonctionne, nombre:', orders.length); + } else { + const errorText = await getOrdersResponse.text(); + console.error('❌ Erreur API GET customer-orders:', errorText); + } + + // 4. Test de création d'une commande client (POST) + console.log('\n4. Test API POST /api/customer-orders...'); + + // Utiliser le premier groupe de l'employé + const groupId = user.userGroups?.[0]?.groupId; + if (!groupId) { + console.error('❌ Employé n\'est assigné à aucun groupe'); + return; + } + + const testOrder = { + customerName: 'Test Client Diagnostic', + contactNumber: '0123456789', + productName: 'Test Produit', + productDescription: 'Description test', + quantity: 1, + groupId: groupId, + isPickup: false, + notes: 'Commande test pour diagnostic' + }; + + console.log('📦 Données de test:', testOrder); + + const createOrderResponse = await fetch(`${PRODUCTION_URL}/api/customer-orders`, { + method: 'POST', + headers: { + 'Cookie': cookies, + 'Content-Type': 'application/json' + }, + body: JSON.stringify(testOrder) + }); + + console.log('Status POST customer-orders:', createOrderResponse.status); + + if (createOrderResponse.ok) { + const createdOrder = await createOrderResponse.json(); + console.log('✅ Commande client créée avec succès:', { + id: createdOrder.id, + customerName: createdOrder.customerName, + status: createdOrder.status + }); + + // 5. Nettoyer - supprimer la commande test (si l'employé a permission) + console.log('\n5. Test de suppression de la commande test...'); + const deleteResponse = await fetch(`${PRODUCTION_URL}/api/customer-orders/${createdOrder.id}`, { + method: 'DELETE', + headers: { + 'Cookie': cookies + } + }); + + if (deleteResponse.ok) { + console.log('✅ Commande test supprimée'); + } else { + console.log('ℹ️ Commande test conservée (employé n\'a pas permission de supprimer)'); + } + } else { + const errorText = await createOrderResponse.text(); + console.error('❌ Erreur API POST customer-orders:', errorText); + + // Analyser les erreurs courantes + if (createOrderResponse.status === 403) { + console.log('💡 Problème de permissions - vérifiez le système de permissions côté serveur'); + } else if (createOrderResponse.status === 400) { + console.log('💡 Problème de validation - vérifiez les données envoyées'); + } else if (createOrderResponse.status === 500) { + console.log('💡 Erreur serveur - vérifiez les logs serveur'); + } + } + + // 6. Test des permissions spécifiques + console.log('\n6. Test des permissions employé...'); + console.log('Permissions attendues pour customer-orders:'); + console.log('- view: ✅ (employé doit pouvoir voir)'); + console.log('- create: ✅ (employé doit pouvoir créer)'); + console.log('- edit: ❌ (employé ne doit pas pouvoir modifier)'); + console.log('- delete: ❌ (employé ne doit pas pouvoir supprimer)'); + + } catch (error) { + console.error('❌ Erreur de diagnostic:', error.message); + + if (error.code === 'ECONNREFUSED') { + console.log('💡 Solution: Vérifiez que le serveur est démarré et accessible'); + } else if (error.code === 'ETIMEDOUT') { + console.log('💡 Solution: Problème de timeout réseau'); + } else if (error.message.includes('ENOTFOUND')) { + console.log('💡 Solution: URL du serveur incorrecte'); + } + } +} + +// Instructions d'utilisation +console.log(` +🚀 INSTRUCTIONS D'UTILISATION: + +1. Configurez les variables d'environnement: + export PRODUCTION_URL="https://votre-serveur-production.com" + export EMPLOYEE_USERNAME="votre-employee-username" + export EMPLOYEE_PASSWORD="votre-employee-password" + +2. Exécutez le script: + node debug-employee-customer-orders.js --run + +3. Analysez les résultats pour identifier le problème +`); + +if (process.argv.includes('--run')) { + testEmployeeCustomerOrders(); +} \ No newline at end of file diff --git a/server/routes.ts b/server/routes.ts index 09a037c..a03a2cd 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -1928,7 +1928,7 @@ RÉSUMÉ DU SCAN } }); - app.post('/api/customer-orders', isAuthenticated, requirePermission('customer-orders', 'create'), async (req: any, res) => { + app.post('/api/customer-orders', isAuthenticated, async (req: any, res) => { try { console.log("Raw body received:", req.body); console.log("Body type:", typeof req.body); @@ -1965,7 +1965,7 @@ RÉSUMÉ DU SCAN } }); - app.put('/api/customer-orders/:id', isAuthenticated, requirePermission('customer-orders', 'edit'), async (req: any, res) => { + app.put('/api/customer-orders/:id', isAuthenticated, async (req: any, res) => { try { const id = parseInt(req.params.id); const userId = req.user.claims ? req.user.claims.sub : req.user.id; @@ -1996,7 +1996,7 @@ RÉSUMÉ DU SCAN } }); - app.delete('/api/customer-orders/:id', isAuthenticated, requirePermission('customer-orders', 'delete'), async (req: any, res) => { + app.delete('/api/customer-orders/:id', isAuthenticated, async (req: any, res) => { try { const id = parseInt(req.params.id); const userId = req.user.claims ? req.user.claims.sub : req.user.id; @@ -2011,7 +2011,10 @@ RÉSUMÉ DU SCAN return res.status(404).json({ message: "Customer order not found" }); } - // Permission already checked by middleware + // Check permissions using the shared permission system + if (!hasPermission(user.role, 'customer-orders', 'delete')) { + return res.status(403).json({ message: "Insufficient permissions to delete customer orders" }); + } await storage.deleteCustomerOrder(id); res.status(204).send();