diff --git a/PRODUCTION-FIX-GUIDE.md b/PRODUCTION-FIX-GUIDE.md index 088332d..bedd42e 100644 --- a/PRODUCTION-FIX-GUIDE.md +++ b/PRODUCTION-FIX-GUIDE.md @@ -68,6 +68,26 @@ Cette erreur survient lors de la **création** ou **édition** d'utilisateur qua 2. Redéployez l'application (le code a été corrigé pour utiliser `NULL` au lieu de `""` dans les routes de création ET d'édition) +### Problème Synchronisation Commandes/Livraisons dans le Calendrier + +#### Symptômes observés : +- Les livraisons marquées "Livré" affichent "Date non disponible" +- Les commandes liées à des livraisons livrées ne passent pas en statut "delivered" +- Problème d'affichage des dates dans le modal de détails de commande + +#### Corrections apportées : +1. **Affichage des dates corrigé** : Le modal affiche maintenant la date de livraison réelle (`deliveredDate`) pour les livraisons livrées +2. **Synchronisation automatique des statuts** : Les commandes sont automatiquement marquées "delivered" quand leurs livraisons associées sont livrées +3. **Script de correction des données** : `fix-delivery-order-sync.sql` pour corriger les données existantes + +**Solution complète** : +1. Exécutez le script de synchronisation : + ```bash + psql $DATABASE_URL -f fix-delivery-order-sync.sql + ``` + +2. Redéployez l'application avec les corrections + #### Tests de Création 1. **Test Manuel** : Utilisez `test-create-user-production.js` ```bash diff --git a/attached_assets/image_1754943664463.png b/attached_assets/image_1754943664463.png new file mode 100644 index 0000000..061fc24 Binary files /dev/null and b/attached_assets/image_1754943664463.png differ diff --git a/client/src/components/modals/OrderDetailModal.tsx b/client/src/components/modals/OrderDetailModal.tsx index 4c4bc98..d0002c9 100644 --- a/client/src/components/modals/OrderDetailModal.tsx +++ b/client/src/components/modals/OrderDetailModal.tsx @@ -292,7 +292,12 @@ export default function OrderDetailModal({

#LIV-{delivery.id}

- {safeFormat(delivery.plannedDate, 'dd MMMM yyyy')} + {delivery.status === 'delivered' && delivery.deliveredDate + ? `Livré le ${safeFormat(delivery.deliveredDate, 'dd MMMM yyyy')}` + : delivery.scheduledDate + ? `Prévu le ${safeFormat(delivery.scheduledDate, 'dd MMMM yyyy')}` + : 'Date non disponible' + }

diff --git a/fix-delivery-order-sync.sql b/fix-delivery-order-sync.sql new file mode 100644 index 0000000..d0d1c25 --- /dev/null +++ b/fix-delivery-order-sync.sql @@ -0,0 +1,72 @@ +-- Script pour diagnostiquer et corriger la synchronisation des statuts commandes/livraisons +-- À exécuter en production pour résoudre les problèmes de dates et statuts + +-- 1. Diagnostiquer les livraisons avec statut "delivered" mais dates manquantes +SELECT 'Livraisons livrées sans date de livraison:' as diagnostic, + COUNT(*) as count +FROM deliveries +WHERE status = 'delivered' AND delivered_date IS NULL; + +-- Afficher les détails +SELECT d.id, d.status, d.scheduled_date, d.delivered_date, d.validated_at, + o.id as order_id, o.status as order_status +FROM deliveries d +LEFT JOIN orders o ON d.order_id = o.id +WHERE d.status = 'delivered' AND d.delivered_date IS NULL +LIMIT 10; + +-- 2. Diagnostiquer les commandes avec livraisons livrées mais statut incorrect +SELECT 'Commandes avec livraisons livrées mais pas en statut delivered:' as diagnostic, + COUNT(*) as count +FROM orders o +WHERE EXISTS ( + SELECT 1 FROM deliveries d + WHERE d.order_id = o.id AND d.status = 'delivered' +) AND o.status != 'delivered'; + +-- Afficher les détails +SELECT o.id as order_id, o.status as order_status, o.planned_date, + COUNT(d.id) as total_deliveries, + SUM(CASE WHEN d.status = 'delivered' THEN 1 ELSE 0 END) as delivered_deliveries +FROM orders o +LEFT JOIN deliveries d ON d.order_id = o.id +WHERE EXISTS ( + SELECT 1 FROM deliveries d2 + WHERE d2.order_id = o.id AND d2.status = 'delivered' +) AND o.status != 'delivered' +GROUP BY o.id, o.status, o.planned_date +LIMIT 10; + +-- 3. Corriger les livraisons livrées sans date de livraison +UPDATE deliveries +SET delivered_date = COALESCE(validated_at, updated_at, created_at) +WHERE status = 'delivered' AND delivered_date IS NULL; + +-- 4. Corriger les statuts des commandes liées aux livraisons livrées +UPDATE orders +SET status = 'delivered', updated_at = NOW() +WHERE id IN ( + SELECT DISTINCT d.order_id + FROM deliveries d + WHERE d.order_id IS NOT NULL + AND d.status = 'delivered' + AND d.order_id NOT IN ( + SELECT o.id FROM orders o WHERE o.status = 'delivered' + ) +); + +-- 5. Vérification finale +SELECT 'Vérification finale - Commandes avec statuts corrects:' as final_check, + COUNT(*) as count +FROM orders o +WHERE EXISTS ( + SELECT 1 FROM deliveries d + WHERE d.order_id = o.id AND d.status = 'delivered' +) AND o.status = 'delivered'; + +-- Afficher un résumé des corrections +SELECT + 'Résumé des corrections:' as summary, + (SELECT COUNT(*) FROM deliveries WHERE status = 'delivered') as total_delivered_deliveries, + (SELECT COUNT(*) FROM deliveries WHERE status = 'delivered' AND delivered_date IS NOT NULL) as deliveries_with_date, + (SELECT COUNT(*) FROM orders WHERE status = 'delivered') as total_delivered_orders; \ No newline at end of file diff --git a/replit.md b/replit.md index 3331430..3ccbd29 100644 --- a/replit.md +++ b/replit.md @@ -149,4 +149,17 @@ Preferred communication style: Simple, everyday language. - Enhanced validation schemas to accept `null` values for email fields - Created `fix-duplicate-empty-email.sql` script to clean existing database records - Improved error handling and logging for better production debugging -- **Result**: Users can now be created and edited with optional email fields without constraint violations \ No newline at end of file +- **Result**: Users can now be created and edited with optional email fields without constraint violations + +#### Calendar Order-Delivery Synchronization Fix +- **Issue**: Orders linked to delivered deliveries were not showing proper status and dates in calendar view +- **Root Cause**: Three interconnected problems: + 1. OrderDetailModal was displaying non-existent `plannedDate` instead of `scheduledDate`/`deliveredDate` + 2. Order status was not automatically updated when delivery status changed via updateDelivery method + 3. Delivered deliveries had missing `deliveredDate` field causing "Date non disponible" display +- **Solution Implemented**: + - Enhanced OrderDetailModal to display correct dates: `deliveredDate` for delivered items, `scheduledDate` for planned ones + - Added automatic order status synchronization in `updateDelivery` method when delivery marked as delivered + - Created `fix-delivery-order-sync.sql` script to correct existing production data inconsistencies + - Improved Calendar date initialization to show current month instead of hardcoded July 2025 +- **Result**: Calendar now properly displays delivery dates and automatically synchronizes order statuses when deliveries are completed \ No newline at end of file diff --git a/server/storage.ts b/server/storage.ts index 5bbc53a..88f0c9c 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -640,11 +640,27 @@ export class DatabaseStorage implements IStorage { } async updateDelivery(id: number, delivery: Partial): Promise { + const currentDelivery = await this.getDelivery(id); + if (!currentDelivery) throw new Error("Delivery not found"); + const [updatedDelivery] = await db .update(deliveries) .set({ ...delivery, updatedAt: new Date() }) .where(eq(deliveries.id, id)) .returning(); + + // Si la livraison est marquée comme livrée et qu'elle est liée à une commande + if (delivery.status === 'delivered' && currentDelivery.orderId) { + console.log('🔄 Delivery marked as delivered, updating linked order status'); + await db + .update(orders) + .set({ + status: 'delivered', + updatedAt: new Date() + }) + .where(eq(orders.id, currentDelivery.orderId)); + } + return updatedDelivery; }