Chore(core-flows,order): exchange/claim add item (#8126)
This commit is contained in:
committed by
GitHub
parent
5bb870948a
commit
8d530aa7f2
@@ -0,0 +1,33 @@
|
||||
import { CreateOrderLineItemDTO } from "@medusajs/types"
|
||||
import { ModuleRegistrationName } from "@medusajs/utils"
|
||||
import { StepResponse, createStep } from "@medusajs/workflows-sdk"
|
||||
|
||||
interface StepInput {
|
||||
items: CreateOrderLineItemDTO[]
|
||||
}
|
||||
|
||||
export const createOrderLineItemsStepId = "create-line-items-step"
|
||||
export const createOrderLineItemsStep = createStep(
|
||||
createOrderLineItemsStepId,
|
||||
async (input: StepInput, { container }) => {
|
||||
const orderModule = container.resolve(ModuleRegistrationName.ORDER)
|
||||
|
||||
const createdItems = input.items.length
|
||||
? await orderModule.createLineItems(input.items)
|
||||
: []
|
||||
|
||||
return new StepResponse(
|
||||
createdItems,
|
||||
createdItems.map((c) => c.id)
|
||||
)
|
||||
},
|
||||
async (itemIds, { container }) => {
|
||||
if (!itemIds?.length) {
|
||||
return
|
||||
}
|
||||
|
||||
const orderModule = container.resolve(ModuleRegistrationName.ORDER)
|
||||
|
||||
await orderModule.deleteLineItems(itemIds)
|
||||
}
|
||||
)
|
||||
@@ -8,6 +8,7 @@ export * from "./complete-orders"
|
||||
export * from "./create-claims"
|
||||
export * from "./create-complete-return"
|
||||
export * from "./create-exchanges"
|
||||
export * from "./create-line-items"
|
||||
export * from "./create-order-change"
|
||||
export * from "./create-order-change-actions"
|
||||
export * from "./create-orders"
|
||||
|
||||
148
packages/core/core-flows/src/order/workflows/add-line-items.ts
Normal file
148
packages/core/core-flows/src/order/workflows/add-line-items.ts
Normal file
@@ -0,0 +1,148 @@
|
||||
import { OrderLineItemDTO, OrderWorkflow } from "@medusajs/types"
|
||||
import { MathBN, MedusaError } from "@medusajs/utils"
|
||||
import {
|
||||
WorkflowData,
|
||||
createWorkflow,
|
||||
parallelize,
|
||||
transform,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { useRemoteQueryStep } from "../../common"
|
||||
import { findOneOrAnyRegionStep } from "../../definition/cart/steps/find-one-or-any-region"
|
||||
import { findOrCreateCustomerStep } from "../../definition/cart/steps/find-or-create-customer"
|
||||
import { findSalesChannelStep } from "../../definition/cart/steps/find-sales-channel"
|
||||
import { getVariantPriceSetsStep } from "../../definition/cart/steps/get-variant-price-sets"
|
||||
import { validateVariantPricesStep } from "../../definition/cart/steps/validate-variant-prices"
|
||||
import { prepareLineItemData } from "../../definition/cart/utils/prepare-line-item-data"
|
||||
import { confirmVariantInventoryWorkflow } from "../../definition/cart/workflows/confirm-variant-inventory"
|
||||
import { createOrderLineItemsStep } from "../steps"
|
||||
import { productVariantsFields } from "../utils/fields"
|
||||
import { prepareCustomLineItemData } from "../utils/prepare-custom-line-item-data"
|
||||
|
||||
function prepareLineItems(data) {
|
||||
const items = (data.input.items ?? []).map((item) => {
|
||||
const variant = data.variants.find((v) => v.id === item.variant_id)!
|
||||
|
||||
if (!variant) {
|
||||
return prepareCustomLineItemData({
|
||||
variant: {
|
||||
...item,
|
||||
},
|
||||
unitPrice: MathBN.max(0, item.unit_price),
|
||||
isTaxInclusive: item.is_tax_inclusive,
|
||||
quantity: item.quantity as number,
|
||||
metadata: item?.metadata ?? {},
|
||||
})
|
||||
}
|
||||
|
||||
return prepareLineItemData({
|
||||
variant: variant,
|
||||
unitPrice: MathBN.max(
|
||||
0,
|
||||
item.unit_price ??
|
||||
data.priceSets[item.variant_id!]?.raw_calculated_amount
|
||||
),
|
||||
isTaxInclusive:
|
||||
item.is_tax_inclusive ??
|
||||
data.priceSets[item.variant_id!]?.is_calculated_price_tax_inclusive,
|
||||
quantity: item.quantity as number,
|
||||
metadata: item?.metadata ?? {},
|
||||
taxLines: item.tax_lines || [],
|
||||
adjustments: item.adjustments || [],
|
||||
})
|
||||
})
|
||||
|
||||
return items
|
||||
}
|
||||
|
||||
export const addOrderLineItemsWorkflowId = "order-add-line-items"
|
||||
export const addOrderLineItemsWorkflow = createWorkflow(
|
||||
addOrderLineItemsWorkflowId,
|
||||
(
|
||||
input: WorkflowData<OrderWorkflow.OrderAddLineItemWorkflowInput>
|
||||
): WorkflowData<OrderLineItemDTO[]> => {
|
||||
const order = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
fields: [
|
||||
"id",
|
||||
"sales_channel_id",
|
||||
"region_id",
|
||||
"customer_id",
|
||||
"email",
|
||||
"currency_code",
|
||||
],
|
||||
variables: { id: input.order_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
}).config({ name: "order-query" })
|
||||
|
||||
const variantIds = transform({ input }, (data) => {
|
||||
return (data.input.items ?? [])
|
||||
.map((item) => item.variant_id)
|
||||
.filter(Boolean) as string[]
|
||||
})
|
||||
|
||||
const [salesChannel, region, customerData] = parallelize(
|
||||
findSalesChannelStep({
|
||||
salesChannelId: order.sales_channel_id,
|
||||
}),
|
||||
findOneOrAnyRegionStep({
|
||||
regionId: order.region_id,
|
||||
}),
|
||||
findOrCreateCustomerStep({
|
||||
customerId: order.customer_id,
|
||||
email: order.email,
|
||||
})
|
||||
)
|
||||
|
||||
const pricingContext = transform(
|
||||
{ input, region, customerData, order },
|
||||
(data) => {
|
||||
if (!data.region) {
|
||||
throw new MedusaError(MedusaError.Types.NOT_FOUND, "Region not found")
|
||||
}
|
||||
|
||||
return {
|
||||
currency_code: data.order.currency_code ?? data.region.currency_code,
|
||||
region_id: data.region.id,
|
||||
customer_id: data.customerData.customer?.id,
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const variants = useRemoteQueryStep({
|
||||
entry_point: "variants",
|
||||
fields: productVariantsFields,
|
||||
variables: {
|
||||
id: variantIds,
|
||||
calculated_price: {
|
||||
context: pricingContext,
|
||||
},
|
||||
},
|
||||
throw_if_key_not_found: true,
|
||||
}).config({ name: "variants-query" })
|
||||
|
||||
validateVariantPricesStep({ variants })
|
||||
|
||||
confirmVariantInventoryWorkflow.runAsStep({
|
||||
input: {
|
||||
sales_channel_id: salesChannel.id,
|
||||
variants,
|
||||
items: input.items!,
|
||||
},
|
||||
})
|
||||
|
||||
const priceSets = getVariantPriceSetsStep({
|
||||
variantIds,
|
||||
context: pricingContext,
|
||||
})
|
||||
|
||||
const lineItems = transform(
|
||||
{ priceSets, input, variants },
|
||||
prepareLineItems
|
||||
)
|
||||
|
||||
return createOrderLineItemsStep({
|
||||
items: lineItems,
|
||||
})
|
||||
}
|
||||
)
|
||||
@@ -21,7 +21,7 @@ export const beginClaimOrderWorkflowId = "begin-claim-order"
|
||||
export const beginClaimOrderWorkflow = createWorkflow(
|
||||
beginClaimOrderWorkflowId,
|
||||
function (
|
||||
input: WorkflowData<OrderWorkflow.beginOrderClaimWorkflowInput>
|
||||
input: WorkflowData<OrderWorkflow.BeginOrderClaimWorkflowInput>
|
||||
): WorkflowData<OrderChangeDTO> {
|
||||
const order: OrderDTO = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
|
||||
@@ -21,7 +21,7 @@ export const beginExchangeOrderWorkflowId = "begin-exchange-order"
|
||||
export const beginExchangeOrderWorkflow = createWorkflow(
|
||||
beginExchangeOrderWorkflowId,
|
||||
function (
|
||||
input: WorkflowData<OrderWorkflow.beginOrderExchangeWorkflowInput>
|
||||
input: WorkflowData<OrderWorkflow.BeginOrderExchangeWorkflowInput>
|
||||
): WorkflowData<OrderChangeDTO> {
|
||||
const order: OrderDTO = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
|
||||
@@ -21,7 +21,7 @@ export const beginReturnOrderWorkflowId = "begin-return-order"
|
||||
export const beginReturnOrderWorkflow = createWorkflow(
|
||||
beginReturnOrderWorkflowId,
|
||||
function (
|
||||
input: WorkflowData<OrderWorkflow.beginOrderReturnWorkflowInput>
|
||||
input: WorkflowData<OrderWorkflow.BeginOrderReturnWorkflowInput>
|
||||
): WorkflowData<OrderChangeDTO> {
|
||||
const order: OrderDTO = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
import {
|
||||
OrderChangeDTO,
|
||||
OrderClaimDTO,
|
||||
OrderDTO,
|
||||
OrderWorkflow,
|
||||
} from "@medusajs/types"
|
||||
import { ChangeActionType } from "@medusajs/utils"
|
||||
import {
|
||||
WorkflowData,
|
||||
createStep,
|
||||
createWorkflow,
|
||||
transform,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { useRemoteQueryStep } from "../../common"
|
||||
import { createOrderChangeActionsStep } from "../steps/create-order-change-actions"
|
||||
import { previewOrderChangeStep } from "../steps/preview-order-change"
|
||||
import {
|
||||
throwIfIsCancelled,
|
||||
throwIfOrderChangeIsNotActive,
|
||||
throwIfOrderIsCancelled,
|
||||
} from "../utils/order-validation"
|
||||
import { addOrderLineItemsWorkflow } from "./add-line-items"
|
||||
|
||||
const validationStep = createStep(
|
||||
"claim-add-new-item-validation",
|
||||
async function ({
|
||||
order,
|
||||
orderChange,
|
||||
orderClaim,
|
||||
}: {
|
||||
order: OrderDTO
|
||||
orderClaim: OrderClaimDTO
|
||||
orderChange: OrderChangeDTO
|
||||
}) {
|
||||
throwIfOrderIsCancelled({ order })
|
||||
throwIfIsCancelled(orderClaim, "Claim")
|
||||
throwIfOrderChangeIsNotActive({ orderChange })
|
||||
}
|
||||
)
|
||||
|
||||
export const orderClaimAddNewItemWorkflowId = "claim-add-new-item"
|
||||
export const orderClaimAddNewItemWorkflow = createWorkflow(
|
||||
orderClaimAddNewItemWorkflowId,
|
||||
function (
|
||||
input: WorkflowData<OrderWorkflow.OrderClaimAddNewItemWorkflowInput>
|
||||
): WorkflowData<OrderDTO> {
|
||||
const orderClaim = useRemoteQueryStep({
|
||||
entry_point: "order_claim",
|
||||
fields: ["id", "order_id"],
|
||||
variables: { id: input.claim_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
}).config({ name: "claim-query" })
|
||||
|
||||
const order: OrderDTO = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
fields: ["id", "status", "items.*"],
|
||||
variables: { id: orderClaim.order_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
}).config({ name: "order-query" })
|
||||
|
||||
const orderChange: OrderChangeDTO = useRemoteQueryStep({
|
||||
entry_point: "order_change",
|
||||
fields: ["id", "status"],
|
||||
variables: { order_id: orderClaim.order_id },
|
||||
list: false,
|
||||
}).config({ name: "order-change-query" })
|
||||
|
||||
validationStep({
|
||||
order,
|
||||
orderClaim,
|
||||
orderChange,
|
||||
})
|
||||
|
||||
const lineItems = addOrderLineItemsWorkflow.runAsStep({
|
||||
input: {
|
||||
order_id: order.id,
|
||||
items: input.items,
|
||||
},
|
||||
})
|
||||
|
||||
const orderChangeActionInput = transform(
|
||||
{ order, orderChange, orderClaim, items: input.items, lineItems },
|
||||
({ order, orderChange, orderClaim, items, lineItems }) => {
|
||||
return items.map((item, index) => ({
|
||||
order_change_id: orderChange.id,
|
||||
order_id: order.id,
|
||||
claim_id: orderClaim.id,
|
||||
version: orderChange.version,
|
||||
action: ChangeActionType.ITEM_ADD,
|
||||
internal_note: item.internal_note,
|
||||
reference: "order_claim",
|
||||
reference_id: orderClaim.id,
|
||||
details: {
|
||||
reference_id: lineItems[index].id,
|
||||
quantity: item.quantity,
|
||||
unit_price: item.unit_price,
|
||||
metadata: item.metadata,
|
||||
},
|
||||
}))
|
||||
}
|
||||
)
|
||||
|
||||
createOrderChangeActionsStep(orderChangeActionInput)
|
||||
|
||||
return previewOrderChangeStep(orderClaim.order_id)
|
||||
}
|
||||
)
|
||||
@@ -147,8 +147,6 @@ export const orderClaimRequestItemReturnWorkflow = createWorkflow(
|
||||
reference_id: orderReturn.id,
|
||||
details: {
|
||||
reference_id: item.id,
|
||||
claim_id: orderClaim.id,
|
||||
return_id: orderReturn.id,
|
||||
quantity: item.quantity,
|
||||
metadata: item.metadata,
|
||||
},
|
||||
|
||||
@@ -38,7 +38,8 @@ function prepareLineItems(data) {
|
||||
variant: variant,
|
||||
unitPrice: MathBN.max(
|
||||
0,
|
||||
item.unit_price ?? data.priceSets[item.variant_id!]?.calculated_amount
|
||||
item.unit_price ??
|
||||
data.priceSets[item.variant_id!]?.raw_calculated_amount
|
||||
),
|
||||
isTaxInclusive:
|
||||
item.is_tax_inclusive ??
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
import {
|
||||
OrderChangeDTO,
|
||||
OrderDTO,
|
||||
OrderExchangeDTO,
|
||||
OrderWorkflow,
|
||||
} from "@medusajs/types"
|
||||
import { ChangeActionType } from "@medusajs/utils"
|
||||
import {
|
||||
WorkflowData,
|
||||
createStep,
|
||||
createWorkflow,
|
||||
transform,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { useRemoteQueryStep } from "../../common"
|
||||
import { createOrderChangeActionsStep } from "../steps/create-order-change-actions"
|
||||
import { previewOrderChangeStep } from "../steps/preview-order-change"
|
||||
import {
|
||||
throwIfIsCancelled,
|
||||
throwIfOrderChangeIsNotActive,
|
||||
throwIfOrderIsCancelled,
|
||||
} from "../utils/order-validation"
|
||||
import { addOrderLineItemsWorkflow } from "./add-line-items"
|
||||
|
||||
const validationStep = createStep(
|
||||
"exchange-add-new-item-validation",
|
||||
async function ({
|
||||
order,
|
||||
orderChange,
|
||||
orderExchange,
|
||||
}: {
|
||||
order: OrderDTO
|
||||
orderExchange: OrderExchangeDTO
|
||||
orderChange: OrderChangeDTO
|
||||
}) {
|
||||
throwIfOrderIsCancelled({ order })
|
||||
throwIfIsCancelled(orderExchange, "Exchange")
|
||||
throwIfOrderChangeIsNotActive({ orderChange })
|
||||
}
|
||||
)
|
||||
|
||||
export const orderExchangeAddNewItemWorkflowId = "exchange-add-new-item"
|
||||
export const orderExchangeAddNewItemWorkflow = createWorkflow(
|
||||
orderExchangeAddNewItemWorkflowId,
|
||||
function (
|
||||
input: WorkflowData<OrderWorkflow.OrderExchangeAddNewItemWorkflowInput>
|
||||
): WorkflowData<OrderDTO> {
|
||||
const orderExchange = useRemoteQueryStep({
|
||||
entry_point: "order_exchange",
|
||||
fields: ["id", "order_id"],
|
||||
variables: { id: input.exchange_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
}).config({ name: "exchange-query" })
|
||||
|
||||
const order: OrderDTO = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
fields: ["id", "status", "items.*"],
|
||||
variables: { id: orderExchange.order_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
}).config({ name: "order-query" })
|
||||
|
||||
const orderChange: OrderChangeDTO = useRemoteQueryStep({
|
||||
entry_point: "order_change",
|
||||
fields: ["id", "status"],
|
||||
variables: { order_id: orderExchange.order_id },
|
||||
list: false,
|
||||
}).config({ name: "order-change-query" })
|
||||
|
||||
validationStep({
|
||||
order,
|
||||
orderExchange,
|
||||
orderChange,
|
||||
})
|
||||
|
||||
const lineItems = addOrderLineItemsWorkflow.runAsStep({
|
||||
input: {
|
||||
order_id: order.id,
|
||||
items: input.items,
|
||||
},
|
||||
})
|
||||
|
||||
const orderChangeActionInput = transform(
|
||||
{ order, orderChange, orderExchange, items: input.items, lineItems },
|
||||
({ order, orderChange, orderExchange, items, lineItems }) => {
|
||||
return items.map((item, index) => ({
|
||||
order_change_id: orderChange.id,
|
||||
order_id: order.id,
|
||||
exchange_id: orderExchange.id,
|
||||
version: orderChange.version,
|
||||
action: ChangeActionType.ITEM_ADD,
|
||||
internal_note: item.internal_note,
|
||||
reference: "order_exchange",
|
||||
reference_id: orderExchange.id,
|
||||
details: {
|
||||
reference_id: lineItems[index].id,
|
||||
quantity: item.quantity,
|
||||
unit_price: item.unit_price,
|
||||
metadata: item.metadata,
|
||||
},
|
||||
}))
|
||||
}
|
||||
)
|
||||
|
||||
createOrderChangeActionsStep(orderChangeActionInput)
|
||||
|
||||
return previewOrderChangeStep(orderExchange.order_id)
|
||||
}
|
||||
)
|
||||
@@ -148,8 +148,6 @@ export const orderExchangeRequestItemReturnWorkflow = createWorkflow(
|
||||
reference_id: orderReturn.id,
|
||||
details: {
|
||||
reference_id: item.id,
|
||||
exchange_id: orderExchange.id,
|
||||
return_id: orderReturn.id,
|
||||
quantity: item.quantity,
|
||||
metadata: item.metadata,
|
||||
},
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
export * from "./add-line-items"
|
||||
export * from "./archive-orders"
|
||||
export * from "./begin-order-claim"
|
||||
export * from "./begin-order-exchange"
|
||||
@@ -18,6 +19,7 @@ export * from "./create-shipment"
|
||||
export * from "./decline-order-change"
|
||||
export * from "./delete-order-change"
|
||||
export * from "./delete-order-change-actions"
|
||||
export * from "./exchange-add-new-item"
|
||||
export * from "./exchange-request-item-return"
|
||||
export * from "./get-order-detail"
|
||||
export * from "./get-orders-list"
|
||||
|
||||
Reference in New Issue
Block a user