Chore(core-flows,order): exchange/claim add item (#8126)

This commit is contained in:
Carlos R. L. Rodrigues
2024-07-15 08:08:43 -03:00
committed by GitHub
parent 5bb870948a
commit 8d530aa7f2
27 changed files with 636 additions and 70 deletions

View File

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

View File

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

View 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,
})
}
)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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