fix(core-flows): confirm return request (#8242)

This commit is contained in:
Carlos R. L. Rodrigues
2024-07-23 13:29:06 -03:00
committed by GitHub
parent 47dde05517
commit f38f6d53b4
11 changed files with 190 additions and 36 deletions

View File

@@ -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",
})
)

View File

@@ -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,

View File

@@ -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<string, unknown>) ?? {},
}
} 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)
}
)

View File

@@ -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) => {

View File

@@ -1139,6 +1139,21 @@ export interface ReturnDTO extends Omit<OrderDTO, "status" | "version"> {
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<string, unknown> | null
created_at?: Date | string
updated_at?: Date | string
}
export interface OrderClaimDTO
extends Omit<OrderDTO, "status" | "version" | "items"> {
claim_items: any[]

View File

@@ -470,6 +470,15 @@ export interface UpdateOrderExchangeDTO {
metadata?: Record<string, unknown> | null
}
export interface CreateOrderReturnItemDTO {
return_id: string
item_id: string
quantity?: BigNumberInput
reason_id?: string
note?: string
metadata?: Record<string, unknown> | null
}
export interface UpdateOrderReturnWithSelectorDTO {
selector: Partial<ReturnDTO>
data: Partial<UpdateReturnDTO>

View File

@@ -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<Record<string, string[]> | void>
createReturnItems(
data: CreateOrderReturnItemDTO,
sharedContext?: Context
): Promise<OrderReturnItemDTO>
createReturnItems(
data: CreateOrderReturnItemDTO[],
sharedContext?: Context
): Promise<OrderReturnItemDTO[]>
createReturns(
data: CreateOrderReturnDTO,
sharedContext?: Context
@@ -1916,6 +1928,8 @@ export interface IOrderModuleService extends IModuleService {
deleteReturns(ids: string[], sharedContext?: Context): Promise<void>
deleteReturnItems(ids: string[], sharedContext?: Context): Promise<void>
softDeleteReturns<TReturnableLinkableKeys extends string = string>(
ids: string[],
config?: SoftDeleteReturn<TReturnableLinkableKeys>,

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}