order-management 0.0.25 → 0.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,150 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.POST = void 0;
4
- const utils_1 = require("@medusajs/framework/utils");
5
- const approve_swap_workflow_1 = require("../../../../../workflows/swaps/approve-swap-workflow");
6
- const validators_1 = require("../../validators");
7
- const swap_1 = require("../../../../../modules/swap");
8
- const order_exchange_data_1 = require("../../../../../helpers/order-exchange-data");
9
- const zod_1 = require("zod");
10
- const POST = async (req, res) => {
11
- const { id } = req.params;
12
- if (!id) {
13
- res.status(400).json({ message: "Swap ID is required" });
14
- return;
15
- }
16
- // Type-safe access to auth_context
17
- const authContext = req.auth_context;
18
- const adminId = authContext?.actor_id || authContext?.user_id || "admin";
19
- try {
20
- // Parse and validate request body for exchange details (all fields optional now)
21
- const exchangeDetails = validators_1.ApproveSwapSchema.parse(req.body || {});
22
- // Get swap to retrieve order_id
23
- const swapService = req.scope.resolve(swap_1.SWAP_MODULE);
24
- const swap = await swapService.retrieveSwap(id);
25
- const swapData = swap;
26
- // Auto-populate location and shipping methods from order data
27
- let returnLocationId = exchangeDetails.return_location_id;
28
- let returnShippingMethodId = exchangeDetails.return_shipping_method_id;
29
- let outboundShippingMethodId = exchangeDetails.outbound_shipping_method_id;
30
- const shippingOptionId = exchangeDetails.shipping_option_id; // Shipping option selected by admin
31
- if (swapData.order_id) {
32
- try {
33
- const orderExchangeData = await (0, order_exchange_data_1.getOrderExchangeData)(swapData.order_id, req.scope);
34
- // Use order's fulfillment location if not provided
35
- if (!returnLocationId && orderExchangeData.location_id) {
36
- returnLocationId = orderExchangeData.location_id;
37
- }
38
- // Use Standard Shipping for return if not provided
39
- if (!returnShippingMethodId && orderExchangeData.standard_shipping_method_id) {
40
- returnShippingMethodId = orderExchangeData.standard_shipping_method_id;
41
- }
42
- // Use last shipping method for outbound (or Standard if last was Standard)
43
- // Only auto-populate if shipping_option_id is not provided (manual selection takes precedence)
44
- if (!outboundShippingMethodId && !shippingOptionId) {
45
- if (orderExchangeData.last_shipping_method_id) {
46
- outboundShippingMethodId = orderExchangeData.last_shipping_method_id;
47
- }
48
- else if (orderExchangeData.standard_shipping_method_id) {
49
- // Fallback to Standard Shipping if no last shipping method found
50
- outboundShippingMethodId = orderExchangeData.standard_shipping_method_id;
51
- }
52
- }
53
- }
54
- catch (error) {
55
- // Log warning but continue - use provided values or null
56
- console.warn("[Approve Swap] Failed to fetch order exchange data:", error);
57
- }
58
- }
59
- // Store exchange details and approve swap
60
- const { result: approvalResult } = await (0, approve_swap_workflow_1.approveSwapWorkflow)(req.scope).run({
61
- input: {
62
- swap_id: id,
63
- admin_id: adminId,
64
- return_location_id: returnLocationId,
65
- return_shipping_method_id: returnShippingMethodId,
66
- outbound_shipping_method_id: outboundShippingMethodId,
67
- shipping_option_id: shippingOptionId, // Pass selected shipping option ID
68
- send_notification: exchangeDetails.send_notification,
69
- },
70
- });
71
- // Return response with swap data
72
- res.json({
73
- swap: approvalResult.swap,
74
- return_id: approvalResult.return_id,
75
- exchange_id: approvalResult.exchange_id,
76
- message: "Swap approved and exchange order created successfully.",
77
- });
78
- }
79
- catch (error) {
80
- // Handle Zod validation errors
81
- if (error instanceof zod_1.z.ZodError) {
82
- res.status(400).json({
83
- message: "Invalid request data",
84
- errors: error.errors,
85
- });
86
- return;
87
- }
88
- // Extract error message - handle various error formats
89
- let errorMessage = "Unknown error";
90
- let errorStack;
91
- let errorType;
92
- if (error instanceof Error) {
93
- errorMessage = error.message;
94
- errorStack = error.stack;
95
- errorType = error.type;
96
- }
97
- else if (error && typeof error === "object") {
98
- const errorObj = error;
99
- errorMessage = String(errorObj.message ||
100
- errorObj.error ||
101
- errorObj.reason ||
102
- JSON.stringify(errorObj));
103
- errorStack = errorObj.stack;
104
- errorType = errorObj.type;
105
- }
106
- else {
107
- errorMessage = String(error);
108
- }
109
- // Log full error details
110
- let errorStringified = "Unable to stringify";
111
- try {
112
- errorStringified = JSON.stringify(error, (key, value) => {
113
- if (key === "parent" || key === "children" || key === "container") {
114
- return "[Circular]";
115
- }
116
- return value;
117
- }, 2);
118
- }
119
- catch {
120
- errorStringified = `Stringify failed`;
121
- }
122
- console.error("[Approve Swap] Error:", {
123
- swap_id: id,
124
- error_message: errorMessage,
125
- error_type: errorType,
126
- error_stack: errorStack,
127
- error_stringified: errorStringified,
128
- error_constructor: error?.constructor?.name,
129
- error_keys: error && typeof error === "object" ? Object.keys(error) : [],
130
- });
131
- if (error instanceof utils_1.MedusaError) {
132
- const statusCode = error.type === utils_1.MedusaError.Types.NOT_FOUND
133
- ? 404
134
- : error.type === utils_1.MedusaError.Types.INVALID_DATA
135
- ? 400
136
- : 500;
137
- res.status(statusCode).json({
138
- message: error.message,
139
- type: error.type,
140
- });
141
- return;
142
- }
143
- res.status(500).json({
144
- message: "Failed to approve swap",
145
- error: errorMessage,
146
- });
147
- }
148
- };
149
- exports.POST = POST;
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N3YXBzL1tpZF0vYXBwcm92ZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFDdkQsZ0dBQTBGO0FBQzFGLGlEQUFvRDtBQUNwRCxzREFBeUQ7QUFFekQsb0ZBQWlGO0FBQ2pGLDZCQUF1QjtBQUVoQixNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ0osRUFBRTtJQUNqQixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUV6QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDUixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUE7UUFDeEQsT0FBTTtJQUNSLENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsTUFBTSxXQUFXLEdBQUksR0FFbkIsQ0FBQyxZQUFZLENBQUE7SUFFZixNQUFNLE9BQU8sR0FBRyxXQUFXLEVBQUUsUUFBUSxJQUFJLFdBQVcsRUFBRSxPQUFPLElBQUksT0FBTyxDQUFBO0lBRXhFLElBQUksQ0FBQztRQUNILGlGQUFpRjtRQUNqRixNQUFNLGVBQWUsR0FBRyw4QkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUUvRCxnQ0FBZ0M7UUFDaEMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQWMsa0JBQVcsQ0FBQyxDQUFBO1FBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUloQixDQUFBO1FBRUQsOERBQThEO1FBQzlE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
@@ -1,105 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GET = void 0;
4
- const utils_1 = require("@medusajs/framework/utils");
5
- const swap_1 = require("../../../../../modules/swap");
6
- /**
7
- * GET /admin/swaps/[id]/shipping-options
8
- *
9
- * Fetches shipping options available for the swap's order region.
10
- * This is used to populate the shipping option selection modal when approving a swap.
11
- */
12
- const GET = async (req, res) => {
13
- const { id } = req.params;
14
- if (!id) {
15
- res.status(400).json({ message: "Swap ID is required" });
16
- return;
17
- }
18
- try {
19
- const swapService = req.scope.resolve(swap_1.SWAP_MODULE);
20
- const swap = await swapService.retrieveSwap(id);
21
- const swapData = swap;
22
- if (!swapData.order_id) {
23
- res.status(400).json({
24
- message: "Swap does not have an associated order. Cannot fetch shipping options."
25
- });
26
- return;
27
- }
28
- // Fetch order to get region_id
29
- const remoteQuery = req.scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
30
- const orderQuery = (0, utils_1.remoteQueryObjectFromString)({
31
- entryPoint: "order",
32
- fields: [
33
- "id",
34
- "region_id",
35
- ],
36
- filters: {
37
- id: [swapData.order_id],
38
- },
39
- });
40
- const orders = await remoteQuery(orderQuery);
41
- const orderArray = Array.isArray(orders) ? orders : orders ? [orders] : [];
42
- const order = orderArray[0];
43
- if (!order || !order.region_id) {
44
- res.status(400).json({
45
- message: "Order does not have a region. Cannot fetch shipping options."
46
- });
47
- return;
48
- }
49
- // Query shipping options for the order's region
50
- const shippingOptionsQuery = (0, utils_1.remoteQueryObjectFromString)({
51
- entryPoint: "shipping_option",
52
- fields: [
53
- "id",
54
- "name",
55
- "price_type",
56
- "service_zone_id",
57
- "service_zone.region_id",
58
- "provider_id",
59
- "data",
60
- "metadata",
61
- ],
62
- filters: {
63
- service_zone: {
64
- region_id: [order.region_id],
65
- },
66
- },
67
- });
68
- const shippingOptions = await remoteQuery(shippingOptionsQuery);
69
- const optionsArray = Array.isArray(shippingOptions)
70
- ? shippingOptions
71
- : shippingOptions
72
- ? [shippingOptions]
73
- : [];
74
- // Filter to ensure we only return options for the correct region
75
- const filteredOptions = optionsArray.filter((option) => {
76
- return option.service_zone?.region_id === order.region_id;
77
- });
78
- res.json({
79
- shipping_options: filteredOptions.map((option) => ({
80
- id: option.id,
81
- name: option.name || "Unnamed Shipping Option",
82
- price_type: option.price_type,
83
- provider_id: option.provider_id,
84
- })),
85
- });
86
- }
87
- catch (error) {
88
- if (error instanceof utils_1.MedusaError) {
89
- const statusCode = error.type === utils_1.MedusaError.Types.NOT_FOUND ? 404 : 400;
90
- res.status(statusCode).json({
91
- message: error.message,
92
- type: error.type,
93
- });
94
- return;
95
- }
96
- const errorMessage = error instanceof Error ? error.message : "Unknown error";
97
- console.error("[Get Shipping Options] Error:", errorMessage);
98
- res.status(500).json({
99
- message: "Failed to fetch shipping options",
100
- error: errorMessage,
101
- });
102
- }
103
- };
104
- exports.GET = GET;
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N3YXBzL1tpZF0vc2hpcHBpbmctb3B0aW9ucy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBK0c7QUFFL0csc0RBQXlEO0FBR3pEOzs7OztHQUtHO0FBQ0ksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUFrQixFQUNsQixHQUFtQixFQUNKLEVBQUU7SUFDakIsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7SUFFekIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELE9BQU07SUFDUixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQWMsa0JBQVcsQ0FBQyxDQUFBO1FBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUE2QixDQUFBO1FBRTlDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ25CLE9BQU8sRUFBRSx3RUFBd0U7YUFDbEYsQ0FBQyxDQUFBO1lBQ0YsT0FBTTtRQUNSLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ25DLGlDQUF5QixDQUFDLFlBQVksQ0FDdkMsQ0FBQTtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUEsbUNBQTJC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
@@ -1,84 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.approveSwapWorkflow = void 0;
4
- const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
- const swap_1 = require("../steps/swap");
6
- exports.approveSwapWorkflow = (0, workflows_sdk_1.createWorkflow)("approve-swap", (input) => {
7
- const { swap_id, admin_id, return_location_id, return_shipping_method_id, outbound_shipping_method_id, shipping_option_id, send_notification, } = input;
8
- // Step 1: Retrieve swap to validate it's in requested status
9
- const { swap: retrievedSwap } = (0, swap_1.retrieveSwapStep)({
10
- swap_id,
11
- });
12
- // Step 2: Store exchange details and set pending_exchange_creation flag
13
- // This must happen before creating return/exchange so the data is available
14
- // The pending_exchange_creation flag allows createMedusaReturnStep to work
15
- // with "requested" status
16
- const { swap: swapWithExchangeDetails } = (0, swap_1.updateSwapExchangeDetailsStep)({
17
- swap_id,
18
- return_location_id,
19
- return_shipping_method_id,
20
- outbound_shipping_method_id,
21
- send_notification,
22
- metadata: {
23
- pending_exchange_creation: true,
24
- exchange_details: {
25
- return_location_id,
26
- return_shipping_method_id,
27
- outbound_shipping_method_id,
28
- shipping_option_id,
29
- send_notification,
30
- configured_at: new Date().toISOString(),
31
- },
32
- },
33
- });
34
- // Step 3: Create Medusa Return
35
- // This will work because pending_exchange_creation flag is set
36
- // This will automatically rollback if it fails (workflow handles it)
37
- const { return_id, swap: swapWithReturn } = (0, swap_1.createMedusaReturnStep)({
38
- swap_id,
39
- return_location_id,
40
- return_shipping_method_id,
41
- });
42
- // Step 4: Create Medusa Exchange linked to return
43
- // This will automatically rollback if it fails (workflow handles it)
44
- // The exchange is created with the admin who approved it
45
- // Pass shipping_option_id if provided (selected by admin in popup)
46
- const { exchange_id, swap: swapWithExchange } = (0, swap_1.createMedusaExchangeStep)({
47
- swap_id,
48
- return_id,
49
- outbound_shipping_method_id,
50
- shipping_option_id,
51
- send_notification,
52
- });
53
- // Step 5: Update swap status to approved and mark exchange as created
54
- // This is the ONLY call to updateSwapStatusStep - if any previous step fails,
55
- // workflow will rollback and swap will remain in "requested" status
56
- const { swap: finalSwap } = (0, swap_1.updateSwapStatusStep)({
57
- swap_id,
58
- status: "approved",
59
- metadata: {
60
- approved_at: new Date().toISOString(),
61
- approved_by: admin_id,
62
- exchange_confirmed_at: new Date().toISOString(),
63
- exchange_confirmed_by: admin_id,
64
- exchange_id,
65
- return_id,
66
- pending_exchange_creation: false,
67
- exchange_details: {
68
- return_location_id,
69
- return_shipping_method_id,
70
- outbound_shipping_method_id,
71
- shipping_option_id,
72
- send_notification,
73
- configured_at: new Date().toISOString(),
74
- },
75
- },
76
- });
77
- return new workflows_sdk_1.WorkflowResponse({
78
- swap: finalSwap,
79
- return_id,
80
- exchange_id,
81
- });
82
- });
83
- exports.default = exports.approveSwapWorkflow;
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcm92ZS1zd2FwLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zd2Fwcy9hcHByb3ZlLXN3YXAtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBRzBDO0FBQzFDLHdDQU1zQjtBQU1ULFFBQUEsbUJBQW1CLEdBQUcsSUFBQSw4QkFBYyxFQUMvQyxjQUFjLEVBQ2QsQ0FDRSxLQUErQixFQUNjLEVBQUU7SUFDL0MsTUFBTSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1Isa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLGlCQUFpQixHQUNsQixHQUFHLEtBQUssQ0FBQTtJQUVULDZEQUE2RDtJQUM3RCxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUEsdUJBQWdCLEVBQUM7UUFDL0MsT0FBTztLQUNSLENBQUMsQ0FBQTtJQUVGLHdFQUF3RTtJQUN4RSw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLDBCQUEwQjtJQUMxQixNQUFNLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsSUFBQSxvQ0FBNkIsRUFBQztRQUN0RSxPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLHlCQUF5QjtRQUN6QiwyQkFBMkI7UUFDM0IsaUJBQWlCO1FBQ2pCLFFBQVEsRUFBRTtZQUNSLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsZ0JBQWdCLEVBQUU7Z0JBQ2hCLGtCQUFrQjtnQkFDbEIseUJBQXlCO2dCQUN6QiwyQkFBMkI7Z0JBQzNCLGtCQUFrQjtnQkFDbEIsaUJBQWlCO2dCQUNqQixhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDeEM7U0FDRjtLQUNGLENBQUMsQ0FBQTtJQUVGLCtCQUErQjtJQUMvQiwrREFBK0Q7SUFDL0QscUVBQXFFO0lBQ3JFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUEsNkJBQXNCLEVBQUM7UUFDakUsT0FBTztRQUNQLGtCQUFrQjtRQUNsQix5QkFBeUI7S0FDMUIsQ0FBQyxDQUFBO0lBRUYsa0RBQWtEO0lBQ2xELHFFQUFxRTtJQUNyRSx5REFBeUQ7SUFDekQsbUVBQW1FO0lBQ25FLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBQSwrQkFBd0IsRUFBQztRQUN2RSxPQUFPO1FBQ1AsU0FBUztRQUNULDJCQUEyQjtRQUMzQixrQkFBa0I7UUFDbEIsaUJBQWlCO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLHNFQUFzRTtJQUN0RSw4RUFBOEU7SUFDOUUsb0VBQW9FO0lBQ3BFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSwyQkFBb0IsRUFBQztRQUMvQyxPQUFPO1FBQ1AsTUFBTSxFQUFFLFVBQVU7UUFDbEIsUUFBUSxFQUFFO1lBQ1IsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ3JDLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLHFCQUFxQixFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQy9DLHFCQUFxQixFQUFFLFFBQVE7WUFDL0IsV0FBVztZQUNYLFNBQVM7WUFDVCx5QkFBeUIsRUFBRSxLQUFLO1lBQ2hDLGdCQUFnQixFQUFFO2dCQUNoQixrQkFBa0I7Z0JBQ2xCLHlCQUF5QjtnQkFDekIsMkJBQTJCO2dCQUMzQixrQkFBa0I7Z0JBQ2xCLGlCQUFpQjtnQkFDakIsYUFBYSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2FBQ3hDO1NBQ0Y7S0FDRixDQUFDLENBQUE7SUFFRixPQUFPLElBQUksZ0NBQWdCLENBQTRCO1FBQ3JELElBQUksRUFBRSxTQUFTO1FBQ2YsU0FBUztRQUNULFdBQVc7S0FDWixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLDJCQUFtQixDQUFBIn0=
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.executeSwapWorkflow = void 0;
4
- const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
- const swap_1 = require("../steps/swap");
6
- exports.executeSwapWorkflow = (0, workflows_sdk_1.createWorkflow)("execute-swap", (input) => {
7
- const { swap_id, return_location_id: inputReturnLocationId, return_shipping_method_id: inputReturnShippingMethodId, outbound_shipping_method_id: inputOutboundShippingMethodId, send_notification: inputSendNotification, } = input;
8
- // Step 1: Retrieve swap to validate it's approved and get exchange details
9
- const { swap: retrievedSwap } = (0, swap_1.retrieveSwapStep)({
10
- swap_id,
11
- });
12
- // Extract exchange details from swap if not provided in input
13
- // This allows backward compatibility and ensures we use stored values
14
- const swapData = retrievedSwap;
15
- const return_location_id = inputReturnLocationId || swapData.return_location_id;
16
- const return_shipping_method_id = inputReturnShippingMethodId || swapData.return_shipping_method_id;
17
- const outbound_shipping_method_id = inputOutboundShippingMethodId || swapData.outbound_shipping_method_id;
18
- const send_notification = inputSendNotification !== undefined ? inputSendNotification : (swapData.send_notification || false);
19
- // Step 2: Create Medusa Return
20
- const { return_id, swap: swapWithReturn } = (0, swap_1.createMedusaReturnStep)({
21
- swap_id,
22
- return_location_id,
23
- return_shipping_method_id,
24
- });
25
- // Step 3: Create Medusa Exchange linked to return
26
- // This will trigger Medusa's native exchange workflow which handles:
27
- // - Fulfillment creation for new items
28
- // - Payment Collection creation if difference_due > 0 (customer owes)
29
- // - Refund processing if difference_due < 0 (customer gets refund)
30
- // - Status transitions (requested → received → shipped → delivered)
31
- //
32
- // Note: Payment differences are handled automatically by Medusa's Payment Collection API.
33
- // Admins should use Medusa's Payment Collection API (sdk.admin.paymentCollection) to
34
- // handle payments, not a custom endpoint.
35
- const { exchange_id, swap: swapWithExchange } = (0, swap_1.createMedusaExchangeStep)({
36
- swap_id,
37
- return_id,
38
- outbound_shipping_method_id,
39
- send_notification,
40
- });
41
- // Step 4: Update swap status to return_started after successful exchange creation
42
- // Note: This workflow is kept for potential future use but is not called automatically
43
- // on approval. Exchanges are created manually by admin.
44
- const { swap: finalSwap } = (0, swap_1.updateSwapStatusStep)({
45
- swap_id,
46
- status: "return_started",
47
- metadata: {
48
- medusa_integration_completed_at: new Date().toISOString(),
49
- },
50
- });
51
- return new workflows_sdk_1.WorkflowResponse({
52
- swap: finalSwap,
53
- return_id,
54
- exchange_id,
55
- });
56
- });
57
- exports.default = exports.executeSwapWorkflow;
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS1zd2FwLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zd2Fwcy9leGVjdXRlLXN3YXAtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBRzBDO0FBQzFDLHdDQUtzQjtBQU1ULFFBQUEsbUJBQW1CLEdBQUcsSUFBQSw4QkFBYyxFQUMvQyxjQUFjLEVBQ2QsQ0FDRSxLQUErQixFQUNjLEVBQUU7SUFDL0MsTUFBTSxFQUNKLE9BQU8sRUFDUCxrQkFBa0IsRUFBRSxxQkFBcUIsRUFDekMseUJBQXlCLEVBQUUsMkJBQTJCLEVBQ3RELDJCQUEyQixFQUFFLDZCQUE2QixFQUMxRCxpQkFBaUIsRUFBRSxxQkFBcUIsR0FDekMsR0FBRyxLQUFLLENBQUE7SUFFVCwyRUFBMkU7SUFDM0UsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFBLHVCQUFnQixFQUFDO1FBQy9DLE9BQU87S0FDUixDQUFDLENBQUE7SUFFRiw4REFBOEQ7SUFDOUQsc0VBQXNFO0lBQ3RFLE1BQU0sUUFBUSxHQUFHLGFBS2hCLENBQUE7SUFFRCxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQTtJQUMvRSxNQUFNLHlCQUF5QixHQUFHLDJCQUEyQixJQUFJLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQTtJQUNuRyxNQUFNLDJCQUEyQixHQUFHLDZCQUE2QixJQUFJLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQTtJQUN6RyxNQUFNLGlCQUFpQixHQUFHLHFCQUFxQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixJQUFJLEtBQUssQ0FBQyxDQUFBO0lBRTdILCtCQUErQjtJQUMvQixNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFBLDZCQUFzQixFQUFDO1FBQ2pFLE9BQU87UUFDUCxrQkFBa0I7UUFDbEIseUJBQXlCO0tBQzFCLENBQUMsQ0FBQTtJQUVGLGtEQUFrRDtJQUNsRCxxRUFBcUU7SUFDckUsdUNBQXVDO0lBQ3ZDLHNFQUFzRTtJQUN0RSxtRUFBbUU7SUFDbkUsb0VBQW9FO0lBQ3BFLEdBQUc7SUFDSCwwRkFBMEY7SUFDMUYscUZBQXFGO0lBQ3JGLDBDQUEwQztJQUMxQyxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUEsK0JBQXdCLEVBQUM7UUFDdkUsT0FBTztRQUNQLFNBQVM7UUFDVCwyQkFBMkI7UUFDM0IsaUJBQWlCO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLGtGQUFrRjtJQUNsRix1RkFBdUY7SUFDdkYsd0RBQXdEO0lBQ3hELE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSwyQkFBb0IsRUFBQztRQUMvQyxPQUFPO1FBQ1AsTUFBTSxFQUFFLGdCQUFnQjtRQUN4QixRQUFRLEVBQUU7WUFDUiwrQkFBK0IsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtTQUMxRDtLQUNGLENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBNEI7UUFDckQsSUFBSSxFQUFFLFNBQVM7UUFDZixTQUFTO1FBQ1QsV0FBVztLQUNaLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBO0FBRUQsa0JBQWUsMkJBQW1CLENBQUEifQ==