feat(core-flows): custom price flag for order line items and shipping methods (#8969)
CLOSES: CC-402
This commit is contained in:
committed by
GitHub
parent
0fe1201435
commit
2a055b71ef
@@ -594,13 +594,17 @@ medusaIntegrationTestRunner({
|
||||
adminHeaders
|
||||
)
|
||||
|
||||
// shipping Options w/ custom price
|
||||
const {
|
||||
data: {
|
||||
order_preview: { shipping_methods: outboundShippingMethods },
|
||||
},
|
||||
} = await api.post(
|
||||
`/admin/claims/${claimId}/outbound/shipping-method`,
|
||||
{ shipping_option_id: outboundShippingOption.id },
|
||||
{
|
||||
shipping_option_id: outboundShippingOption.id,
|
||||
custom_amount: 12.5,
|
||||
},
|
||||
adminHeaders
|
||||
)
|
||||
|
||||
@@ -608,9 +612,32 @@ medusaIntegrationTestRunner({
|
||||
(m) => m.shipping_option_id == outboundShippingOption.id
|
||||
)
|
||||
|
||||
expect(outboundShippingMethod.subtotal).toBe(12.5)
|
||||
expect(outboundShippingMethod.is_custom_amount).toBe(true)
|
||||
|
||||
// Reset shipping custom price
|
||||
const {
|
||||
data: {
|
||||
order_preview: { shipping_methods: outboundShippingMethods2 },
|
||||
},
|
||||
} = await api.post(
|
||||
`/admin/claims/${claimId}/outbound/shipping-method/${outboundShippingMethod.actions[0].id}`,
|
||||
{
|
||||
custom_amount: null,
|
||||
},
|
||||
adminHeaders
|
||||
)
|
||||
|
||||
const outboundShippingMethodReset = outboundShippingMethods2.find(
|
||||
(m) => m.shipping_option_id == outboundShippingOption.id
|
||||
)
|
||||
|
||||
expect(outboundShippingMethodReset.subtotal).toBe(20)
|
||||
expect(outboundShippingMethodReset.is_custom_amount).toBe(false)
|
||||
|
||||
// Delete & recreate again to ensure it works for both delete and create
|
||||
await api.delete(
|
||||
`/admin/claims/${claimId}/outbound/shipping-method/${outboundShippingMethod.actions[0].id}`,
|
||||
`/admin/claims/${claimId}/outbound/shipping-method/${outboundShippingMethodReset.actions[0].id}`,
|
||||
adminHeaders
|
||||
)
|
||||
|
||||
|
||||
@@ -665,7 +665,7 @@ medusaIntegrationTestRunner({
|
||||
result = await api.post(
|
||||
`/admin/returns/${returnId}/shipping-method/${updateShippingActionId}`,
|
||||
{
|
||||
custom_price: 1002,
|
||||
custom_amount: 1002,
|
||||
internal_note: "cx agent note",
|
||||
},
|
||||
adminHeaders
|
||||
|
||||
@@ -203,6 +203,7 @@ medusaIntegrationTestRunner({
|
||||
value: "50",
|
||||
precision: 20,
|
||||
},
|
||||
is_custom_price: false,
|
||||
metadata: null,
|
||||
created_at: expect.any(String),
|
||||
updated_at: expect.any(String),
|
||||
|
||||
+1
-1
@@ -95,7 +95,7 @@ medusaIntegrationTestRunner({
|
||||
input: {
|
||||
return_id: returnOrder.id,
|
||||
shipping_option_id: shippingOptionId,
|
||||
custom_price: 20,
|
||||
custom_amount: 20,
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
+2
-2
@@ -845,7 +845,7 @@ export const ClaimCreateForm = ({
|
||||
updateInboundShipping(
|
||||
{
|
||||
actionId,
|
||||
custom_price: customPrice,
|
||||
custom_amount: customPrice,
|
||||
},
|
||||
{
|
||||
onError: (error) => {
|
||||
@@ -916,7 +916,7 @@ export const ClaimCreateForm = ({
|
||||
updateOutboundShipping(
|
||||
{
|
||||
actionId,
|
||||
custom_price: customPrice,
|
||||
custom_amount: customPrice,
|
||||
},
|
||||
{
|
||||
onError: (error) => {
|
||||
|
||||
+2
-2
@@ -364,7 +364,7 @@ export const ExchangeCreateForm = ({
|
||||
updateInboundShipping(
|
||||
{
|
||||
actionId,
|
||||
custom_price: customPrice,
|
||||
custom_amount: customPrice,
|
||||
},
|
||||
{
|
||||
onError: (error) => {
|
||||
@@ -435,7 +435,7 @@ export const ExchangeCreateForm = ({
|
||||
updateOutboundShipping(
|
||||
{
|
||||
actionId,
|
||||
custom_price: customPrice,
|
||||
custom_amount: customPrice,
|
||||
},
|
||||
{
|
||||
onError: (error) => {
|
||||
|
||||
+1
-1
@@ -646,7 +646,7 @@ export const ReturnCreateForm = ({
|
||||
if (actionId) {
|
||||
updateReturnShipping({
|
||||
actionId,
|
||||
custom_price:
|
||||
custom_amount:
|
||||
typeof customShippingAmount === "string"
|
||||
? null
|
||||
: customShippingAmount,
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
import { OrderChangeActionDTO } from "@medusajs/types"
|
||||
import { isDefined } from "@medusajs/utils"
|
||||
|
||||
export function prepareShippingMethod(relatedEntityField?: string) {
|
||||
return function (data) {
|
||||
const option = data.shippingOptions[0]
|
||||
const orderChange = data.orderChange
|
||||
|
||||
const isCustomPrice = isDefined(data.customPrice)
|
||||
const obj = {
|
||||
shipping_option_id: option.id,
|
||||
amount: isCustomPrice
|
||||
? data.customPrice
|
||||
: option.calculated_price.calculated_amount,
|
||||
is_custom_amount: isCustomPrice,
|
||||
is_tax_inclusive:
|
||||
!!option.calculated_price.is_calculated_price_tax_inclusive,
|
||||
data: option.data ?? {},
|
||||
name: option.name,
|
||||
version: orderChange.version,
|
||||
order_id: data.relatedEntity.order_id,
|
||||
} as any
|
||||
|
||||
if (relatedEntityField) {
|
||||
obj.return_id = data.input.return_id
|
||||
obj[relatedEntityField] = data.relatedEntity.id
|
||||
|
||||
if (relatedEntityField === "return_id") {
|
||||
obj.claim_id = data.relatedEntity.claim_id
|
||||
obj.exchange_id = data.relatedEntity.exchange_id
|
||||
}
|
||||
}
|
||||
|
||||
return obj
|
||||
}
|
||||
}
|
||||
|
||||
export function prepareShippingMethodUpdate({
|
||||
input,
|
||||
orderChange,
|
||||
shippingOptions,
|
||||
}) {
|
||||
const originalAction = (orderChange.actions ?? []).find(
|
||||
(a) => a.id === input.action_id
|
||||
) as OrderChangeActionDTO
|
||||
|
||||
const data = input.data
|
||||
|
||||
const option = shippingOptions?.[0]
|
||||
|
||||
const isCustomPrice = !isDefined(shippingOptions)
|
||||
const price = isCustomPrice
|
||||
? data.custom_amount
|
||||
: option.calculated_price.calculated_amount
|
||||
|
||||
const action = {
|
||||
id: originalAction.id,
|
||||
amount: price,
|
||||
internal_note: data.internal_note,
|
||||
}
|
||||
|
||||
const shippingMethod = {
|
||||
id: originalAction.reference_id,
|
||||
amount: price,
|
||||
is_custom_amount: isCustomPrice,
|
||||
metadata: data.metadata,
|
||||
}
|
||||
|
||||
return {
|
||||
action,
|
||||
shippingMethod,
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
throwIfIsCancelled,
|
||||
throwIfOrderChangeIsNotActive,
|
||||
} from "../../utils/order-validation"
|
||||
import { prepareShippingMethod } from "../../utils/prepare-shipping-method"
|
||||
import { createOrderChangeActionsWorkflow } from "../create-order-change-actions"
|
||||
import { updateOrderTaxLinesWorkflow } from "../update-tax-lines"
|
||||
|
||||
@@ -53,7 +54,7 @@ export const createClaimShippingMethodWorkflow = createWorkflow(
|
||||
return_id?: string
|
||||
claim_id?: string
|
||||
shipping_option_id: string
|
||||
custom_price?: BigNumberInput
|
||||
custom_amount?: BigNumberInput | null
|
||||
}): WorkflowResponse<OrderPreviewDTO> {
|
||||
const orderClaim: OrderClaimDTO = useRemoteQueryStep({
|
||||
entry_point: "order_claim",
|
||||
@@ -65,7 +66,7 @@ export const createClaimShippingMethodWorkflow = createWorkflow(
|
||||
|
||||
const order: OrderDTO = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
fields: ["id", "status", "currency_code", "canceled_at"],
|
||||
fields: ["id", "status", "region_id", "currency_code", "canceled_at"],
|
||||
variables: { id: orderClaim.order_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
@@ -104,29 +105,13 @@ export const createClaimShippingMethodWorkflow = createWorkflow(
|
||||
|
||||
const shippingMethodInput = transform(
|
||||
{
|
||||
orderClaim,
|
||||
relatedEntity: orderClaim,
|
||||
shippingOptions,
|
||||
customPrice: input.custom_price,
|
||||
customPrice: input.custom_amount,
|
||||
orderChange,
|
||||
input,
|
||||
},
|
||||
(data) => {
|
||||
const option = data.shippingOptions[0]
|
||||
const orderChange = data.orderChange
|
||||
|
||||
return {
|
||||
shipping_option_id: option.id,
|
||||
amount: data.customPrice ?? option.calculated_price.calculated_amount,
|
||||
is_tax_inclusive:
|
||||
!!option.calculated_price.is_calculated_price_tax_inclusive,
|
||||
data: option.data ?? {},
|
||||
name: option.name,
|
||||
version: orderChange.version,
|
||||
order_id: data.orderClaim.order_id,
|
||||
return_id: input.return_id,
|
||||
claim_id: data.orderClaim.id,
|
||||
}
|
||||
}
|
||||
prepareShippingMethod("claim_id")
|
||||
)
|
||||
|
||||
const createdMethods = createOrderShippingMethods({
|
||||
@@ -155,7 +140,7 @@ export const createClaimShippingMethodWorkflow = createWorkflow(
|
||||
orderClaim,
|
||||
shippingOptions,
|
||||
createdMethods,
|
||||
customPrice: input.custom_price,
|
||||
customPrice: input.custom_amount,
|
||||
orderChange,
|
||||
input,
|
||||
},
|
||||
@@ -170,6 +155,7 @@ export const createClaimShippingMethodWorkflow = createWorkflow(
|
||||
}) => {
|
||||
const shippingOption = shippingOptions[0]
|
||||
const createdMethod = createdMethods[0]
|
||||
|
||||
const methodPrice =
|
||||
customPrice ?? shippingOption.calculated_price.calculated_amount
|
||||
|
||||
|
||||
+54
-26
@@ -13,6 +13,7 @@ import {
|
||||
createWorkflow,
|
||||
parallelize,
|
||||
transform,
|
||||
when,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { useRemoteQueryStep } from "../../../common"
|
||||
import {
|
||||
@@ -24,6 +25,7 @@ import {
|
||||
throwIfIsCancelled,
|
||||
throwIfOrderChangeIsNotActive,
|
||||
} from "../../utils/order-validation"
|
||||
import { prepareShippingMethodUpdate } from "../../utils/prepare-shipping-method"
|
||||
|
||||
/**
|
||||
* This step validates that a claim's shipping method can be updated.
|
||||
@@ -70,7 +72,13 @@ export const updateClaimShippingMethodWorkflow = 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",
|
||||
"order.currency_code",
|
||||
],
|
||||
variables: { id: input.claim_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
@@ -89,34 +97,54 @@ export const updateClaimShippingMethodWorkflow = createWorkflow(
|
||||
list: false,
|
||||
}).config({ name: "order-change-query" })
|
||||
|
||||
const shippingOptions = when({ input }, ({ input }) => {
|
||||
return input.data?.custom_amount === null
|
||||
}).then(() => {
|
||||
const action = transform(
|
||||
{ orderChange, input, orderClaim },
|
||||
({ orderChange, input, orderClaim }) => {
|
||||
const originalAction = (orderChange.actions ?? []).find(
|
||||
(a) => a.id === input.action_id
|
||||
) as OrderChangeActionDTO
|
||||
|
||||
return {
|
||||
shipping_method_id: originalAction.reference_id,
|
||||
currency_code: (orderClaim as any).order.currency_code,
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const shippingMethod = useRemoteQueryStep({
|
||||
entry_point: "order_shipping_method",
|
||||
fields: ["id", "shipping_option_id"],
|
||||
variables: {
|
||||
id: action.shipping_method_id,
|
||||
},
|
||||
list: false,
|
||||
}).config({ name: "fetch-shipping-method" })
|
||||
|
||||
return useRemoteQueryStep({
|
||||
entry_point: "shipping_option",
|
||||
fields: [
|
||||
"id",
|
||||
"name",
|
||||
"calculated_price.calculated_amount",
|
||||
"calculated_price.is_calculated_price_tax_inclusive",
|
||||
],
|
||||
variables: {
|
||||
id: shippingMethod.shipping_option_id,
|
||||
calculated_price: {
|
||||
context: { currency_code: action.currency_code },
|
||||
},
|
||||
},
|
||||
}).config({ name: "fetch-shipping-option" })
|
||||
})
|
||||
|
||||
updateClaimShippingMethodValidationStep({ orderClaim, orderChange, input })
|
||||
|
||||
const updateData = transform(
|
||||
{ orderChange, input },
|
||||
({ input, orderChange }) => {
|
||||
const originalAction = (orderChange.actions ?? []).find(
|
||||
(a) => a.id === input.action_id
|
||||
) as OrderChangeActionDTO
|
||||
|
||||
const data = input.data
|
||||
|
||||
const action = {
|
||||
id: originalAction.id,
|
||||
amount: data.custom_price,
|
||||
internal_note: data.internal_note,
|
||||
}
|
||||
|
||||
const shippingMethod = {
|
||||
id: originalAction.reference_id,
|
||||
amount: data.custom_price,
|
||||
metadata: data.metadata,
|
||||
}
|
||||
|
||||
return {
|
||||
action,
|
||||
shippingMethod,
|
||||
}
|
||||
}
|
||||
{ orderChange, input, shippingOptions },
|
||||
prepareShippingMethodUpdate
|
||||
)
|
||||
|
||||
parallelize(
|
||||
|
||||
+6
-21
@@ -19,6 +19,7 @@ import {
|
||||
throwIfIsCancelled,
|
||||
throwIfOrderChangeIsNotActive,
|
||||
} from "../../utils/order-validation"
|
||||
import { prepareShippingMethod } from "../../utils/prepare-shipping-method"
|
||||
import { createOrderChangeActionsWorkflow } from "../create-order-change-actions"
|
||||
import { updateOrderTaxLinesWorkflow } from "../update-tax-lines"
|
||||
|
||||
@@ -53,7 +54,7 @@ export const createExchangeShippingMethodWorkflow = createWorkflow(
|
||||
return_id?: string
|
||||
exchange_id?: string
|
||||
shipping_option_id: string
|
||||
custom_price?: BigNumberInput
|
||||
custom_amount?: BigNumberInput | null
|
||||
}): WorkflowResponse<OrderPreviewDTO> {
|
||||
const orderExchange: OrderExchangeDTO = useRemoteQueryStep({
|
||||
entry_point: "order_exchange",
|
||||
@@ -108,29 +109,13 @@ export const createExchangeShippingMethodWorkflow = createWorkflow(
|
||||
|
||||
const shippingMethodInput = transform(
|
||||
{
|
||||
orderExchange,
|
||||
relatedEntity: orderExchange,
|
||||
shippingOptions,
|
||||
customPrice: input.custom_price,
|
||||
customPrice: input.custom_amount,
|
||||
orderChange,
|
||||
input,
|
||||
},
|
||||
(data) => {
|
||||
const option = data.shippingOptions[0]
|
||||
const orderChange = data.orderChange
|
||||
|
||||
return {
|
||||
shipping_option_id: option.id,
|
||||
amount: data.customPrice ?? option.calculated_price.calculated_amount,
|
||||
is_tax_inclusive:
|
||||
!!option.calculated_price.is_calculated_price_tax_inclusive,
|
||||
data: option.data ?? {},
|
||||
name: option.name,
|
||||
version: orderChange.version,
|
||||
order_id: data.orderExchange.order_id,
|
||||
return_id: input.return_id,
|
||||
exchange_id: data.orderExchange.id,
|
||||
}
|
||||
}
|
||||
prepareShippingMethod("exchange_id")
|
||||
)
|
||||
|
||||
const createdMethods = createOrderShippingMethods({
|
||||
@@ -159,7 +144,7 @@ export const createExchangeShippingMethodWorkflow = createWorkflow(
|
||||
orderExchange,
|
||||
shippingOptions,
|
||||
createdMethods,
|
||||
customPrice: input.custom_price,
|
||||
customPrice: input.custom_amount,
|
||||
orderChange,
|
||||
input,
|
||||
},
|
||||
|
||||
+54
-26
@@ -13,6 +13,7 @@ import {
|
||||
createWorkflow,
|
||||
parallelize,
|
||||
transform,
|
||||
when,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { useRemoteQueryStep } from "../../../common"
|
||||
import {
|
||||
@@ -24,6 +25,7 @@ import {
|
||||
throwIfIsCancelled,
|
||||
throwIfOrderChangeIsNotActive,
|
||||
} from "../../utils/order-validation"
|
||||
import { prepareShippingMethodUpdate } from "../../utils/prepare-shipping-method"
|
||||
|
||||
/**
|
||||
* This step validates that an exchange's shipping method can be updated.
|
||||
@@ -70,7 +72,13 @@ export const updateExchangeShippingMethodWorkflow = createWorkflow(
|
||||
): WorkflowResponse<OrderPreviewDTO> {
|
||||
const orderExchange: OrderExchangeDTO = useRemoteQueryStep({
|
||||
entry_point: "order_exchange",
|
||||
fields: ["id", "status", "order_id", "canceled_at"],
|
||||
fields: [
|
||||
"id",
|
||||
"status",
|
||||
"order_id",
|
||||
"canceled_at",
|
||||
"order.currency_code",
|
||||
],
|
||||
variables: { id: input.exchange_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
@@ -89,6 +97,49 @@ export const updateExchangeShippingMethodWorkflow = createWorkflow(
|
||||
list: false,
|
||||
}).config({ name: "order-change-query" })
|
||||
|
||||
const shippingOptions = when({ input }, ({ input }) => {
|
||||
return input.data?.custom_amount === null
|
||||
}).then(() => {
|
||||
const action = transform(
|
||||
{ orderChange, input, orderExchange },
|
||||
({ orderChange, input, orderExchange }) => {
|
||||
const originalAction = (orderChange.actions ?? []).find(
|
||||
(a) => a.id === input.action_id
|
||||
) as OrderChangeActionDTO
|
||||
|
||||
return {
|
||||
shipping_method_id: originalAction.reference_id,
|
||||
currency_code: (orderExchange as any).order.currency_code,
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const shippingMethod = useRemoteQueryStep({
|
||||
entry_point: "order_shipping_method",
|
||||
fields: ["id", "shipping_option_id"],
|
||||
variables: {
|
||||
id: action.shipping_method_id,
|
||||
},
|
||||
list: false,
|
||||
}).config({ name: "fetch-shipping-method" })
|
||||
|
||||
return useRemoteQueryStep({
|
||||
entry_point: "shipping_option",
|
||||
fields: [
|
||||
"id",
|
||||
"name",
|
||||
"calculated_price.calculated_amount",
|
||||
"calculated_price.is_calculated_price_tax_inclusive",
|
||||
],
|
||||
variables: {
|
||||
id: shippingMethod.shipping_option_id,
|
||||
calculated_price: {
|
||||
context: { currency_code: action.currency_code },
|
||||
},
|
||||
},
|
||||
}).config({ name: "fetch-shipping-option" })
|
||||
})
|
||||
|
||||
updateExchangeShippingMethodValidationStep({
|
||||
orderExchange,
|
||||
orderChange,
|
||||
@@ -96,31 +147,8 @@ export const updateExchangeShippingMethodWorkflow = createWorkflow(
|
||||
})
|
||||
|
||||
const updateData = transform(
|
||||
{ orderChange, input },
|
||||
({ input, orderChange }) => {
|
||||
const originalAction = (orderChange.actions ?? []).find(
|
||||
(a) => a.id === input.action_id
|
||||
) as OrderChangeActionDTO
|
||||
|
||||
const data = input.data
|
||||
|
||||
const action = {
|
||||
id: originalAction.id,
|
||||
amount: data.custom_price,
|
||||
internal_note: data.internal_note,
|
||||
}
|
||||
|
||||
const shippingMethod = {
|
||||
id: originalAction.reference_id,
|
||||
amount: data.custom_price,
|
||||
metadata: data.metadata,
|
||||
}
|
||||
|
||||
return {
|
||||
action,
|
||||
shippingMethod,
|
||||
}
|
||||
}
|
||||
{ orderChange, input, shippingOptions },
|
||||
prepareShippingMethodUpdate
|
||||
)
|
||||
|
||||
parallelize(
|
||||
|
||||
+5
-18
@@ -18,6 +18,7 @@ import {
|
||||
throwIfIsCancelled,
|
||||
throwIfOrderChangeIsNotActive,
|
||||
} from "../../utils/order-validation"
|
||||
import { prepareShippingMethod } from "../../utils/prepare-shipping-method"
|
||||
import { createOrderChangeActionsWorkflow } from "../create-order-change-actions"
|
||||
import { updateOrderTaxLinesWorkflow } from "../update-tax-lines"
|
||||
|
||||
@@ -48,7 +49,7 @@ export const createOrderEditShippingMethodWorkflow = createWorkflow(
|
||||
function (input: {
|
||||
order_id: string
|
||||
shipping_option_id: string
|
||||
custom_price?: BigNumberInput
|
||||
custom_amount?: BigNumberInput | null
|
||||
}): WorkflowResponse<OrderPreviewDTO> {
|
||||
const order: OrderDTO = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
@@ -89,25 +90,11 @@ export const createOrderEditShippingMethodWorkflow = createWorkflow(
|
||||
const shippingMethodInput = transform(
|
||||
{
|
||||
shippingOptions,
|
||||
customPrice: input.custom_price,
|
||||
customPrice: input.custom_amount,
|
||||
orderChange,
|
||||
input,
|
||||
},
|
||||
(data) => {
|
||||
const option = data.shippingOptions[0]
|
||||
const orderChange = data.orderChange
|
||||
|
||||
return {
|
||||
shipping_option_id: option.id,
|
||||
amount: data.customPrice ?? option.calculated_price.calculated_amount,
|
||||
is_tax_inclusive:
|
||||
!!option.calculated_price.is_calculated_price_tax_inclusive,
|
||||
data: option.data ?? {},
|
||||
name: option.name,
|
||||
version: orderChange.version,
|
||||
order_id: data.input.order_id,
|
||||
}
|
||||
}
|
||||
prepareShippingMethod()
|
||||
)
|
||||
|
||||
const createdMethods = createOrderShippingMethods({
|
||||
@@ -130,7 +117,7 @@ export const createOrderEditShippingMethodWorkflow = createWorkflow(
|
||||
order,
|
||||
shippingOptions,
|
||||
createdMethods,
|
||||
customPrice: input.custom_price,
|
||||
customPrice: input.custom_amount,
|
||||
orderChange,
|
||||
input,
|
||||
},
|
||||
|
||||
+56
-25
@@ -1,6 +1,7 @@
|
||||
import {
|
||||
OrderChangeActionDTO,
|
||||
OrderChangeDTO,
|
||||
OrderDTO,
|
||||
OrderPreviewDTO,
|
||||
OrderWorkflow,
|
||||
} from "@medusajs/types"
|
||||
@@ -12,6 +13,7 @@ import {
|
||||
createWorkflow,
|
||||
parallelize,
|
||||
transform,
|
||||
when,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { useRemoteQueryStep } from "../../../common"
|
||||
import {
|
||||
@@ -20,6 +22,7 @@ import {
|
||||
} from "../../steps"
|
||||
import { previewOrderChangeStep } from "../../steps/preview-order-change"
|
||||
import { throwIfOrderChangeIsNotActive } from "../../utils/order-validation"
|
||||
import { prepareShippingMethodUpdate } from "../../utils/prepare-shipping-method"
|
||||
|
||||
/**
|
||||
* This step validates that an order edit's shipping method can be updated.
|
||||
@@ -61,6 +64,14 @@ export const updateOrderEditShippingMethodWorkflow = createWorkflow(
|
||||
function (
|
||||
input: WorkflowData<OrderWorkflow.UpdateOrderEditShippingMethodWorkflowInput>
|
||||
): WorkflowResponse<OrderPreviewDTO> {
|
||||
const order: OrderDTO = useRemoteQueryStep({
|
||||
entry_point: "order_claim",
|
||||
fields: ["id", "currency_code"],
|
||||
variables: { id: input.order_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
})
|
||||
|
||||
const orderChange: OrderChangeDTO = useRemoteQueryStep({
|
||||
entry_point: "order_change",
|
||||
fields: ["id", "status", "version", "actions.*"],
|
||||
@@ -73,37 +84,57 @@ export const updateOrderEditShippingMethodWorkflow = createWorkflow(
|
||||
list: false,
|
||||
}).config({ name: "order-change-query" })
|
||||
|
||||
const shippingOptions = when({ input }, ({ input }) => {
|
||||
return input.data?.custom_amount === null
|
||||
}).then(() => {
|
||||
const action = transform(
|
||||
{ orderChange, input, order },
|
||||
({ orderChange, input, order }) => {
|
||||
const originalAction = (orderChange.actions ?? []).find(
|
||||
(a) => a.id === input.action_id
|
||||
) as OrderChangeActionDTO
|
||||
|
||||
return {
|
||||
shipping_method_id: originalAction.reference_id,
|
||||
currency_code: order.currency_code,
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const shippingMethod = useRemoteQueryStep({
|
||||
entry_point: "order_shipping_method",
|
||||
fields: ["id", "shipping_option_id"],
|
||||
variables: {
|
||||
id: action.shipping_method_id,
|
||||
},
|
||||
list: false,
|
||||
}).config({ name: "fetch-shipping-method" })
|
||||
|
||||
return useRemoteQueryStep({
|
||||
entry_point: "shipping_option",
|
||||
fields: [
|
||||
"id",
|
||||
"name",
|
||||
"calculated_price.calculated_amount",
|
||||
"calculated_price.is_calculated_price_tax_inclusive",
|
||||
],
|
||||
variables: {
|
||||
id: shippingMethod.shipping_option_id,
|
||||
calculated_price: {
|
||||
context: { currency_code: action.currency_code },
|
||||
},
|
||||
},
|
||||
}).config({ name: "fetch-shipping-option" })
|
||||
})
|
||||
|
||||
updateOrderEditShippingMethodValidationStep({
|
||||
orderChange,
|
||||
input,
|
||||
})
|
||||
|
||||
const updateData = transform(
|
||||
{ orderChange, input },
|
||||
({ input, orderChange }) => {
|
||||
const originalAction = (orderChange.actions ?? []).find(
|
||||
(a) => a.id === input.action_id
|
||||
) as OrderChangeActionDTO
|
||||
|
||||
const data = input.data
|
||||
|
||||
const action = {
|
||||
id: originalAction.id,
|
||||
amount: data.custom_price,
|
||||
internal_note: data.internal_note,
|
||||
}
|
||||
|
||||
const shippingMethod = {
|
||||
id: originalAction.reference_id,
|
||||
amount: data.custom_price,
|
||||
metadata: data.metadata,
|
||||
}
|
||||
|
||||
return {
|
||||
action,
|
||||
shippingMethod,
|
||||
}
|
||||
}
|
||||
{ orderChange, input, shippingOptions },
|
||||
prepareShippingMethodUpdate
|
||||
)
|
||||
|
||||
parallelize(
|
||||
|
||||
+14
-23
@@ -19,6 +19,7 @@ import {
|
||||
throwIfIsCancelled,
|
||||
throwIfOrderChangeIsNotActive,
|
||||
} from "../../utils/order-validation"
|
||||
import { prepareShippingMethod } from "../../utils/prepare-shipping-method"
|
||||
import { createOrderChangeActionsWorkflow } from "../create-order-change-actions"
|
||||
import { updateOrderTaxLinesWorkflow } from "../update-tax-lines"
|
||||
|
||||
@@ -54,11 +55,18 @@ export const createReturnShippingMethodWorkflow = createWorkflow(
|
||||
claim_id?: string
|
||||
exchange_id?: string
|
||||
shipping_option_id: string
|
||||
custom_price?: BigNumberInput
|
||||
custom_amount?: BigNumberInput | null
|
||||
}): WorkflowResponse<OrderPreviewDTO> {
|
||||
const orderReturn: ReturnDTO = useRemoteQueryStep({
|
||||
entry_point: "return",
|
||||
fields: ["id", "status", "order_id", "canceled_at"],
|
||||
fields: [
|
||||
"id",
|
||||
"status",
|
||||
"order_id",
|
||||
"claim_id",
|
||||
"exchange_id",
|
||||
"canceled_at",
|
||||
],
|
||||
variables: { id: input.return_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
@@ -109,30 +117,13 @@ export const createReturnShippingMethodWorkflow = createWorkflow(
|
||||
|
||||
const shippingMethodInput = transform(
|
||||
{
|
||||
orderReturn,
|
||||
relatedEntity: orderReturn,
|
||||
shippingOptions,
|
||||
customPrice: input.custom_price,
|
||||
customPrice: input.custom_amount,
|
||||
orderChange,
|
||||
input,
|
||||
},
|
||||
(data) => {
|
||||
const option = data.shippingOptions[0]
|
||||
const orderChange = data.orderChange
|
||||
|
||||
return {
|
||||
shipping_option_id: option.id,
|
||||
amount: data.customPrice ?? option.calculated_price.calculated_amount,
|
||||
is_tax_inclusive:
|
||||
!!option.calculated_price.is_calculated_price_tax_inclusive,
|
||||
data: option.data ?? {},
|
||||
name: option.name,
|
||||
version: orderChange.version,
|
||||
order_id: data.orderReturn.order_id,
|
||||
return_id: data.orderReturn.id,
|
||||
claim_id: data.input.claim_id,
|
||||
exchange_id: data.input.exchange_id,
|
||||
}
|
||||
}
|
||||
prepareShippingMethod("return_id")
|
||||
)
|
||||
|
||||
const createdMethods = createOrderShippingMethods({
|
||||
@@ -157,7 +148,7 @@ export const createReturnShippingMethodWorkflow = createWorkflow(
|
||||
orderReturn,
|
||||
shippingOptions,
|
||||
createdMethods,
|
||||
customPrice: input.custom_price,
|
||||
customPrice: input.custom_amount,
|
||||
orderChange,
|
||||
input,
|
||||
},
|
||||
|
||||
+54
-26
@@ -13,6 +13,7 @@ import {
|
||||
createWorkflow,
|
||||
parallelize,
|
||||
transform,
|
||||
when,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { useRemoteQueryStep } from "../../../common"
|
||||
import {
|
||||
@@ -24,6 +25,7 @@ import {
|
||||
throwIfIsCancelled,
|
||||
throwIfOrderChangeIsNotActive,
|
||||
} from "../../utils/order-validation"
|
||||
import { prepareShippingMethodUpdate } from "../../utils/prepare-shipping-method"
|
||||
|
||||
/**
|
||||
* This step validates that a return's shipping method can be updated.
|
||||
@@ -70,7 +72,13 @@ export const updateReturnShippingMethodWorkflow = createWorkflow(
|
||||
): WorkflowResponse<OrderPreviewDTO> {
|
||||
const orderReturn: ReturnDTO = useRemoteQueryStep({
|
||||
entry_point: "return",
|
||||
fields: ["id", "status", "order_id", "canceled_at"],
|
||||
fields: [
|
||||
"id",
|
||||
"status",
|
||||
"order_id",
|
||||
"canceled_at",
|
||||
"order.currency_code",
|
||||
],
|
||||
variables: { id: input.return_id },
|
||||
list: false,
|
||||
throw_if_key_not_found: true,
|
||||
@@ -89,6 +97,49 @@ export const updateReturnShippingMethodWorkflow = createWorkflow(
|
||||
list: false,
|
||||
}).config({ name: "order-change-query" })
|
||||
|
||||
const shippingOptions = when({ input }, ({ input }) => {
|
||||
return input.data?.custom_amount === null
|
||||
}).then(() => {
|
||||
const action = transform(
|
||||
{ orderChange, input, orderReturn },
|
||||
({ orderChange, input, orderReturn }) => {
|
||||
const originalAction = (orderChange.actions ?? []).find(
|
||||
(a) => a.id === input.action_id
|
||||
) as OrderChangeActionDTO
|
||||
|
||||
return {
|
||||
shipping_method_id: originalAction.reference_id,
|
||||
currency_code: (orderReturn as any).order.currency_code,
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const shippingMethod = useRemoteQueryStep({
|
||||
entry_point: "order_shipping_method",
|
||||
fields: ["id", "shipping_option_id"],
|
||||
variables: {
|
||||
id: action.shipping_method_id,
|
||||
},
|
||||
list: false,
|
||||
}).config({ name: "fetch-shipping-method" })
|
||||
|
||||
return useRemoteQueryStep({
|
||||
entry_point: "shipping_option",
|
||||
fields: [
|
||||
"id",
|
||||
"name",
|
||||
"calculated_price.calculated_amount",
|
||||
"calculated_price.is_calculated_price_tax_inclusive",
|
||||
],
|
||||
variables: {
|
||||
id: shippingMethod.shipping_option_id,
|
||||
calculated_price: {
|
||||
context: { currency_code: action.currency_code },
|
||||
},
|
||||
},
|
||||
}).config({ name: "fetch-shipping-option" })
|
||||
})
|
||||
|
||||
updateReturnShippingMethodValidationStep({
|
||||
orderReturn,
|
||||
orderChange,
|
||||
@@ -96,31 +147,8 @@ export const updateReturnShippingMethodWorkflow = createWorkflow(
|
||||
})
|
||||
|
||||
const updateData = transform(
|
||||
{ orderChange, input },
|
||||
({ input, orderChange }) => {
|
||||
const originalAction = (orderChange.actions ?? []).find(
|
||||
(a) => a.id === input.action_id
|
||||
) as OrderChangeActionDTO
|
||||
|
||||
const data = input.data
|
||||
|
||||
const action = {
|
||||
id: originalAction.id,
|
||||
amount: data.custom_price,
|
||||
internal_note: data.internal_note,
|
||||
}
|
||||
|
||||
const shippingMethod = {
|
||||
id: originalAction.reference_id,
|
||||
amount: data.custom_price,
|
||||
metadata: data.metadata,
|
||||
}
|
||||
|
||||
return {
|
||||
action,
|
||||
shippingMethod,
|
||||
}
|
||||
}
|
||||
{ orderChange, input, shippingOptions },
|
||||
prepareShippingMethodUpdate
|
||||
)
|
||||
|
||||
parallelize(
|
||||
|
||||
@@ -24,14 +24,14 @@ interface AdminClaimUpdateItem {
|
||||
|
||||
interface AdminClaimAddShippingMethod {
|
||||
shipping_option_id: string
|
||||
custom_price?: number
|
||||
custom_amount?: number
|
||||
description?: string
|
||||
internal_note?: string
|
||||
metadata?: Record<string, unknown> | null
|
||||
}
|
||||
|
||||
interface AdminClaimUpdateShippingMethod {
|
||||
custom_price?: number | null
|
||||
custom_amount?: number | null
|
||||
internal_note?: string
|
||||
metadata?: Record<string, unknown> | null
|
||||
}
|
||||
|
||||
@@ -24,14 +24,14 @@ interface AdminExchangeUpdateItem {
|
||||
|
||||
interface AdminExchangeAddShippingMethod {
|
||||
shipping_option_id: string
|
||||
custom_price?: number
|
||||
custom_amount?: number
|
||||
description?: string
|
||||
internal_note?: string
|
||||
metadata?: Record<string, unknown> | null
|
||||
}
|
||||
|
||||
interface AdminExchangeUpdateShippingMethod {
|
||||
custom_price?: number | null
|
||||
custom_amount?: number | null
|
||||
internal_note?: string
|
||||
metadata?: Record<string, unknown> | null
|
||||
}
|
||||
|
||||
@@ -27,14 +27,14 @@ export interface AdminUpdateReturnItems {
|
||||
|
||||
export interface AdminAddReturnShipping {
|
||||
shipping_option_id: string
|
||||
custom_price?: number
|
||||
custom_amount?: number
|
||||
description?: string
|
||||
internal_note?: string
|
||||
metadata?: Record<string, unknown>
|
||||
}
|
||||
|
||||
export interface AdminUpdateReturnShipping {
|
||||
custom_price?: number
|
||||
custom_amount?: number
|
||||
internal_note?: string
|
||||
metadata?: Record<string, unknown>
|
||||
}
|
||||
@@ -79,4 +79,4 @@ export interface AdminUpdateDismissItems {
|
||||
internal_note?: string
|
||||
reason_id?: string
|
||||
metadata?: Record<string, unknown>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ export interface UpdateReturnShippingMethodWorkflowInput {
|
||||
return_id: string
|
||||
action_id: string
|
||||
data: {
|
||||
custom_price?: BigNumberInput
|
||||
custom_amount?: BigNumberInput | null
|
||||
internal_note?: string | null
|
||||
metadata?: Record<string, any> | null
|
||||
}
|
||||
@@ -19,7 +19,7 @@ export interface UpdateClaimShippingMethodWorkflowInput {
|
||||
claim_id: string
|
||||
action_id: string
|
||||
data: {
|
||||
custom_price?: BigNumberInput
|
||||
custom_amount?: BigNumberInput | null
|
||||
internal_note?: string | null
|
||||
metadata?: Record<string, any> | null
|
||||
}
|
||||
@@ -34,7 +34,7 @@ export interface UpdateExchangeShippingMethodWorkflowInput {
|
||||
exchange_id: string
|
||||
action_id: string
|
||||
data: {
|
||||
custom_price?: BigNumberInput
|
||||
custom_amount?: BigNumberInput | null
|
||||
internal_note?: string | null
|
||||
metadata?: Record<string, any> | null
|
||||
}
|
||||
@@ -44,7 +44,7 @@ export interface UpdateOrderEditShippingMethodWorkflowInput {
|
||||
order_id: string
|
||||
action_id: string
|
||||
data: {
|
||||
custom_price?: BigNumberInput
|
||||
custom_amount?: BigNumberInput | null
|
||||
internal_note?: string | null
|
||||
metadata?: Record<string, any> | null
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ export type AdminPostCancelClaimReqSchemaType = z.infer<
|
||||
|
||||
export const AdminPostClaimsShippingReqSchema = z.object({
|
||||
shipping_option_id: z.string(),
|
||||
custom_price: z.number().optional(),
|
||||
custom_amount: z.number().optional(),
|
||||
description: z.string().optional(),
|
||||
internal_note: z.string().optional(),
|
||||
metadata: z.record(z.unknown()).optional(),
|
||||
@@ -102,7 +102,7 @@ export type AdminPostClaimsShippingReqSchemaType = z.infer<
|
||||
>
|
||||
|
||||
export const AdminPostClaimsShippingActionReqSchema = z.object({
|
||||
custom_price: z.number().optional(),
|
||||
custom_amount: z.number().nullish().optional(),
|
||||
internal_note: z.string().nullish().optional(),
|
||||
metadata: z.record(z.unknown()).nullish().optional(),
|
||||
})
|
||||
|
||||
@@ -89,7 +89,7 @@ export type AdminPostExchangesRequestItemsReturnActionReqSchemaType = z.infer<
|
||||
|
||||
export const AdminPostExchangesShippingReqSchema = z.object({
|
||||
shipping_option_id: z.string(),
|
||||
custom_price: z.number().optional(),
|
||||
custom_amount: z.number().optional(),
|
||||
description: z.string().optional(),
|
||||
internal_note: z.string().optional(),
|
||||
metadata: z.record(z.unknown()).optional(),
|
||||
@@ -100,7 +100,7 @@ export type AdminPostExchangesShippingReqSchemaType = z.infer<
|
||||
>
|
||||
|
||||
export const AdminPostExchangesShippingActionReqSchema = z.object({
|
||||
custom_price: z.number().optional(),
|
||||
custom_amount: z.number().nullish().optional(),
|
||||
internal_note: z.string().nullish().optional(),
|
||||
metadata: z.record(z.unknown()).nullish().optional(),
|
||||
})
|
||||
|
||||
@@ -12,7 +12,7 @@ export type AdminPostOrderEditsReqSchemaType = z.infer<
|
||||
|
||||
export const AdminPostOrderEditsShippingReqSchema = z.object({
|
||||
shipping_option_id: z.string(),
|
||||
custom_price: z.number().optional(),
|
||||
custom_amount: z.number().optional(),
|
||||
description: z.string().optional(),
|
||||
internal_note: z.string().optional(),
|
||||
metadata: z.record(z.unknown()).optional(),
|
||||
@@ -23,7 +23,7 @@ export type AdminPostOrderEditsShippingReqSchemaType = z.infer<
|
||||
>
|
||||
|
||||
export const AdminPostOrderEditsShippingActionReqSchema = z.object({
|
||||
custom_price: z.number().optional(),
|
||||
custom_amount: z.number().nullish().optional(),
|
||||
internal_note: z.string().nullish().optional(),
|
||||
metadata: z.record(z.unknown()).nullish().optional(),
|
||||
})
|
||||
|
||||
@@ -100,7 +100,7 @@ export type AdminPostCancelReturnReqSchemaType = z.infer<
|
||||
|
||||
export const AdminPostReturnsShippingReqSchema = z.object({
|
||||
shipping_option_id: z.string(),
|
||||
custom_price: z.number().optional(),
|
||||
custom_amount: z.number().optional(),
|
||||
description: z.string().optional(),
|
||||
internal_note: z.string().optional(),
|
||||
metadata: z.record(z.unknown()).optional(),
|
||||
@@ -111,7 +111,7 @@ export type AdminPostReturnsShippingReqSchemaType = z.infer<
|
||||
>
|
||||
|
||||
export const AdminPostReturnsShippingActionReqSchema = z.object({
|
||||
custom_price: z.number().optional(),
|
||||
custom_amount: z.number().nullish().optional(),
|
||||
internal_note: z.string().nullish().optional(),
|
||||
metadata: z.record(z.unknown()).nullish().optional(),
|
||||
})
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,17 @@
|
||||
import { Migration } from '@mikro-orm/migrations';
|
||||
|
||||
export class Migration20240902195921 extends Migration {
|
||||
|
||||
async up(): Promise<void> {
|
||||
this.addSql('alter table if exists "order_line_item" add column if not exists "is_custom_price" boolean not null default false;');
|
||||
|
||||
this.addSql('alter table if exists "order_shipping_method" add column if not exists "is_custom_amount" boolean not null default false;');
|
||||
}
|
||||
|
||||
async down(): Promise<void> {
|
||||
this.addSql('alter table if exists "order_line_item" drop column if exists "is_custom_price";');
|
||||
|
||||
this.addSql('alter table if exists "order_shipping_method" drop column if exists "is_custom_amount";');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -128,6 +128,9 @@ export default class OrderLineItem {
|
||||
@Property({ columnType: "jsonb" })
|
||||
raw_unit_price: BigNumberRawValue
|
||||
|
||||
@Property({ columnType: "boolean", default: false })
|
||||
is_custom_price: boolean = false
|
||||
|
||||
@OneToMany(() => OrderLineItemTaxLine, (taxLine) => taxLine.item, {
|
||||
cascade: [Cascade.PERSIST, "soft-remove" as Cascade],
|
||||
})
|
||||
|
||||
@@ -54,6 +54,9 @@ export default class OrderShippingMethod {
|
||||
@Property({ columnType: "boolean" })
|
||||
is_tax_inclusive: boolean = false
|
||||
|
||||
@Property({ columnType: "boolean", default: false })
|
||||
is_custom_amount: boolean = false
|
||||
|
||||
@Property({
|
||||
columnType: "text",
|
||||
nullable: true,
|
||||
|
||||
Reference in New Issue
Block a user