From 9db334554f708935523554bd47ca6ee782107425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frane=20Poli=C4=87?= <16856471+fPolic@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:33:12 +0200 Subject: [PATCH] fix(core-flows): item id in reservations (#9097) **What** - on cart completion, when creating reservations, use line item id instead of cart item id - NOTE: inventory reservation is now done after we create the order --- FIXES CC-448 --- .../__tests__/cart/store/carts.spec.ts | 2 +- .../utils/prepare-confirm-inventory-input.ts | 2 +- .../src/cart/workflows/complete-cart.ts | 47 +++++++++++-------- packages/core/types/src/cart/workflows.ts | 3 +- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/integration-tests/modules/__tests__/cart/store/carts.spec.ts b/integration-tests/modules/__tests__/cart/store/carts.spec.ts index 01893c6bbb..146f4c020c 100644 --- a/integration-tests/modules/__tests__/cart/store/carts.spec.ts +++ b/integration-tests/modules/__tests__/cart/store/carts.spec.ts @@ -2238,7 +2238,7 @@ medusaIntegrationTestRunner({ location_id: stockLocation.id, inventory_item_id: inventoryItem.id, quantity: cart.items[0].quantity, - line_item_id: cart.items[0].id, + line_item_id: response.data.order.items[0].id, }) ) diff --git a/packages/core/core-flows/src/cart/utils/prepare-confirm-inventory-input.ts b/packages/core/core-flows/src/cart/utils/prepare-confirm-inventory-input.ts index 6b57ec9b04..ab712c75f7 100644 --- a/packages/core/core-flows/src/cart/utils/prepare-confirm-inventory-input.ts +++ b/packages/core/core-flows/src/cart/utils/prepare-confirm-inventory-input.ts @@ -12,7 +12,7 @@ interface ConfirmInventoryPreparationInput { }[] items: { id?: string - variant_id?: string + variant_id?: string | null quantity: BigNumberInput }[] variants: { diff --git a/packages/core/core-flows/src/cart/workflows/complete-cart.ts b/packages/core/core-flows/src/cart/workflows/complete-cart.ts index c5f8b01633..373c7014d7 100644 --- a/packages/core/core-flows/src/cart/workflows/complete-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/complete-cart.ts @@ -84,26 +84,12 @@ export const completeCartWorkflow = createWorkflow( } ) - const formatedInventoryItems = transform( - { - input: { - sales_channel_id, - variants, - items, - }, - }, - prepareConfirmInventoryInput - ) - - const [, finalCart] = parallelize( - reserveInventoryStep(formatedInventoryItems), - useRemoteQueryStep({ - entry_point: "cart", - fields: completeCartFields, - variables: { id: input.id }, - list: false, - }).config({ name: "final-cart" }) - ) + const finalCart = useRemoteQueryStep({ + entry_point: "cart", + fields: completeCartFields, + variables: { id: input.id }, + list: false, + }).config({ name: "final-cart" }) const cartToOrder = transform({ cart }, ({ cart }) => { const allItems = (cart.items ?? []).map((item) => { @@ -162,11 +148,31 @@ export const completeCartWorkflow = createWorkflow( }) const createdOrders = createOrdersStep([cartToOrder]) + const order = transform( { createdOrders }, ({ createdOrders }) => createdOrders[0] ) + const reservationItemsData = transform({ order }, ({ order }) => + order.items!.map((i) => ({ + variant_id: i.variant_id, + quantity: i.quantity, + id: i.id, + })) + ) + + const formatedInventoryItems = transform( + { + input: { + sales_channel_id, + variants, + items: reservationItemsData, + }, + }, + prepareConfirmInventoryInput + ) + const updateCompletedAt = transform({ cart }, ({ cart }) => { return { id: cart.id, @@ -188,6 +194,7 @@ export const completeCartWorkflow = createWorkflow( }, ]), updateCartsStep([updateCompletedAt]), + reserveInventoryStep(formatedInventoryItems), emitEventStep({ eventName: OrderWorkflowEvents.PLACED, data: { id: order.id }, diff --git a/packages/core/types/src/cart/workflows.ts b/packages/core/types/src/cart/workflows.ts index 0f6f496aa4..b6ee128593 100644 --- a/packages/core/types/src/cart/workflows.ts +++ b/packages/core/types/src/cart/workflows.ts @@ -143,8 +143,9 @@ export interface ConfirmVariantInventoryWorkflowInputDTO { }[] }[] items: { - variant_id?: string + variant_id?: string | null quantity: BigNumberInput + id?: string }[] itemsToUpdate?: { data: {