feat(core-flows, fulfillment): Add create return specific method and add more tests (#7357)
* feat(core-flows, fulfillment): Add create return specific method and add more tests * fix defautl providers in tests fixtures * more tests * wip fixes * fix flow and tests * cleanup
This commit is contained in:
committed by
GitHub
parent
35dc3c5cf7
commit
c4fde7ea5c
@@ -7,6 +7,7 @@ import {
|
||||
WithCalculatedPrice,
|
||||
} from "@medusajs/types"
|
||||
import {
|
||||
createStep,
|
||||
createWorkflow,
|
||||
transform,
|
||||
WorkflowData,
|
||||
@@ -19,6 +20,7 @@ import {
|
||||
MathBN,
|
||||
MedusaError,
|
||||
Modules,
|
||||
remoteQueryObjectFromString,
|
||||
} from "@medusajs/utils"
|
||||
import { updateOrderTaxLinesStep } from "../steps"
|
||||
import { createReturnStep } from "../steps/create-return"
|
||||
@@ -55,7 +57,7 @@ function throwIfItemsDoesNotExistsInOrder({
|
||||
}
|
||||
}
|
||||
|
||||
function validateReturnReasons(
|
||||
async function validateReturnReasons(
|
||||
{
|
||||
orderId,
|
||||
inputItems,
|
||||
@@ -66,24 +68,32 @@ function validateReturnReasons(
|
||||
{ container }
|
||||
) {
|
||||
const reasonIds = inputItems.map((i) => i.reason_id).filter(Boolean)
|
||||
|
||||
if (!reasonIds.length) {
|
||||
return
|
||||
}
|
||||
|
||||
const remoteQuery = container.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
|
||||
|
||||
const returnReasons = remoteQuery({
|
||||
entry_point: "return_reasons",
|
||||
fields: ["return_reason_children.*"],
|
||||
variables: { id: [inputItems.map((item) => item.reason_id)] },
|
||||
const remoteQueryObject = remoteQueryObjectFromString({
|
||||
entryPoint: "return_reasons",
|
||||
fields: [
|
||||
"id",
|
||||
"parent_return_reason_id",
|
||||
"parent_return_reason",
|
||||
"return_reason_children.id",
|
||||
],
|
||||
variables: { id: [inputItems.map((item) => item.reason_id)], limit: null },
|
||||
})
|
||||
|
||||
const returnReasons = await remoteQuery(remoteQueryObject)
|
||||
|
||||
const reasons = returnReasons.map((r) => r.id)
|
||||
const hasInvalidReasons = reasons.filter(
|
||||
// We do not allow for root reason to be applied
|
||||
(reason) => reason.return_reason_children.length > 0
|
||||
)
|
||||
const hasInvalidReasons = returnReasons
|
||||
.filter(
|
||||
// We do not allow for root reason to be applied
|
||||
(reason) => reason.return_reason_children.length > 0
|
||||
)
|
||||
.map((r) => r.id)
|
||||
const hasNonExistingReasons = arrayDifference(reasonIds, reasons)
|
||||
|
||||
if (hasNonExistingReasons.length) {
|
||||
@@ -95,7 +105,7 @@ function validateReturnReasons(
|
||||
)
|
||||
}
|
||||
|
||||
if (hasInvalidReasons.length()) {
|
||||
if (hasInvalidReasons.length) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.INVALID_DATA,
|
||||
`Cannot apply return reason with id ${hasInvalidReasons.join(
|
||||
@@ -238,12 +248,34 @@ function prepareReturnShippingOptionQueryVariables({
|
||||
return variables
|
||||
}
|
||||
|
||||
const validationStep = createStep(
|
||||
"create-return-order-validation",
|
||||
async function (
|
||||
{
|
||||
order,
|
||||
input,
|
||||
}: {
|
||||
order
|
||||
input: OrderWorkflow.CreateOrderReturnWorkflowInput
|
||||
},
|
||||
context
|
||||
) {
|
||||
throwIfOrderIsCancelled({ order })
|
||||
throwIfItemsDoesNotExistsInOrder({ order, inputItems: input.items })
|
||||
await validateReturnReasons(
|
||||
{ orderId: input.order_id, inputItems: input.items },
|
||||
context
|
||||
)
|
||||
validateCustomRefundAmount({ order, refundAmount: input.refund_amount })
|
||||
}
|
||||
)
|
||||
|
||||
export const createReturnOrderWorkflowId = "create-return-order"
|
||||
export const createReturnOrderWorkflow = createWorkflow(
|
||||
createReturnOrderWorkflowId,
|
||||
(
|
||||
function (
|
||||
input: WorkflowData<OrderWorkflow.CreateOrderReturnWorkflowInput>
|
||||
): WorkflowData<void> => {
|
||||
): WorkflowData<void> {
|
||||
const order: OrderDTO = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
fields: [
|
||||
@@ -259,19 +291,7 @@ export const createReturnOrderWorkflow = createWorkflow(
|
||||
throw_if_key_not_found: true,
|
||||
})
|
||||
|
||||
transform({ order }, throwIfOrderIsCancelled)
|
||||
transform(
|
||||
{ order, inputItems: input.items },
|
||||
throwIfItemsDoesNotExistsInOrder
|
||||
)
|
||||
transform(
|
||||
{ orderId: input.order_id, inputItems: input.items },
|
||||
validateReturnReasons
|
||||
)
|
||||
transform(
|
||||
{ order, refundAmount: input.refund_amount },
|
||||
validateCustomRefundAmount
|
||||
)
|
||||
validationStep({ order, input })
|
||||
|
||||
const returnShippingOptionsVariables = transform(
|
||||
{ input, order },
|
||||
|
||||
@@ -2367,7 +2367,7 @@ export interface IFulfillmentModuleService extends IModuleService {
|
||||
): Promise<[FulfillmentDTO[], number]>
|
||||
|
||||
/**
|
||||
* This method creates a fulfillment.
|
||||
* This method creates a fulfillment and call the provider to create a fulfillment.
|
||||
*
|
||||
* @param {CreateFulfillmentDTO} data - The fulfillment to be created.
|
||||
* @param {Context} sharedContext - A context used to share resources, such as transaction manager, between the application and the module.
|
||||
@@ -2405,6 +2405,45 @@ export interface IFulfillmentModuleService extends IModuleService {
|
||||
sharedContext?: Context
|
||||
): Promise<FulfillmentDTO>
|
||||
|
||||
/**
|
||||
* This method creates a fulfillment and call the provider to create a return.
|
||||
*
|
||||
* @param {CreateFulfillmentDTO} data - The fulfillment to be created.
|
||||
* @param {Context} sharedContext - A context used to share resources, such as transaction manager, between the application and the module.
|
||||
* @returns {Promise<FulfillmentDTO>} The created fulfillment.
|
||||
*
|
||||
* @example
|
||||
* const fulfillment =
|
||||
* await fulfillmentModuleService.createReturnFulfillment({
|
||||
* location_id: "loc_123",
|
||||
* provider_id: "webshipper",
|
||||
* delivery_address: {
|
||||
* address_1: "4120 Auto Park Cir",
|
||||
* country_code: "us",
|
||||
* },
|
||||
* items: [
|
||||
* {
|
||||
* title: "Shirt",
|
||||
* sku: "SHIRT",
|
||||
* quantity: 1,
|
||||
* barcode: "ABCED",
|
||||
* },
|
||||
* ],
|
||||
* labels: [
|
||||
* {
|
||||
* tracking_number: "1234567",
|
||||
* tracking_url: "https://example.com/tracking",
|
||||
* label_url: "https://example.com/label",
|
||||
* },
|
||||
* ],
|
||||
* order: {},
|
||||
* })
|
||||
*/
|
||||
createReturnFulfillment(
|
||||
data: CreateFulfillmentDTO,
|
||||
sharedContext?: Context
|
||||
): Promise<FulfillmentDTO>
|
||||
|
||||
/**
|
||||
* This method updates an existing fulfillment.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user