UNPKG

@medusajs/core-flows

Version:

Set of workflow definitions for Medusa

212 lines • 8.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.listShippingOptionsForCartWorkflow = exports.listShippingOptionsForCartWorkflowId = void 0; const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk"); const common_1 = require("../../common"); const use_remote_query_1 = require("../../common/steps/use-remote-query"); const fields_1 = require("../utils/fields"); const utils_1 = require("@medusajs/framework/utils"); const schemas_1 = require("../utils/schemas"); exports.listShippingOptionsForCartWorkflowId = "list-shipping-options-for-cart"; /** * This workflow lists the shipping options of a cart. It's executed by the * [List Shipping Options Store API Route](https://docs.medusajs.com/api/store#shipping-options_getshippingoptions). * * :::note * * This workflow doesn't retrieve the calculated prices of the shipping options. If you need to retrieve the prices of the shipping options, * use the {@link listShippingOptionsForCartWithPricingWorkflow} workflow. * * ::: * * You can use this workflow within your own customizations or custom workflows, allowing you to wrap custom logic around to retrieve the shipping options of a cart * in your custom flows. * * @example * const { result } = await listShippingOptionsForCartWorkflow(container) * .run({ * input: { * cart_id: "cart_123", * option_ids: ["so_123"] * } * }) * * @summary * * List a cart's shipping options. * * @property hooks.setPricingContext - This hook is executed before the shipping options are retrieved. You can consume this hook to return any custom context useful for the prices retrieval of shipping options. * * For example, assuming you have the following custom pricing rule: * * ```json * { * "attribute": "location_id", * "operator": "eq", * "value": "sloc_123", * } * ``` * * You can consume the `setPricingContext` hook to add the `location_id` context to the prices calculation: * * ```ts * import { listShippingOptionsForCartWorkflow } from "@medusajs/medusa/core-flows"; * import { StepResponse } from "@medusajs/workflows-sdk"; * * listShippingOptionsForCartWorkflow.hooks.setPricingContext(( * { cart, fulfillmentSetIds, additional_data }, { container } * ) => { * return new StepResponse({ * location_id: "sloc_123", // Special price for in-store purchases * }); * }); * ``` * * The shipping options' prices will now be retrieved using the context you return. * * :::note * * Learn more about prices calculation context in the [Prices Calculation](https://docs.medusajs.com/resources/commerce-modules/pricing/price-calculation) documentation. * * ::: */ exports.listShippingOptionsForCartWorkflow = (0, workflows_sdk_1.createWorkflow)(exports.listShippingOptionsForCartWorkflowId, (input) => { const cartQuery = (0, common_1.useQueryGraphStep)({ entity: "cart", filters: { id: input.cart_id }, fields: [ ...fields_1.cartFieldsForPricingContext, "items.*", "items.variant.manage_inventory", "items.variant.inventory_items.inventory_item_id", "items.variant.inventory_items.inventory.requires_shipping", "items.variant.inventory_items.inventory.location_levels.*", ], options: { throwIfKeyNotFound: true }, }).config({ name: "get-cart" }); const cart = (0, workflows_sdk_1.transform)({ cartQuery }, ({ cartQuery }) => cartQuery.data[0]); (0, common_1.validatePresenceOfStep)({ entity: cart, fields: ["sales_channel_id", "region_id", "currency_code"], }); const scFulfillmentSetQuery = (0, common_1.useQueryGraphStep)({ entity: "sales_channels", filters: { id: cart.sales_channel_id }, fields: [ "stock_locations.fulfillment_sets.id", "stock_locations.id", "stock_locations.name", "stock_locations.address.*", ], }).config({ name: "sales_channels-fulfillment-query" }); const scFulfillmentSets = (0, workflows_sdk_1.transform)({ scFulfillmentSetQuery }, ({ scFulfillmentSetQuery }) => scFulfillmentSetQuery.data[0]); const { fulfillmentSetIds } = (0, workflows_sdk_1.transform)({ scFulfillmentSets }, ({ scFulfillmentSets }) => { const fulfillmentSetIds = new Set(); scFulfillmentSets.stock_locations.forEach((stockLocation) => { stockLocation.fulfillment_sets.forEach((fulfillmentSet) => { fulfillmentSetIds.add(fulfillmentSet.id); }); }); return { fulfillmentSetIds: Array.from(fulfillmentSetIds), }; }); const setPricingContext = (0, workflows_sdk_1.createHook)("setPricingContext", { cart: cart, fulfillmentSetIds, additional_data: input.additional_data, }, { resultValidator: schemas_1.pricingContextResult, }); const setPricingContextResult = setPricingContext.getResult(); const queryVariables = (0, workflows_sdk_1.transform)({ input, fulfillmentSetIds, cart, setPricingContextResult }, ({ input, fulfillmentSetIds, cart, setPricingContextResult }) => { return { id: input.option_ids, context: { is_return: input.is_return ? "true" : "false", enabled_in_store: !(0, utils_1.isDefined)(input.enabled_in_store) ? "true" : input.enabled_in_store ? "true" : "false", }, filters: { fulfillment_set_id: fulfillmentSetIds, address: { country_code: cart.shipping_address?.country_code, province_code: cart.shipping_address?.province, city: cart.shipping_address?.city, postal_expression: cart.shipping_address?.postal_code, }, }, calculated_price: { context: { ...cart, ...(setPricingContextResult ? setPricingContextResult : {}), currency_code: cart.currency_code, region_id: cart.region_id, region: cart.region, customer_id: cart.customer_id, customer: cart.customer, }, }, }; }); const shippingOptions = (0, use_remote_query_1.useRemoteQueryStep)({ entry_point: "shipping_options", fields: [ "id", "name", "price_type", "service_zone_id", "shipping_profile_id", "provider_id", "data", "service_zone.fulfillment_set_id", "service_zone.fulfillment_set.type", "service_zone.fulfillment_set.location.id", "service_zone.fulfillment_set.location.address.*", "type.id", "type.label", "type.description", "type.code", "provider.id", "provider.is_enabled", "rules.attribute", "rules.value", "rules.operator", "calculated_price.*", "prices.*", "prices.price_rules.*", ], variables: queryVariables, }).config({ name: "shipping-options-query" }); const shippingOptionsWithPrice = (0, workflows_sdk_1.transform)({ shippingOptions, cart }, ({ shippingOptions, cart }) => shippingOptions.map((shippingOption) => { const price = shippingOption.calculated_price; const locationId = shippingOption.service_zone.fulfillment_set.location.id; const itemsAtLocationWithoutAvailableQuantity = cart.items.filter((item) => { if (!item.variant?.manage_inventory) { return false; } return item.variant.inventory_items.some((inventoryItem) => { if (!inventoryItem.inventory.requires_shipping) { return false; } const level = inventoryItem.inventory.location_levels.find((locationLevel) => { return locationLevel.location_id === locationId; }); return !level ? true : level.available_quantity < item.quantity; }); }); return { ...shippingOption, amount: price?.calculated_amount, is_tax_inclusive: !!price?.is_calculated_price_tax_inclusive, insufficient_inventory: itemsAtLocationWithoutAvailableQuantity.length > 0, }; })); return new workflows_sdk_1.WorkflowResponse(shippingOptionsWithPrice, { hooks: [setPricingContext], }); }); //# sourceMappingURL=list-shipping-options-for-cart.js.map