Skip to content

Commit feab208

Browse files
committed
fix: Inventory check
1 parent 6aa89b6 commit feab208

6 files changed

Lines changed: 271 additions & 0 deletions

File tree

integration-tests/http/__tests__/order-edits/order-edits.spec.ts

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ medusaIntegrationTestRunner({
2525
let inventoryItem
2626
let inventoryItemExtra
2727
let location
28+
let locationTwo
2829
let productExtra
2930
const shippingProviderId = "manual_test-provider"
3031

@@ -212,6 +213,16 @@ medusaIntegrationTestRunner({
212213
)
213214
).data.stock_location
214215

216+
locationTwo = (
217+
await api.post(
218+
`/admin/stock-locations`,
219+
{
220+
name: "Test location two",
221+
},
222+
adminHeaders
223+
)
224+
).data.stock_location
225+
215226
fulfillmentSet = (
216227
await api.post(
217228
`/admin/fulfillment-sets/${location.fulfillment_sets[0].id}/service-zones`,
@@ -240,6 +251,15 @@ medusaIntegrationTestRunner({
240251
adminHeaders
241252
)
242253

254+
// await api.post(
255+
// `/admin/inventory-items/${inventoryItem.id}/location-levels`,
256+
// {
257+
// location_id: locationTwo.id,
258+
// stocked_quantity: 0,
259+
// },
260+
// adminHeaders
261+
// )
262+
243263
inventoryItemExtra = (
244264
await api.get(`/admin/inventory-items?sku=variant-sku`, adminHeaders)
245265
).data.inventory_items[0]
@@ -266,6 +286,14 @@ medusaIntegrationTestRunner({
266286
fulfillment_provider_id: shippingProviderId,
267287
},
268288
},
289+
// {
290+
// [Modules.STOCK_LOCATION]: {
291+
// stock_location_id: locationTwo.id,
292+
// },
293+
// [Modules.FULFILLMENT]: {
294+
// fulfillment_provider_id: shippingProviderId,
295+
// },
296+
// },
269297
{
270298
[Modules.STOCK_LOCATION]: {
271299
stock_location_id: location.id,
@@ -282,6 +310,14 @@ medusaIntegrationTestRunner({
282310
stock_location_id: location.id,
283311
},
284312
},
313+
{
314+
[Modules.SALES_CHANNEL]: {
315+
sales_channel_id: salesChannel.id,
316+
},
317+
[Modules.STOCK_LOCATION]: {
318+
stock_location_id: locationTwo.id,
319+
},
320+
},
285321
{
286322
[Modules.PRODUCT]: {
287323
variant_id: product.variants[0].id,
@@ -553,10 +589,29 @@ medusaIntegrationTestRunner({
553589
)
554590
).data.stock_location
555591

592+
locationTwo = (
593+
await api.post(
594+
`/admin/stock-locations`,
595+
{
596+
name: "Test location two",
597+
},
598+
adminHeaders
599+
)
600+
).data.stock_location
601+
556602
await api.post(
557603
`/admin/inventory-items/${inventoryItemLarge.id}/location-levels`,
558604
{
559605
location_id: location.id,
606+
stocked_quantity: 0,
607+
},
608+
adminHeaders
609+
)
610+
611+
await api.post(
612+
`/admin/inventory-items/${inventoryItemLarge.id}/location-levels`,
613+
{
614+
location_id: locationTwo.id,
560615
stocked_quantity: 10,
561616
},
562617
adminHeaders
@@ -860,6 +915,62 @@ medusaIntegrationTestRunner({
860915
])
861916
)
862917
})
918+
919+
it.only("should manage inventory across locations in order edit", async () => {
920+
let edit = (
921+
await api.post(
922+
`/admin/order-edits`,
923+
{ order_id: order.id },
924+
adminHeaders
925+
)
926+
).data.order_change
927+
928+
// Add item
929+
await api.post(
930+
`/admin/order-edits/${order.id}/items`,
931+
{
932+
items: [
933+
{
934+
variant_id: product.variants.find((v) => v.title === "L shirt")
935+
.id,
936+
quantity: 1,
937+
},
938+
],
939+
},
940+
adminHeaders
941+
)
942+
943+
edit = (
944+
await api.post(
945+
`/admin/order-edits/${order.id}/request`,
946+
{},
947+
adminHeaders
948+
)
949+
).data.order_change
950+
951+
edit = (
952+
await api.post(
953+
`/admin/order-edits/${order.id}/confirm`,
954+
{},
955+
adminHeaders
956+
)
957+
).data.order_change
958+
959+
order = (await api.get(`/admin/orders/${order.id}`, adminHeaders)).data
960+
.order
961+
962+
console.log(JSON.stringify(order.items, null, 2))
963+
964+
expect(order.items.length).toBe(2)
965+
expect(order.items).toEqual(
966+
expect.arrayContaining([
967+
expect.objectContaining({
968+
subtitle: "L shirt",
969+
quantity: 2,
970+
}),
971+
])
972+
)
973+
})
863974
})
864975

865976
describe("Order Edit Shipping Methods", () => {

packages/core/core-flows/src/cart/utils/fields.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ export const productVariantsFields = [
168168
"inventory_items.inventory.requires_shipping",
169169
"inventory_items.inventory.location_levels.stocked_quantity",
170170
"inventory_items.inventory.location_levels.reserved_quantity",
171+
"inventory_items.inventory.location_levels.location_id",
171172
"inventory_items.inventory.location_levels.raw_stocked_quantity",
172173
"inventory_items.inventory.location_levels.raw_reserved_quantity",
173174
"inventory_items.inventory.location_levels.stock_locations.id",

packages/core/core-flows/src/draft-order/workflows/confirm-draft-order-edit.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ export const confirmDraftOrderEditWorkflow = createWorkflow(
124124
"items.variant.allow_backorder",
125125
"items.variant.inventory_items.inventory_item_id",
126126
"items.variant.inventory_items.required_quantity",
127+
"items.variant.inventory_items.inventory.location_levels.stocked_quantity",
128+
"items.variant.inventory_items.inventory.location_levels.reserved_quantity",
129+
"items.variant.inventory_items.inventory.location_levels.location_id",
127130
"items.variant.inventory_items.inventory.location_levels.stock_locations.id",
128131
"items.variant.inventory_items.inventory.location_levels.stock_locations.name",
129132
"items.variant.inventory_items.inventory.location_levels.stock_locations.sales_channels.id",

packages/core/core-flows/src/order/utils/fields.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export const productVariantsFields = [
1919
"inventory_items.inventory.requires_shipping",
2020
"inventory_items.inventory.location_levels.stocked_quantity",
2121
"inventory_items.inventory.location_levels.reserved_quantity",
22+
"inventory_items.inventory.location_levels.location_id",
2223
"inventory_items.inventory.location_levels.raw_stocked_quantity",
2324
"inventory_items.inventory.location_levels.raw_reserved_quantity",
2425
"inventory_items.inventory.location_levels.stock_locations.id",

packages/core/core-flows/src/order/workflows/order-edit/confirm-order-edit-request.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ export const confirmOrderEditRequestWorkflow = createWorkflow(
181181
"items.variant.allow_backorder",
182182
"items.variant.inventory_items.inventory_item_id",
183183
"items.variant.inventory_items.required_quantity",
184+
"items.variant.inventory_items.inventory.location_levels.stocked_quantity",
185+
"items.variant.inventory_items.inventory.location_levels.reserved_quantity",
186+
"items.variant.inventory_items.inventory.location_levels.location_id",
184187
"items.variant.inventory_items.inventory.location_levels.stock_locations.id",
185188
"items.variant.inventory_items.inventory.location_levels.stock_locations.name",
186189
"items.variant.inventory_items.inventory.location_levels.stock_locations.sales_channels.id",

packages/core/utils/src/common/__tests__/deep-flat-map.ts

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,4 +200,156 @@ describe("deepFlatMap", function () {
200200
},
201201
])
202202
})
203+
204+
it("Test 2: should return flat map of nested objects", function () {
205+
const data = {
206+
sales_channel_id: "sc_01JYK2HEG4QAZ4WECNXX44F1E2",
207+
variants: [
208+
{
209+
manage_inventory: true,
210+
allow_backorder: false,
211+
id: "variant_01JYK2HG8NMYQ1YRCC38FRKCJM",
212+
inventory_items: [
213+
{
214+
inventory_item_id: "iitem_01JYK2HG9CWVYG8R5J3HKQ4C6X",
215+
required_quantity: 1,
216+
variant_id: "variant_01JYK2HG8NMYQ1YRCC38FRKCJM",
217+
inventory: {
218+
id: "iitem_01JYK2HG9CWVYG8R5J3HKQ4C6X",
219+
location_levels: [
220+
{
221+
location_id: "sloc_01JYK2HG4GTT887EZ2N6Z5YGEG",
222+
stock_locations: [
223+
{
224+
id: "sloc_01JYK2HG4GTT887EZ2N6Z5YGEG",
225+
name: "European Warehouse",
226+
sales_channels: [
227+
{
228+
id: "sc_01JYK2HEG4QAZ4WECNXX44F1E2",
229+
name: "Default Sales Channel",
230+
},
231+
],
232+
},
233+
],
234+
},
235+
{
236+
location_id: "sloc_01JZ7KCGYH1G9VDQ49F06X2F54",
237+
stock_locations: [
238+
{
239+
id: "sloc_01JZ7KCGYH1G9VDQ49F06X2F54",
240+
name: "Store",
241+
sales_channels: [
242+
{
243+
id: "sc_01JYK2HEG4QAZ4WECNXX44F1E2",
244+
name: "Default Sales Channel",
245+
},
246+
],
247+
},
248+
],
249+
},
250+
],
251+
},
252+
},
253+
],
254+
},
255+
],
256+
items: [
257+
{
258+
id: "ordli_01JZ7KKJDZWB200N41FEZZPDNC",
259+
variant_id: "variant_01JYK2HG8NMYQ1YRCC38FRKCJM",
260+
quantity: "1",
261+
unit_price: 10,
262+
compare_at_unit_price: null,
263+
},
264+
],
265+
}
266+
267+
const result = deepFlatMap(
268+
data,
269+
"variants.inventory_items.inventory.location_levels.stock_locations.sales_channels",
270+
({
271+
variants,
272+
inventory_items,
273+
location_levels,
274+
stock_locations,
275+
sales_channels,
276+
}) => {
277+
return {
278+
variants,
279+
inventory_items,
280+
location_levels,
281+
stock_locations,
282+
sales_channels,
283+
}
284+
}
285+
)
286+
287+
console.log(JSON.stringify(result, null, 2))
288+
289+
expect(result).toEqual([
290+
{
291+
sales_channel_id: "sales_channel_1",
292+
stock_location_id: "location_1",
293+
fulfillment_set_id: "fset_1",
294+
fulfillment_set_name: "Test 123",
295+
service_zone_id: "zone_123",
296+
shipping_option_id: "so_zone_123 1111",
297+
price: 3000,
298+
},
299+
{
300+
sales_channel_id: "sales_channel_1",
301+
stock_location_id: "location_1",
302+
fulfillment_set_id: "fset_1",
303+
fulfillment_set_name: "Test 123",
304+
service_zone_id: "zone_123",
305+
shipping_option_id: "so_zone_123 22222",
306+
price: 6000,
307+
},
308+
{
309+
sales_channel_id: "sales_channel_1",
310+
stock_location_id: "location_1",
311+
fulfillment_set_id: "fset_1",
312+
fulfillment_set_name: "Test 123",
313+
service_zone_id: "zone_567",
314+
shipping_option_id: "zone 567 11111",
315+
price: 1230,
316+
},
317+
{
318+
sales_channel_id: "sales_channel_1",
319+
stock_location_id: "location_1",
320+
fulfillment_set_id: "fset_1",
321+
fulfillment_set_name: "Test 123",
322+
service_zone_id: "zone_567",
323+
shipping_option_id: "zone 567 22222",
324+
price: 1230,
325+
},
326+
{
327+
sales_channel_id: "sales_channel_1",
328+
stock_location_id: "location_2",
329+
fulfillment_set_id: "fset_2",
330+
fulfillment_set_name: "fset name 2",
331+
service_zone_id: "zone_ABC",
332+
shipping_option_id: "zone_abc_unique",
333+
price: 70,
334+
},
335+
{
336+
sales_channel_id: "sales_channel_2",
337+
stock_location_id: "location_5",
338+
fulfillment_set_id: "fset_aaa",
339+
fulfillment_set_name: "Test aaa",
340+
service_zone_id: "zone_aaa",
341+
shipping_option_id: "so_zone_aaa aaaa",
342+
price: 500,
343+
},
344+
{
345+
sales_channel_id: "sales_channel_2",
346+
stock_location_id: "location_5",
347+
fulfillment_set_id: "fset_aaa",
348+
fulfillment_set_name: "Test aaa",
349+
service_zone_id: "zone_aaa",
350+
shipping_option_id: "so_zone_aaa bbbb",
351+
price: 12,
352+
},
353+
])
354+
})
203355
})

0 commit comments

Comments
 (0)