UNPKG

@medusajs/core-flows

Version:

Set of workflow definitions for Medusa

134 lines 6.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.cancelOrderWorkflow = exports.cancelOrderWorkflowId = exports.cancelValidateOrder = void 0; const utils_1 = require("@medusajs/framework/utils"); const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk"); const common_1 = require("../../common"); const payment_collection_1 = require("../../payment-collection"); const steps_1 = require("../../payment/steps"); const steps_2 = require("../../reservation/steps"); const cancel_orders_1 = require("../steps/cancel-orders"); const order_validation_1 = require("../utils/order-validation"); const create_order_refund_credit_lines_1 = require("./payments/create-order-refund-credit-lines"); const refund_captured_payments_1 = require("./payments/refund-captured-payments"); /** * This step validates that an order can be canceled. If the order has fulfillments that * aren't canceled, or the order was canceled previously, the step throws an error. * * :::note * * You can retrieve an order's details using [Query](https://docs.medusajs.com/learn/fundamentals/module-links/query), * or [useQueryGraphStep](https://docs.medusajs.com/resources/references/medusa-workflows/steps/useQueryGraphStep). * * ::: * * @example * const data = cancelValidateOrder({ * order: { * id: "order_123", * // other order details... * }, * input: { * order_id: "order_123", * } * }) */ exports.cancelValidateOrder = (0, workflows_sdk_1.createStep)("cancel-validate-order", ({ order, }) => { const order_ = order; (0, order_validation_1.throwIfOrderIsCancelled)({ order }); const throwErrorIf = (arr, pred, type) => { if (arr?.some(pred)) { throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, `All ${type} must be canceled before canceling an order`); } }; const notCanceled = (o) => !o.canceled_at; throwErrorIf(order_.fulfillments, notCanceled, "fulfillments"); }); exports.cancelOrderWorkflowId = "cancel-order"; /** * This workflow cancels an order. An order can only be canceled if it doesn't have * any fulfillments, or if all fulfillments are canceled. The workflow will also cancel * any uncaptured payments, and refund any captured payments. * * This workflow is used by the [Cancel Order Admin API Route](https://docs.medusajs.com/api/admin#orders_postordersidcancel). * * This workflow has a hook that allows you to perform custom actions on the canceled order. For example, you can * make changes to custom models linked to the order. * * You can also use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around canceling an order. * * @example * const { result } = await cancelOrderWorkflow(container) * .run({ * input: { * order_id: "order_123", * } * }) * * @summary * * Cancel an order. * * @property hooks.orderCanceled - This hook is executed after the order is canceled. You can consume this hook to perform custom actions on the canceled order. */ exports.cancelOrderWorkflow = (0, workflows_sdk_1.createWorkflow)(exports.cancelOrderWorkflowId, (input) => { const orderQuery = (0, common_1.useQueryGraphStep)({ entity: "orders", fields: [ "id", "status", "items.id", "fulfillments.canceled_at", "payment_collections.payments.id", "payment_collections.payments.amount", "payment_collections.payments.refunds.id", "payment_collections.payments.refunds.amount", "payment_collections.payments.captures.id", "payment_collections.payments.captures.amount", ], filters: { id: input.order_id }, options: { throwIfKeyNotFound: true }, }).config({ name: "get-cart" }); const order = (0, workflows_sdk_1.transform)({ orderQuery }, ({ orderQuery }) => orderQuery.data[0]); (0, exports.cancelValidateOrder)({ order, input }); const uncapturedPaymentIds = (0, workflows_sdk_1.transform)({ order }, ({ order }) => { const payments = (0, utils_1.deepFlatMap)(order, "payment_collections.payments", ({ payments }) => payments); const uncapturedPayments = payments.filter((payment) => payment.captures.length === 0); return uncapturedPayments.map((payment) => payment.id); }); const creditLineAmount = (0, workflows_sdk_1.transform)({ order }, ({ order }) => { const payments = (0, utils_1.deepFlatMap)(order, "payment_collections.payments", ({ payments }) => payments); return payments.reduce((acc, payment) => utils_1.MathBN.sum(acc, payment.amount), utils_1.MathBN.convert(0)); }); const lineItemIds = (0, workflows_sdk_1.transform)({ order }, ({ order }) => { return order.items?.map((i) => i.id); }); (0, workflows_sdk_1.parallelize)(create_order_refund_credit_lines_1.createOrderRefundCreditLinesWorkflow.runAsStep({ input: { order_id: order.id, amount: creditLineAmount, }, }), (0, steps_2.deleteReservationsByLineItemsStep)(lineItemIds), (0, steps_1.cancelPaymentStep)({ paymentIds: uncapturedPaymentIds }), refund_captured_payments_1.refundCapturedPaymentsWorkflow.runAsStep({ input: { order_id: order.id, created_by: input.canceled_by }, }), (0, common_1.emitEventStep)({ eventName: utils_1.OrderWorkflowEvents.CANCELED, data: { id: order.id }, })); const paymentCollectionids = (0, workflows_sdk_1.transform)({ order }, ({ order }) => order.payment_collections?.map((pc) => pc.id)); (0, workflows_sdk_1.when)({ paymentCollectionids }, ({ paymentCollectionids }) => { return !!paymentCollectionids?.length; }).then(() => { (0, payment_collection_1.updatePaymentCollectionStep)({ selector: { id: paymentCollectionids }, update: { status: utils_1.PaymentCollectionStatus.CANCELED }, }); }); (0, cancel_orders_1.cancelOrdersStep)({ orderIds: [order.id] }); const orderCanceled = (0, workflows_sdk_1.createHook)("orderCanceled", { order, }); return new workflows_sdk_1.WorkflowResponse(void 0, { hooks: [orderCanceled], }); }); //# sourceMappingURL=cancel-order.js.map