From 58c62c3c8d67fd62009d6af786be9a610301c6f7 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Thu, 21 Aug 2025 10:02:39 +0000 Subject: [PATCH] Prevent deliveries from linking to orders from different stores Implement validation to ensure that a delivery is only linked to an order belonging to the same store, preventing cross-store order linking in the delivery module. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 2e1318c6-77b3-4174-b8c7-432d781590ed Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/2e1318c6-77b3-4174-b8c7-432d781590ed/zdg8r7D --- server/routes.ts | 31 +++++++++++++++++++++++++++++++ server/storage.ts | 26 ++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/server/routes.ts b/server/routes.ts index acbc736..39d4889 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -803,6 +803,23 @@ export async function registerRoutes(app: Express): Promise { } const data = insertDeliverySchema.partial().parse(transformedData); + + // CRITICAL FIX: Si une commande est liée lors de la modification, vérifier qu'elle appartient au même magasin + if (data.orderId !== undefined) { + if (data.orderId !== null) { + const linkedOrder = await storage.getOrder(data.orderId); + if (!linkedOrder) { + return res.status(400).json({ message: "La commande liée n'existe pas" }); + } + if (linkedOrder.groupId !== delivery.groupId) { + return res.status(400).json({ + message: `Impossible de lier une livraison du magasin ${delivery.groupId} avec une commande du magasin ${linkedOrder.groupId}` + }); + } + console.log(`✅ Validation OK: Livraison #${id} et commande #${data.orderId} appartiennent au même magasin ${delivery.groupId}`); + } + } + const updatedDelivery = await storage.updateDelivery(id, data); console.log('✅ Delivery updated successfully:', { id, updatedDelivery }); @@ -875,6 +892,20 @@ export async function registerRoutes(app: Express): Promise { } } + // CRITICAL FIX: Si une commande est liée, vérifier qu'elle appartient au même magasin + if (data.orderId) { + const linkedOrder = await storage.getOrder(data.orderId); + if (!linkedOrder) { + return res.status(400).json({ message: "La commande liée n'existe pas" }); + } + if (linkedOrder.groupId !== data.groupId) { + return res.status(400).json({ + message: `Impossible de lier une livraison du magasin ${data.groupId} avec une commande du magasin ${linkedOrder.groupId}` + }); + } + console.log(`✅ Validation OK: Livraison et commande #${data.orderId} appartiennent au même magasin ${data.groupId}`); + } + const delivery = await storage.createDelivery(data); // Log de liaison avec commande diff --git a/server/storage.ts b/server/storage.ts index 1314d50..5247278 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -725,7 +725,13 @@ export class DatabaseStorage implements IStorage { .where(eq(orders.id, delivery.orderId)); if (orderData) { - associatedOrder = orderData; + // CRITICAL FIX: Vérifier que la commande appartient au même magasin que la livraison + if (orderData.groupId !== delivery.groupId) { + console.error(`❌ PRODUCTION: Delivery #${delivery.id} (store ${delivery.groupId}) linked to order #${delivery.orderId} (store ${orderData.groupId}) - STORE MISMATCH DETECTED!`); + // Ne pas inclure la commande si elle n'appartient pas au bon magasin + } else { + associatedOrder = orderData; + } } } catch (error) { console.error(`❌ PRODUCTION: Failed to retrieve associated order #${delivery.orderId} for delivery #${delivery.id}:`, error); @@ -835,7 +841,13 @@ export class DatabaseStorage implements IStorage { .where(eq(orders.id, delivery.orderId)); if (orderData) { - associatedOrder = orderData; + // CRITICAL FIX: Vérifier que la commande appartient au même magasin que la livraison + if (orderData.groupId !== delivery.groupId) { + console.error(`❌ PRODUCTION: Delivery #${delivery.id} (store ${delivery.groupId}) linked to order #${delivery.orderId} (store ${orderData.groupId}) - STORE MISMATCH DETECTED!`); + // Ne pas inclure la commande si elle n'appartient pas au bon magasin + } else { + associatedOrder = orderData; + } } } catch (error) { console.error(`❌ PRODUCTION: Failed to retrieve associated order #${delivery.orderId} for delivery #${delivery.id}:`, error); @@ -908,8 +920,14 @@ export class DatabaseStorage implements IStorage { console.log(`🔗 PRODUCTION: getDelivery #${id} retrieving associated order #${delivery.orderId}`); const orderData = await this.getOrder(delivery.orderId); if (orderData) { - associatedOrder = orderData; - console.log(`✅ PRODUCTION: getDelivery #${id} found associated order #${delivery.orderId} with status: ${orderData.status}`); + // CRITICAL FIX: Vérifier que la commande appartient au même magasin que la livraison + if (orderData.groupId !== delivery.groupId) { + console.error(`❌ PRODUCTION: getDelivery #${id} (store ${delivery.groupId}) linked to order #${delivery.orderId} (store ${orderData.groupId}) - STORE MISMATCH DETECTED!`); + // Ne pas inclure la commande si elle n'appartient pas au bon magasin + } else { + associatedOrder = orderData; + console.log(`✅ PRODUCTION: getDelivery #${id} found associated order #${delivery.orderId} with status: ${orderData.status}`); + } } } catch (error) { console.error(`❌ PRODUCTION: Failed to retrieve associated order #${delivery.orderId} for delivery #${id}:`, error);