feat(core-flows,dashboard): adds item validations for claims, returns and exchanges (#8735)

what:

- adds item validations for claims, returns and exchanges
- prevents autofocus on item add
- reset item quantity when error
This commit is contained in:
Riqwan Thamir
2024-08-23 09:30:27 +00:00
committed by GitHub
parent b23f0f8188
commit 59599ac237
9 changed files with 217 additions and 54 deletions
@@ -3,26 +3,29 @@ import {
OrderChangeActionDTO,
OrderChangeDTO,
OrderClaimDTO,
OrderClaimItemDTO,
OrderDTO,
OrderPreviewDTO,
OrderReturnItemDTO,
} from "@medusajs/types"
import {
ChangeActionType,
MedusaError,
Modules,
OrderChangeStatus,
ReturnStatus,
} from "@medusajs/utils"
import {
WorkflowResponse,
createStep,
createWorkflow,
parallelize,
transform,
when,
WorkflowResponse,
} from "@medusajs/workflows-sdk"
import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common"
import { reserveInventoryStep } from "../../../cart/steps/reserve-inventory"
import { prepareConfirmInventoryInput } from "../../../cart/utils/prepare-confirm-inventory-input"
import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common"
import { createReturnFulfillmentWorkflow } from "../../../fulfillment/workflows/create-return-fulfillment"
import { previewOrderChangeStep, updateReturnsStep } from "../../steps"
import { createOrderClaimItemsFromActionsStep } from "../../steps/claim/create-claim-items-from-actions"
@@ -58,6 +61,29 @@ export const confirmClaimRequestValidationStep = createStep(
}
)
/**
* This step confirms that a requested claim has atleast one item to return or send
*/
const confirmIfClaimItemsArePresent = createStep(
"confirm-if-items-are-present",
async function ({
claimItems,
returnItems,
}: {
claimItems: OrderClaimItemDTO[]
returnItems?: OrderReturnItemDTO[]
}) {
if (claimItems.length > 0 || (returnItems && returnItems.length > 0)) {
return
}
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
`Order claim request should have atleast 1 item`
)
}
)
function prepareFulfillmentData({
order,
items,
@@ -188,7 +214,13 @@ export const confirmClaimRequestWorkflow = createWorkflow(
): WorkflowResponse<OrderPreviewDTO> {
const orderClaim: OrderClaimDTO = useRemoteQueryStep({
entry_point: "order_claim",
fields: ["id", "status", "order_id", "canceled_at"],
fields: [
"id",
"status",
"order_id",
"canceled_at",
"additional_items.id",
],
variables: { id: input.claim_id },
list: false,
throw_if_key_not_found: true,
@@ -241,12 +273,16 @@ export const confirmClaimRequestWorkflow = createWorkflow(
const orderPreview = previewOrderChangeStep(order.id)
const [createClaimItems, createdReturnItems] = parallelize(
const [createdClaimItems, createdReturnItems] = parallelize(
createOrderClaimItemsFromActionsStep(claimItems),
createReturnItemsFromActionsStep(returnItems),
confirmOrderChanges({ changes: [orderChange], orderId: order.id })
createReturnItemsFromActionsStep(returnItems)
)
confirmIfClaimItemsArePresent({
claimItems: createdClaimItems,
returnItems: createdReturnItems,
})
const returnId = transform(
{ createdReturnItems },
({ createdReturnItems }) => {
@@ -254,6 +290,8 @@ export const confirmClaimRequestWorkflow = createWorkflow(
}
)
confirmOrderChanges({ changes: [orderChange], orderId: order.id })
when({ returnId }, ({ returnId }) => {
return !!returnId
}).then(() => {
@@ -266,9 +304,12 @@ export const confirmClaimRequestWorkflow = createWorkflow(
])
})
const claimId = transform({ createClaimItems }, ({ createClaimItems }) => {
return createClaimItems?.[0]?.claim_id
})
const claimId = transform(
{ createdClaimItems },
({ createdClaimItems }) => {
return createdClaimItems?.[0]?.claim_id
}
)
const { returnShippingMethod, claimShippingMethod } = transform(
{ orderPreview, orderClaim, returnId },
@@ -4,10 +4,13 @@ import {
OrderChangeDTO,
OrderDTO,
OrderExchangeDTO,
OrderExchangeItemDTO,
OrderPreviewDTO,
OrderReturnItemDTO,
} from "@medusajs/types"
import {
ChangeActionType,
MedusaError,
Modules,
OrderChangeStatus,
ReturnStatus,
@@ -20,9 +23,9 @@ import {
transform,
when,
} from "@medusajs/workflows-sdk"
import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common"
import { reserveInventoryStep } from "../../../cart/steps/reserve-inventory"
import { prepareConfirmInventoryInput } from "../../../cart/utils/prepare-confirm-inventory-input"
import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common"
import { createReturnFulfillmentWorkflow } from "../../../fulfillment/workflows/create-return-fulfillment"
import { previewOrderChangeStep, updateReturnsStep } from "../../steps"
import { confirmOrderChanges } from "../../steps/confirm-order-changes"
@@ -58,6 +61,29 @@ export const confirmExchangeRequestValidationStep = createStep(
}
)
/**
* This step confirms that a requested exchange has atleast one item to return or send
*/
const confirmIfExchangeItemsArePresent = createStep(
"confirm-if-exchange-items-are-present",
async function ({
exchangeItems,
returnItems,
}: {
exchangeItems: OrderExchangeItemDTO[]
returnItems?: OrderReturnItemDTO[]
}) {
if (exchangeItems.length > 0 && (returnItems || []).length > 0) {
return
}
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
`Order exchange request should have atleast 1 item inbound and 1 item outbound`
)
}
)
function prepareFulfillmentData({
order,
items,
@@ -235,12 +261,18 @@ export const confirmExchangeRequestWorkflow = createWorkflow(
const orderPreview = previewOrderChangeStep(order.id)
const [createExchangeItems, createdReturnItems] = parallelize(
const [createdExchangeItems, createdReturnItems] = parallelize(
createOrderExchangeItemsFromActionsStep(exchangeItems),
createReturnItemsFromActionsStep(returnItems),
confirmOrderChanges({ changes: [orderChange], orderId: order.id })
createReturnItemsFromActionsStep(returnItems)
)
confirmIfExchangeItemsArePresent({
exchangeItems: createdExchangeItems,
returnItems: createdReturnItems,
})
confirmOrderChanges({ changes: [orderChange], orderId: order.id })
const returnId = transform(
{ createdReturnItems },
({ createdReturnItems }) => {
@@ -261,9 +293,9 @@ export const confirmExchangeRequestWorkflow = createWorkflow(
})
const exchangeId = transform(
{ createExchangeItems },
({ createExchangeItems }) => {
return createExchangeItems?.[0]?.exchange_id
{ createdExchangeItems },
({ createdExchangeItems }) => {
return createdExchangeItems?.[0]?.exchange_id
}
)
@@ -3,10 +3,12 @@ import {
OrderChangeDTO,
OrderDTO,
OrderPreviewDTO,
OrderReturnItemDTO,
ReturnDTO,
} from "@medusajs/types"
import {
ChangeActionType,
MedusaError,
Modules,
OrderChangeStatus,
ReturnStatus,
@@ -54,6 +56,23 @@ export const confirmReturnRequestValidationStep = createStep(
}
)
/**
* This step confirms that a requested return has atleast one item
*/
const confirmIfReturnItemsArePresent = createStep(
"confirm-if-return-items-are-present",
async function ({ returnItems }: { returnItems: OrderReturnItemDTO[] }) {
if (returnItems.length > 0) {
return
}
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
`Order return request should have atleast 1 item`
)
}
)
function prepareFulfillmentData({
order,
items,
@@ -203,6 +222,8 @@ export const confirmReturnRequestWorkflow = createWorkflow(
changes: returnItemActions,
})
confirmIfReturnItemsArePresent({ returnItems: createdReturnItems })
const returnShippingOptionId = transform(
{ orderPreview, orderReturn },
extractReturnShippingOptionId