fix(core-flows): data passed to to fulfillment provider context (#10660)

* fix: cart data passed to context, from location in validation

* refactor: extract common fields to a const
This commit is contained in:
Frane Polić
2024-12-18 21:23:06 +01:00
committed by GitHub
parent 9d85e663b8
commit 3dba551ad2
5 changed files with 56 additions and 21 deletions

View File

@@ -1,4 +1,5 @@
// Always ensure that cartFieldsForPricingContext is present in cartFieldsForRefreshSteps // Always ensure that cartFieldsForPricingContext is present in cartFieldsForRefreshSteps
// Always ensure that cartFieldsForCalculateShippingOptionsPrices is present in cartFieldsForRefreshSteps
export const cartFieldsForRefreshSteps = [ export const cartFieldsForRefreshSteps = [
"id", "id",
"currency_code", "currency_code",
@@ -18,6 +19,13 @@ export const cartFieldsForRefreshSteps = [
"items.product.collection_id", "items.product.collection_id",
"items.product.categories.id", "items.product.categories.id",
"items.product.tags.id", "items.product.tags.id",
"items.variant.id",
"items.variant.product.id",
"items.variant.weight",
"items.variant.length",
"items.variant.height",
"items.variant.width",
"items.variant.material",
"items.adjustments.*", "items.adjustments.*",
"items.tax_lines.*", "items.tax_lines.*",
"shipping_address.*", "shipping_address.*",
@@ -146,3 +154,21 @@ export const productVariantsFields = [
"inventory_items.inventory.location_levels.stock_locations.sales_channels.id", "inventory_items.inventory.location_levels.stock_locations.sales_channels.id",
"inventory_items.inventory.location_levels.stock_locations.sales_channels.name", "inventory_items.inventory.location_levels.stock_locations.sales_channels.name",
] ]
// ensure that at least these fields are present when fetching cart for caluclating shipping options prices
export const cartFieldsForCalculateShippingOptionsPrices = [
"id",
"items.*",
"items.variant.id",
"items.variant.product.id",
"items.variant.weight",
"items.variant.length",
"items.variant.height",
"items.variant.width",
"items.variant.material",
"items.product.id",
"items.product.collection_id",
"items.product.categories.id",
"items.product.tags.id",
"shipping_address.*",
]

View File

@@ -94,7 +94,11 @@ export const addShippingMethodToCartWorkflow = createWorkflow(
) )
const shippingMethodInput = transform( const shippingMethodInput = transform(
{ input, shippingOptions, validatedMethodData }, {
input,
shippingOptions,
validatedMethodData,
},
(data) => { (data) => {
const options = (data.input.options ?? []).map((option) => { const options = (data.input.options ?? []).map((option) => {
const shippingOption = data.shippingOptions.find( const shippingOption = data.shippingOptions.find(

View File

@@ -6,10 +6,12 @@ import {
WorkflowData, WorkflowData,
WorkflowResponse, WorkflowResponse,
} from "@medusajs/framework/workflows-sdk" } from "@medusajs/framework/workflows-sdk"
import { CalculateShippingOptionPriceDTO } from "@medusajs/types"
import { useQueryGraphStep, validatePresenceOfStep } from "../../common" import { useQueryGraphStep, validatePresenceOfStep } from "../../common"
import { useRemoteQueryStep } from "../../common/steps/use-remote-query" import { useRemoteQueryStep } from "../../common/steps/use-remote-query"
import { calculateShippingOptionsPricesStep } from "../../fulfillment" import { calculateShippingOptionsPricesStep } from "../../fulfillment"
import { CalculateShippingOptionPriceDTO } from "@medusajs/types" import { cartFieldsForCalculateShippingOptionsPrices } from "../utils/fields"
const COMMON_OPTIONS_FIELDS = [ const COMMON_OPTIONS_FIELDS = [
"id", "id",
@@ -57,15 +59,10 @@ export const listShippingOptionsForCartWithPricingWorkflow = createWorkflow(
entity: "cart", entity: "cart",
filters: { id: input.cart_id }, filters: { id: input.cart_id },
fields: [ fields: [
"id", ...cartFieldsForCalculateShippingOptionsPrices,
"sales_channel_id", "sales_channel_id",
"currency_code", "currency_code",
"region_id", "region_id",
"shipping_address.city",
"shipping_address.country_code",
"shipping_address.province",
"shipping_address.postal_code",
"items.*",
"item_total", "item_total",
"total", "total",
], ],
@@ -245,8 +242,18 @@ export const listShippingOptionsForCartWithPricingWorkflow = createWorkflow(
) )
const shippingOptionsWithPrice = transform( const shippingOptionsWithPrice = transform(
{ shippingOptionsFlatRate, shippingOptionsCalculated, prices }, {
({ shippingOptionsFlatRate, shippingOptionsCalculated, prices }) => { shippingOptionsFlatRate,
shippingOptionsCalculated,
prices,
fulfillmentSetLocationMap,
},
({
shippingOptionsFlatRate,
shippingOptionsCalculated,
prices,
fulfillmentSetLocationMap,
}) => {
return [ return [
...shippingOptionsFlatRate.map((shippingOption) => { ...shippingOptionsFlatRate.map((shippingOption) => {
const price = shippingOption.calculated_price const price = shippingOption.calculated_price
@@ -264,6 +271,10 @@ export const listShippingOptionsForCartWithPricingWorkflow = createWorkflow(
is_tax_inclusive: is_tax_inclusive:
prices[index]?.is_calculated_price_tax_inclusive, prices[index]?.is_calculated_price_tax_inclusive,
calculated_price: prices[index], calculated_price: prices[index],
stock_location:
fulfillmentSetLocationMap[
shippingOption.service_zone.fulfillment_set_id
],
} }
}), }),
] ]

View File

@@ -53,22 +53,19 @@ export const listShippingOptionsForCartWorkflow = createWorkflow(
({ scFulfillmentSetQuery }) => scFulfillmentSetQuery.data[0] ({ scFulfillmentSetQuery }) => scFulfillmentSetQuery.data[0]
) )
const { fulfillmentSetIds, fulfillmentSetLocationMap } = transform( const { fulfillmentSetIds } = transform(
{ scFulfillmentSets }, { scFulfillmentSets },
({ scFulfillmentSets }) => { ({ scFulfillmentSets }) => {
const fulfillmentSetIds = new Set<string>() const fulfillmentSetIds = new Set<string>()
const fulfillmentSetLocationMap = {}
scFulfillmentSets.stock_locations.forEach((stockLocation) => { scFulfillmentSets.stock_locations.forEach((stockLocation) => {
stockLocation.fulfillment_sets.forEach((fulfillmentSet) => { stockLocation.fulfillment_sets.forEach((fulfillmentSet) => {
fulfillmentSetLocationMap[fulfillmentSet.id] = stockLocation
fulfillmentSetIds.add(fulfillmentSet.id) fulfillmentSetIds.add(fulfillmentSet.id)
}) })
}) })
return { return {
fulfillmentSetIds: Array.from(fulfillmentSetIds), fulfillmentSetIds: Array.from(fulfillmentSetIds),
fulfillmentSetLocationMap,
} }
} }
) )
@@ -130,19 +127,15 @@ export const listShippingOptionsForCartWorkflow = createWorkflow(
}).config({ name: "shipping-options-query" }) }).config({ name: "shipping-options-query" })
const shippingOptionsWithPrice = transform( const shippingOptionsWithPrice = transform(
{ shippingOptions, fulfillmentSetLocationMap }, { shippingOptions },
({ shippingOptions, fulfillmentSetLocationMap }) => ({ shippingOptions }) =>
shippingOptions.map((shippingOption) => { shippingOptions.map((shippingOption) => {
const price = shippingOption.calculated_price const price = shippingOption.calculated_price
const fulfillmentSetId =
shippingOption.service_zone.fulfillment_set_id
const stockLocation = fulfillmentSetLocationMap[fulfillmentSetId]
return { return {
...shippingOption, ...shippingOption,
amount: price?.calculated_amount, amount: price?.calculated_amount,
is_tax_inclusive: !!price?.is_calculated_price_tax_inclusive, is_tax_inclusive: !!price?.is_calculated_price_tax_inclusive,
stock_location: stockLocation,
} }
}) })
) )

View File

@@ -7,6 +7,7 @@ import {
} from "@medusajs/framework/workflows-sdk" } from "@medusajs/framework/workflows-sdk"
import { calculateShippingOptionsPricesStep } from "../steps" import { calculateShippingOptionsPricesStep } from "../steps"
import { useQueryGraphStep } from "../../common" import { useQueryGraphStep } from "../../common"
import { cartFieldsForCalculateShippingOptionsPrices } from "../../cart/utils/fields"
export const calculateShippingOptionsPricesWorkflowId = export const calculateShippingOptionsPricesWorkflowId =
"calculate-shipping-options-prices-workflow" "calculate-shipping-options-prices-workflow"
@@ -31,7 +32,7 @@ export const calculateShippingOptionsPricesWorkflow = createWorkflow(
const cartQuery = useQueryGraphStep({ const cartQuery = useQueryGraphStep({
entity: "cart", entity: "cart",
filters: { id: input.cart_id }, filters: { id: input.cart_id },
fields: ["id", "items.*", "shipping_address.*"], fields: cartFieldsForCalculateShippingOptionsPrices,
}).config({ name: "cart-query" }) }).config({ name: "cart-query" })
const fulfillmentSetId = transform( const fulfillmentSetId = transform(