diff --git a/integration-tests/http/__tests__/returns/returns.spec.ts b/integration-tests/http/__tests__/returns/returns.spec.ts index c3f40bf8cc..5eb1441edb 100644 --- a/integration-tests/http/__tests__/returns/returns.spec.ts +++ b/integration-tests/http/__tests__/returns/returns.spec.ts @@ -9,7 +9,7 @@ jest.setTimeout(30000) medusaIntegrationTestRunner({ testSuite: ({ dbConnection, getContainer, api }) => { - let order + let order, order2 let returnShippingOption let shippingProfile let fulfillmentSet @@ -80,6 +80,38 @@ medusaIntegrationTestRunner({ customer_id: "joe", }) + order2 = await orderModule.createOrders({ + region_id: "test_region_id", + email: "foo@bar2.com", + items: [ + { + title: "Custom Iasdasd2", + quantity: 1, + unit_price: 20, + }, + ], + sales_channel_id: "test", + shipping_address: { + first_name: "Test", + last_name: "Test", + address_1: "Test", + city: "Test", + country_code: "US", + postal_code: "12345", + phone: "12345", + }, + billing_address: { + first_name: "Test", + last_name: "Test", + address_1: "Test", + city: "Test", + country_code: "US", + postal_code: "12345", + }, + currency_code: "usd", + customer_id: "joe", + }) + shippingProfile = ( await api.post( `/admin/shipping-profiles`, @@ -171,9 +203,107 @@ medusaIntegrationTestRunner({ }, adminHeaders ) + + await api.post( + `/admin/orders/${order2.id}/fulfillments`, + { + items: [ + { + id: order2.items[0].id, + quantity: 1, + }, + ], + }, + adminHeaders + ) }) describe("Returns lifecycle", () => { + it("Full flow with 2 orders", async () => { + let result = await api.post( + "/admin/returns", + { + order_id: order.id, + description: "Test", + }, + adminHeaders + ) + + let r2 = await api.post( + "/admin/returns", + { + order_id: order2.id, + }, + adminHeaders + ) + + const returnId2 = r2.data.return.id + const item2 = order2.items[0] + + await api.post( + `/admin/returns/${returnId2}/request-items`, + { + items: [ + { + id: item2.id, + quantity: 1, + }, + ], + }, + adminHeaders + ) + await api.post( + `/admin/returns/${returnId2}/shipping-method`, + { + shipping_option_id: returnShippingOption.id, + }, + adminHeaders + ) + await api.post(`/admin/returns/${returnId2}/request`, {}, adminHeaders) + + const returnId = result.data.return.id + + const item = order.items[0] + + result = await api.post( + `/admin/returns/${returnId}/request-items`, + { + items: [ + { + id: item.id, + quantity: 1, + }, + ], + }, + adminHeaders + ) + + await api.post( + `/admin/returns/${returnId}/shipping-method`, + { + shipping_option_id: returnShippingOption.id, + }, + adminHeaders + ) + + // updated the requested quantitty + const updateReturnItemActionId = + result.data.order_preview.items[0].actions[0].id + + result = await api.post( + `/admin/returns/${returnId}/request-items/${updateReturnItemActionId}`, + { + quantity: 2, + }, + adminHeaders + ) + result = await api.post( + `/admin/returns/${returnId}/request`, + {}, + adminHeaders + ) + }) + // Simple lifecyle: // 1. Initiate return // 2. Request to return items @@ -195,8 +325,6 @@ medusaIntegrationTestRunner({ expect.objectContaining({ id: expect.any(String), order_id: order.id, - display_id: 1, - order_version: 2, status: "requested", }) ) diff --git a/packages/core/core-flows/src/definition/cart/utils/prepare-line-item-data.ts b/packages/core/core-flows/src/definition/cart/utils/prepare-line-item-data.ts index a809779dcb..8ac814c63c 100644 --- a/packages/core/core-flows/src/definition/cart/utils/prepare-line-item-data.ts +++ b/packages/core/core-flows/src/definition/cart/utils/prepare-line-item-data.ts @@ -43,7 +43,7 @@ export function prepareLineItemData(data: Input) { product_title: variant.product.title, product_description: variant.product.description, product_subtitle: variant.product.subtitle, - product_type: variant.product.type?.[0].value ?? null, + product_type: variant.product.type?.[0]?.value ?? null, product_collection: variant.product.collection?.[0]?.value ?? null, product_handle: variant.product.handle, diff --git a/packages/core/core-flows/src/order/steps/create-return-items.ts b/packages/core/core-flows/src/order/steps/create-return-items.ts index f4bad82c30..d6e72fd07b 100644 --- a/packages/core/core-flows/src/order/steps/create-return-items.ts +++ b/packages/core/core-flows/src/order/steps/create-return-items.ts @@ -1,7 +1,7 @@ import { + CreateOrderReturnItemDTO, IOrderModuleService, OrderChangeActionDTO, - UpdateReturnDTO, } from "@medusajs/types" import { ModuleRegistrationName } from "@medusajs/utils" import { StepResponse, createStep } from "@medusajs/workflows-sdk" @@ -21,33 +21,24 @@ export const createReturnItemsStep = createStep( const returnItems = input.changes.map((item) => { return { return_id: input.returnId, - item_id: item.details?.reference_id, + item_id: item.details?.reference_id! as string, reason_id: item.details?.reason_id, quantity: item.details?.quantity as number, note: item.internal_note, metadata: (item.details?.metadata as Record) ?? {}, - } + } as CreateOrderReturnItemDTO }) - - const [prevReturn] = await orderModuleService.listReturns( - { id: input.returnId }, - { - select: ["id"], - relations: ["items"], - } + const createdReturnItems = await orderModuleService.createReturnItems( + returnItems ) - const createdReturnItems = await orderModuleService.updateReturns([ - { - selector: { id: input.returnId }, - data: { items: returnItems as UpdateReturnDTO["items"] }, - }, - ]) - - return new StepResponse(createdReturnItems, prevReturn) + return new StepResponse( + createdReturnItems, + createdReturnItems.map((i) => i.id) + ) }, - async (prevData, { container }) => { - if (!prevData) { + async (ids, { container }) => { + if (!ids) { return } @@ -55,9 +46,6 @@ export const createReturnItemsStep = createStep( ModuleRegistrationName.ORDER ) - await orderModuleService.updateReturns( - { id: prevData.id }, - { items: prevData.items } - ) + await orderModuleService.deleteReturnItems(ids) } ) diff --git a/packages/core/core-flows/src/order/workflows/create-fulfillment.ts b/packages/core/core-flows/src/order/workflows/create-fulfillment.ts index 2b85bd163d..2bd7b8c6b4 100644 --- a/packages/core/core-flows/src/order/workflows/create-fulfillment.ts +++ b/packages/core/core-flows/src/order/workflows/create-fulfillment.ts @@ -222,7 +222,7 @@ export const createOrderFulfillmentWorkflow = createWorkflow( }) const shippingMethod = transform(order, (data) => { - return { data: data.shipping_methods?.[0].data } + return { data: data.shipping_methods?.[0]?.data } }) const shippingOptionId = transform(order, (data) => { diff --git a/packages/core/types/src/order/common.ts b/packages/core/types/src/order/common.ts index 1f7496540d..449a11624d 100644 --- a/packages/core/types/src/order/common.ts +++ b/packages/core/types/src/order/common.ts @@ -1139,6 +1139,21 @@ export interface ReturnDTO extends Omit { order_id: string } +export interface OrderReturnItemDTO { + id: string + return_id: string + order_id: string + item_id: string + reason_id?: string | null + quantity: number + raw_quantity: BigNumberRawValue + received_quantity?: number + raw_received_quantity?: BigNumberRawValue + metadata?: Record | null + created_at?: Date | string + updated_at?: Date | string +} + export interface OrderClaimDTO extends Omit { claim_items: any[] diff --git a/packages/core/types/src/order/mutations.ts b/packages/core/types/src/order/mutations.ts index 0d63ac6d76..59e70776e6 100644 --- a/packages/core/types/src/order/mutations.ts +++ b/packages/core/types/src/order/mutations.ts @@ -470,6 +470,15 @@ export interface UpdateOrderExchangeDTO { metadata?: Record | null } +export interface CreateOrderReturnItemDTO { + return_id: string + item_id: string + quantity?: BigNumberInput + reason_id?: string + note?: string + metadata?: Record | null +} + export interface UpdateOrderReturnWithSelectorDTO { selector: Partial data: Partial diff --git a/packages/core/types/src/order/service.ts b/packages/core/types/src/order/service.ts index 0506826864..509986f7d0 100644 --- a/packages/core/types/src/order/service.ts +++ b/packages/core/types/src/order/service.ts @@ -28,6 +28,7 @@ import { OrderLineItemAdjustmentDTO, OrderLineItemDTO, OrderLineItemTaxLineDTO, + OrderReturnItemDTO, OrderReturnReasonDTO, OrderShippingMethodAdjustmentDTO, OrderShippingMethodDTO, @@ -52,6 +53,7 @@ import { CreateOrderLineItemDTO, CreateOrderLineItemTaxLineDTO, CreateOrderReturnDTO, + CreateOrderReturnItemDTO, CreateOrderReturnReasonDTO, CreateOrderShippingMethodAdjustmentDTO, CreateOrderShippingMethodDTO, @@ -1891,6 +1893,16 @@ export interface IOrderModuleService extends IModuleService { sharedContext?: Context ): Promise | void> + createReturnItems( + data: CreateOrderReturnItemDTO, + sharedContext?: Context + ): Promise + + createReturnItems( + data: CreateOrderReturnItemDTO[], + sharedContext?: Context + ): Promise + createReturns( data: CreateOrderReturnDTO, sharedContext?: Context @@ -1916,6 +1928,8 @@ export interface IOrderModuleService extends IModuleService { deleteReturns(ids: string[], sharedContext?: Context): Promise + deleteReturnItems(ids: string[], sharedContext?: Context): Promise + softDeleteReturns( ids: string[], config?: SoftDeleteReturn, diff --git a/packages/modules/order/src/models/claim-item-image.ts b/packages/modules/order/src/models/claim-item-image.ts index 0a2d44e510..60fbf7ef1c 100644 --- a/packages/modules/order/src/models/claim-item-image.ts +++ b/packages/modules/order/src/models/claim-item-image.ts @@ -81,12 +81,12 @@ export default class ClaimItemImage { @BeforeCreate() onCreate() { this.id = generateEntityId(this.id, "climg") - this.claim_item_id = this.item?.id + this.claim_item_id ??= this.item?.id } @OnInit() onInit() { this.id = generateEntityId(this.id, "climg") - this.claim_item_id = this.item?.id + this.claim_item_id ??= this.item?.id } } diff --git a/packages/modules/order/src/models/claim-item.ts b/packages/modules/order/src/models/claim-item.ts index 6968e56d06..861ac72812 100644 --- a/packages/modules/order/src/models/claim-item.ts +++ b/packages/modules/order/src/models/claim-item.ts @@ -129,6 +129,6 @@ export default class OrderClaimItem { @OnInit() onInit() { this.id = generateEntityId(this.id, "claitem") - this.claim_id = this.claim?.id + this.claim_id ??= this.claim?.id } } diff --git a/packages/modules/order/src/models/exchange-item.ts b/packages/modules/order/src/models/exchange-item.ts index 444ec6acae..fd7aa7a8ca 100644 --- a/packages/modules/order/src/models/exchange-item.ts +++ b/packages/modules/order/src/models/exchange-item.ts @@ -105,12 +105,12 @@ export default class OrderExchangeItem { @BeforeCreate() onCreate() { this.id = generateEntityId(this.id, "oexcitem") - this.exchange_id = this.exchange?.id + this.exchange_id ??= this.exchange?.id } @OnInit() onInit() { this.id = generateEntityId(this.id, "oexcitem") - this.exchange_id = this.exchange?.id + this.exchange_id ??= this.exchange?.id } } diff --git a/packages/modules/order/src/models/return-item.ts b/packages/modules/order/src/models/return-item.ts index 010a90e54d..2db431ada9 100644 --- a/packages/modules/order/src/models/return-item.ts +++ b/packages/modules/order/src/models/return-item.ts @@ -132,12 +132,12 @@ export default class ReturnItem { @BeforeCreate() onCreate() { this.id = generateEntityId(this.id, "retitem") - this.return_id = this.return?.id + this.return_id ??= this.return?.id } @OnInit() onInit() { this.id = generateEntityId(this.id, "retitem") - this.return_id = this.return?.id + this.return_id ??= this.return?.id } }