fix(core-flows, link-modules): return fulfillment creation (#12227)
* fix: return fulfillment creation * chore: changeset * fix: link * fix: cancel claim flow * chore: test fulfillment creation as a part of return lifecycle test * fix: exchanges cancle flow --------- Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
This commit is contained in:
@@ -8,7 +8,7 @@ import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
|
||||
export const createReturnFulfillmentStepId = "create-return-fulfillment"
|
||||
/**
|
||||
* This step creates a fulfillment for a return.
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* const data = createReturnFulfillmentStep({
|
||||
* location_id: "sloc_123",
|
||||
|
||||
@@ -17,17 +17,17 @@ export const createReturnFulfillmentWorkflowId =
|
||||
/**
|
||||
* This workflow creates a fulfillment for a return. It's used by other return-related workflows,
|
||||
* such as {@link createAndCompleteReturnOrderWorkflow}.
|
||||
*
|
||||
*
|
||||
* You can use this workflow within your own customizations or custom workflows, allowing you to
|
||||
* create a fulfillment for a return within your custom flows.
|
||||
*
|
||||
*
|
||||
* :::note
|
||||
*
|
||||
*
|
||||
* You can retrieve an order's details using [Query](https://docs.medusajs.com/learn/fundamentals/module-links/query),
|
||||
* or [useQueryGraphStep](https://docs.medusajs.com/resources/references/medusa-workflows/steps/useQueryGraphStep).
|
||||
*
|
||||
*
|
||||
* :::
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* const { result } = await createReturnFulfillmentWorkflow(container)
|
||||
* .run({
|
||||
@@ -57,9 +57,9 @@ export const createReturnFulfillmentWorkflowId =
|
||||
* }
|
||||
* }
|
||||
* })
|
||||
*
|
||||
*
|
||||
* @summary
|
||||
*
|
||||
*
|
||||
* Create a fulfillment for a return.
|
||||
*/
|
||||
export const createReturnFulfillmentWorkflow = createWorkflow(
|
||||
|
||||
@@ -2,6 +2,7 @@ import {
|
||||
FulfillmentDTO,
|
||||
OrderClaimDTO,
|
||||
OrderWorkflow,
|
||||
ReturnDTO,
|
||||
} from "@medusajs/framework/types"
|
||||
import { MedusaError } from "@medusajs/framework/utils"
|
||||
import {
|
||||
@@ -26,6 +27,10 @@ export type CancelClaimValidateOrderStepInput = {
|
||||
* The order claim's details.
|
||||
*/
|
||||
orderClaim: OrderClaimDTO
|
||||
/**
|
||||
* The order claim's return details.
|
||||
*/
|
||||
orderReturn: ReturnDTO & { fulfillments: FulfillmentDTO[] }
|
||||
/**
|
||||
* The cancelation details.
|
||||
*/
|
||||
@@ -35,14 +40,14 @@ export type CancelClaimValidateOrderStepInput = {
|
||||
/**
|
||||
* This step validates that a confirmed claim can be canceled. If the claim is canceled,
|
||||
* or the claim's fulfillments are not canceled, the step will throw an error.
|
||||
*
|
||||
*
|
||||
* :::note
|
||||
*
|
||||
*
|
||||
* You can retrieve an order claim's details using [Query](https://docs.medusajs.com/learn/fundamentals/module-links/query),
|
||||
* or [useQueryGraphStep](https://docs.medusajs.com/resources/references/medusa-workflows/steps/useQueryGraphStep).
|
||||
*
|
||||
*
|
||||
* :::
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* const data = cancelClaimValidateOrderStep({
|
||||
* orderClaim: {
|
||||
@@ -56,10 +61,8 @@ export type CancelClaimValidateOrderStepInput = {
|
||||
*/
|
||||
export const cancelClaimValidateOrderStep = createStep(
|
||||
"validate-claim",
|
||||
({
|
||||
orderClaim,
|
||||
}: CancelClaimValidateOrderStepInput) => {
|
||||
const orderClaim_ = orderClaim as OrderClaimDTO & {
|
||||
({ orderClaim, orderReturn }: CancelClaimValidateOrderStepInput) => {
|
||||
const orderReturn_ = orderReturn as ReturnDTO & {
|
||||
fulfillments: FulfillmentDTO[]
|
||||
}
|
||||
|
||||
@@ -78,7 +81,7 @@ export const cancelClaimValidateOrderStep = createStep(
|
||||
const notCanceled = (o) => !o.canceled_at
|
||||
|
||||
throwErrorIf(
|
||||
orderClaim_.fulfillments,
|
||||
orderReturn_.fulfillments,
|
||||
notCanceled,
|
||||
"All fulfillments must be canceled before canceling a claim"
|
||||
)
|
||||
@@ -89,10 +92,10 @@ export const cancelOrderClaimWorkflowId = "cancel-claim"
|
||||
/**
|
||||
* This workflow cancels a confirmed order claim. It's used by the
|
||||
* [Cancel Claim API Route](https://docs.medusajs.com/api/admin#claims_postclaimsidcancel).
|
||||
*
|
||||
*
|
||||
* You can use this workflow within your customizations or your own custom workflows, allowing you to cancel a claim
|
||||
* for an order in your custom flows.
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* const { result } = await cancelOrderClaimWorkflow(container)
|
||||
* .run({
|
||||
@@ -100,9 +103,9 @@ export const cancelOrderClaimWorkflowId = "cancel-claim"
|
||||
* claim_id: "claim_123",
|
||||
* }
|
||||
* })
|
||||
*
|
||||
*
|
||||
* @summary
|
||||
*
|
||||
*
|
||||
* Cancel a confirmed order claim.
|
||||
*/
|
||||
export const cancelOrderClaimWorkflow = createWorkflow(
|
||||
@@ -110,23 +113,29 @@ export const cancelOrderClaimWorkflow = createWorkflow(
|
||||
(
|
||||
input: WorkflowData<OrderWorkflow.CancelOrderClaimWorkflowInput>
|
||||
): WorkflowData<void> => {
|
||||
const orderClaim: OrderClaimDTO & { fulfillments: FulfillmentDTO[] } =
|
||||
useRemoteQueryStep({
|
||||
entry_point: "order_claim",
|
||||
fields: [
|
||||
"id",
|
||||
"order_id",
|
||||
"return_id",
|
||||
"canceled_at",
|
||||
"fulfillments.canceled_at",
|
||||
"additional_items.item_id",
|
||||
],
|
||||
variables: { id: input.claim_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
})
|
||||
const orderClaim: OrderClaimDTO = useRemoteQueryStep({
|
||||
entry_point: "order_claim",
|
||||
fields: [
|
||||
"id",
|
||||
"order_id",
|
||||
"return_id",
|
||||
"canceled_at",
|
||||
"additional_items.item_id",
|
||||
],
|
||||
variables: { id: input.claim_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
}).config({ name: "claim-query" })
|
||||
|
||||
cancelClaimValidateOrderStep({ orderClaim, input })
|
||||
const orderReturn: ReturnDTO & { fulfillments: FulfillmentDTO[] } =
|
||||
useRemoteQueryStep({
|
||||
entry_point: "return",
|
||||
fields: ["id", "fulfillments.canceled_at"],
|
||||
variables: { id: orderClaim.return_id },
|
||||
list: false,
|
||||
}).config({ name: "return-query" })
|
||||
|
||||
cancelClaimValidateOrderStep({ orderClaim, orderReturn, input })
|
||||
|
||||
const lineItemIds = transform({ orderClaim }, ({ orderClaim }) => {
|
||||
return orderClaim.additional_items?.map((i) => i.item_id)
|
||||
|
||||
@@ -2,6 +2,7 @@ import {
|
||||
FulfillmentDTO,
|
||||
OrderExchangeDTO,
|
||||
OrderWorkflow,
|
||||
ReturnDTO,
|
||||
} from "@medusajs/framework/types"
|
||||
import { MedusaError } from "@medusajs/framework/utils"
|
||||
import {
|
||||
@@ -26,6 +27,10 @@ export type CancelExchangeValidateOrderStepInput = {
|
||||
* The order exchange's details.
|
||||
*/
|
||||
orderExchange: OrderExchangeDTO
|
||||
/**
|
||||
* The order return's details.
|
||||
*/
|
||||
orderReturn: ReturnDTO & { fulfillments: FulfillmentDTO[] }
|
||||
/**
|
||||
* The details of canceling the exchange.
|
||||
*/
|
||||
@@ -35,14 +40,14 @@ export type CancelExchangeValidateOrderStepInput = {
|
||||
/**
|
||||
* This step validates that an exchange can be canceled.
|
||||
* If the exchange is canceled, or any of the fulfillments are not canceled, the step will throw an error.
|
||||
*
|
||||
*
|
||||
* :::note
|
||||
*
|
||||
*
|
||||
* You can retrieve an order exchange's details using [Query](https://docs.medusajs.com/learn/fundamentals/module-links/query),
|
||||
* or [useQueryGraphStep](https://docs.medusajs.com/resources/references/medusa-workflows/steps/useQueryGraphStep).
|
||||
*
|
||||
*
|
||||
* :::
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* const data = cancelExchangeValidateOrder({
|
||||
* orderExchange: {
|
||||
@@ -56,10 +61,8 @@ export type CancelExchangeValidateOrderStepInput = {
|
||||
*/
|
||||
export const cancelExchangeValidateOrder = createStep(
|
||||
"validate-exchange",
|
||||
({
|
||||
orderExchange,
|
||||
}: CancelExchangeValidateOrderStepInput) => {
|
||||
const orderExchange_ = orderExchange as OrderExchangeDTO & {
|
||||
({ orderExchange, orderReturn }: CancelExchangeValidateOrderStepInput) => {
|
||||
const orderReturn_ = orderReturn as ReturnDTO & {
|
||||
fulfillments: FulfillmentDTO[]
|
||||
}
|
||||
|
||||
@@ -78,7 +81,7 @@ export const cancelExchangeValidateOrder = createStep(
|
||||
const notCanceled = (o) => !o.canceled_at
|
||||
|
||||
throwErrorIf(
|
||||
orderExchange_.fulfillments,
|
||||
orderReturn_.fulfillments,
|
||||
notCanceled,
|
||||
"All fulfillments must be canceled before canceling am exchange"
|
||||
)
|
||||
@@ -89,10 +92,10 @@ export const cancelOrderExchangeWorkflowId = "cancel-exchange"
|
||||
/**
|
||||
* This workflow cancels a confirmed exchange. It's used by the
|
||||
* [Cancel Exchange Admin API Route](https://docs.medusajs.com/api/admin#exchanges_postexchangesidcancel).
|
||||
*
|
||||
*
|
||||
* You can use this workflow within your customizations or your own custom workflows, allowing you to cancel an exchange
|
||||
* for an order in your custom flow.
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* const { result } = await cancelOrderExchangeWorkflow(container)
|
||||
* .run({
|
||||
@@ -100,9 +103,9 @@ export const cancelOrderExchangeWorkflowId = "cancel-exchange"
|
||||
* exchange_id: "exchange_123",
|
||||
* }
|
||||
* })
|
||||
*
|
||||
*
|
||||
* @summary
|
||||
*
|
||||
*
|
||||
* Cancel an exchange for an order.
|
||||
*/
|
||||
export const cancelOrderExchangeWorkflow = createWorkflow(
|
||||
@@ -118,7 +121,6 @@ export const cancelOrderExchangeWorkflow = createWorkflow(
|
||||
"order_id",
|
||||
"return_id",
|
||||
"canceled_at",
|
||||
"fulfillments.canceled_at",
|
||||
"additional_items.item_id",
|
||||
],
|
||||
variables: { id: input.exchange_id },
|
||||
@@ -126,7 +128,15 @@ export const cancelOrderExchangeWorkflow = createWorkflow(
|
||||
throw_if_key_not_found: true,
|
||||
})
|
||||
|
||||
cancelExchangeValidateOrder({ orderExchange, input })
|
||||
const orderReturn: ReturnDTO & { fulfillments: FulfillmentDTO[] } =
|
||||
useRemoteQueryStep({
|
||||
entry_point: "return",
|
||||
fields: ["id", "fulfillments.canceled_at"],
|
||||
variables: { id: orderExchange.return_id },
|
||||
list: false,
|
||||
}).config({ name: "return-query" })
|
||||
|
||||
cancelExchangeValidateOrder({ orderExchange, orderReturn, input })
|
||||
|
||||
const lineItemIds = transform({ orderExchange }, ({ orderExchange }) => {
|
||||
return orderExchange.additional_items?.map((i) => i.item_id)
|
||||
|
||||
@@ -169,26 +169,25 @@ function prepareFulfillmentData({
|
||||
}
|
||||
|
||||
function extractReturnShippingOptionId({ orderPreview, orderReturn }) {
|
||||
let returnShippingMethod
|
||||
for (const shippingMethod of orderPreview.shipping_methods ?? []) {
|
||||
const modifiedShippingMethod_ = shippingMethod as any
|
||||
if (!modifiedShippingMethod_.actions) {
|
||||
continue
|
||||
}
|
||||
|
||||
returnShippingMethod = modifiedShippingMethod_.actions.find((action) => {
|
||||
const methodAction = modifiedShippingMethod_.actions.find((action) => {
|
||||
return (
|
||||
action.action === ChangeActionType.SHIPPING_ADD &&
|
||||
action.return_id === orderReturn.id
|
||||
)
|
||||
})
|
||||
|
||||
if (methodAction) {
|
||||
return modifiedShippingMethod_.shipping_option_id
|
||||
}
|
||||
}
|
||||
|
||||
if (!returnShippingMethod) {
|
||||
return null
|
||||
}
|
||||
|
||||
return returnShippingMethod.shipping_option_id
|
||||
return null
|
||||
}
|
||||
|
||||
function getUpdateReturnData({ orderReturn }: { orderReturn: { id: string } }) {
|
||||
|
||||
Reference in New Issue
Block a user