diff --git a/PRODUCTION-ERROR-502-FIX.md b/PRODUCTION-ERROR-502-FIX.md new file mode 100644 index 0000000..5ad816f --- /dev/null +++ b/PRODUCTION-ERROR-502-FIX.md @@ -0,0 +1,130 @@ +# Correction des Erreurs 502 - Production + +## Problème Identifié +- Erreurs 502 (Bad Gateway) lors des appels API `/api/deliveries` et `/api/orders` +- CMD-55 n'apparaît pas en gris dans le calendrier +- Erreurs TypeScript dans le code du calendrier + +## Solutions + +### 1. Vérification du Serveur Backend + +Vérifiez que votre serveur Node.js fonctionne : + +```bash +# Vérifier le processus +ps aux | grep node + +# Vérifier les logs du serveur +tail -f /path/to/your/server/logs + +# Vérifier si le port est écouté +netstat -tlnp | grep :YOUR_PORT +``` + +### 2. Redémarrage du Serveur + +```bash +# Via PM2 +pm2 restart your-app-name +pm2 logs your-app-name + +# Via systemctl +sudo systemctl restart your-node-service +sudo systemctl status your-node-service + +# Via Docker +docker-compose restart +docker-compose logs -f +``` + +### 3. Vérification de la Configuration Proxy/Nginx + +Si vous utilisez un proxy inverse (Nginx), vérifiez la configuration : + +```nginx +location /api/ { + proxy_pass http://localhost:YOUR_NODE_PORT/api/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + proxy_read_timeout 86400; +} +``` + +### 4. Correction SQL Directe pour CMD-55 + +Pendant que vous résolvez les erreurs 502, corrigez CMD-55 directement : + +```sql +-- Connexion à votre base +psql -h your-host -U your-user -d your-database + +-- Correction CMD-55 +UPDATE orders +SET status = 'delivered' +WHERE id = 55 + AND status != 'delivered' + AND EXISTS ( + SELECT 1 FROM deliveries d + WHERE d."orderId" = 55 + AND d.status = 'delivered' + ); + +-- Vérifier le résultat +SELECT o.id, o.status, COUNT(d.id) as deliveries, + COUNT(CASE WHEN d.status = 'delivered' THEN 1 END) as delivered_deliveries +FROM orders o +LEFT JOIN deliveries d ON o.id = d."orderId" +WHERE o.id = 55 +GROUP BY o.id, o.status; +``` + +### 5. Test des API manuellement + +```bash +# Tester l'API orders +curl -X GET "http://your-server.com/api/orders" \ + -H "Cookie: your-session-cookie" + +# Tester l'API deliveries +curl -X GET "http://your-server.com/api/deliveries" \ + -H "Cookie: your-session-cookie" +``` + +## Actions Prioritaires + +1. **Immédiat** : Exécuter la correction SQL pour CMD-55 +2. **Urgent** : Redémarrer votre serveur Node.js +3. **Important** : Vérifier les logs pour identifier la cause des 502 + +## Diagnostic des Logs + +Recherchez dans vos logs : + +```bash +# Erreurs Node.js +grep -i "error\|crash\|exception" /path/to/logs + +# Erreurs de base de données +grep -i "database\|postgres\|connection" /path/to/logs + +# Erreurs de mémoire +grep -i "memory\|heap" /path/to/logs +``` + +## Résultat Attendu + +Après correction : +- Les API `/api/orders` et `/api/deliveries` répondent sans erreur 502 +- CMD-55 apparaît en gris dans le calendrier +- Le bouton "Sync Status" fonctionne correctement + +--- + +**Note** : La correction SQL de CMD-55 peut être appliquée immédiatement, indépendamment de la résolution des erreurs 502. \ No newline at end of file diff --git a/attached_assets/image_1754945642796.png b/attached_assets/image_1754945642796.png new file mode 100644 index 0000000..0b46e81 Binary files /dev/null and b/attached_assets/image_1754945642796.png differ diff --git a/client/src/pages/Calendar.tsx b/client/src/pages/Calendar.tsx index 6b60549..a49ae07 100644 --- a/client/src/pages/Calendar.tsx +++ b/client/src/pages/Calendar.tsx @@ -160,8 +160,8 @@ export default function Calendar() { const allDeliveries = await deliveriesResponse.json(); // Enrichir les commandes avec leurs livraisons pour avoir les bonnes relations - const enrichedOrders = filteredOrders.map(order => { - const orderDeliveries = allDeliveries.filter(delivery => delivery.orderId === order.id); + const enrichedOrders = filteredOrders.map((order: any) => { + const orderDeliveries = allDeliveries.filter((delivery: any) => delivery.orderId === order.id); return { ...order, deliveries: orderDeliveries @@ -172,18 +172,18 @@ export default function Calendar() { filteredOrders: filteredOrders.length, enrichedOrders: enrichedOrders.length, allDeliveries: allDeliveries.length, - deliveredDeliveries: allDeliveries.filter(d => d.status === 'delivered').length + deliveredDeliveries: allDeliveries.filter((d: any) => d.status === 'delivered').length }); // Chercher spécifiquement CMD-55 - const cmd55 = enrichedOrders.find(o => o.id === 55); - const cmd55Deliveries = allDeliveries.filter(d => d.orderId === 55); + const cmd55 = enrichedOrders.find((o: any) => o.id === 55); + const cmd55Deliveries = allDeliveries.filter((d: any) => d.orderId === 55); console.log('🎯 CMD-55 Analysis:', { foundInOrders: !!cmd55, cmd55Status: cmd55?.status || 'NOT_FOUND', cmd55Deliveries: cmd55Deliveries.length, - deliveryStatuses: cmd55Deliveries.map(d => ({ + deliveryStatuses: cmd55Deliveries.map((d: any) => ({ id: d.id, status: d.status, deliveredDate: d.deliveredDate, @@ -199,26 +199,31 @@ export default function Calendar() { console.log(`🔍 Analyzing order #CMD-${order.id}:`, { status: order.status, deliveries: order.deliveries?.length || 0, - deliveryStatuses: order.deliveries?.map(d => ({ id: d.id, status: d.status, deliveredDate: d.deliveredDate })) || [] + deliveryStatuses: order.deliveries?.map((d: any) => ({ id: d.id, status: d.status, deliveredDate: d.deliveredDate })) || [] }); if (order.deliveries && order.deliveries.length > 0) { - const hasDeliveredDeliveries = order.deliveries.some(d => d.status === 'delivered'); + const hasDeliveredDeliveries = order.deliveries.some((d: any) => d.status === 'delivered'); if (hasDeliveredDeliveries && order.status !== 'delivered') { problematicOrders++; console.log(`🔍 Found problematic order: #CMD-${order.id} (status: ${order.status}) with delivered deliveries:`, - order.deliveries.filter(d => d.status === 'delivered').map(d => `#LIV-${d.id}`) + order.deliveries.filter((d: any) => d.status === 'delivered').map((d: any) => `#LIV-${d.id}`) ); try { - // Corriger la commande via l'API PUT existante - await apiRequest({ - url: `/api/orders/${order.id}`, + // Corriger la commande via fetch direct + const response = await fetch(`/api/orders/${order.id}`, { method: 'PUT', - data: { status: 'delivered' } + headers: { 'Content-Type': 'application/json' }, + credentials: 'include', + body: JSON.stringify({ status: 'delivered' }) }); + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${await response.text()}`); + } + fixedOrders++; console.log(`✅ Fixed order #CMD-${order.id} status to 'delivered'`); } catch (error) {