order-management 0.0.21 → 0.0.23
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.
- package/.medusa/server/src/admin/index.js +513 -484
- package/.medusa/server/src/admin/index.mjs +513 -484
- package/.medusa/server/src/api/admin/swaps/[id]/approve/route.js +81 -31
- package/.medusa/server/src/api/admin/swaps/[id]/confirm-exchange/route.js +109 -0
- package/.medusa/server/src/api/admin/swaps/health/route.js +150 -0
- package/.medusa/server/src/api/admin/swaps/route.js +6 -12
- package/.medusa/server/src/api/admin/swaps/validators.js +9 -13
- package/.medusa/server/src/api/store/orders/[order_id]/swaps/route.js +47 -2
- package/.medusa/server/src/api/store/swaps/[id]/cancel/route.js +8 -1
- package/.medusa/server/src/api/store/swaps/[id]/route.js +15 -4
- package/.medusa/server/src/api/store/swaps/route.js +53 -10
- package/.medusa/server/src/helpers/swaps.js +1 -1
- package/.medusa/server/src/modules/swap/migrations/Migration20260123144734.js +29 -0
- package/.medusa/server/src/modules/swap/migrations/Migration20260123162423.js +48 -0
- package/.medusa/server/src/modules/swap/migrations/Migration20260126114640.js +48 -0
- package/.medusa/server/src/modules/swap/models/swap.js +7 -2
- package/.medusa/server/src/modules/swap/service.js +259 -32
- package/.medusa/server/src/subscribers/exchange-created.js +207 -0
- package/.medusa/server/src/workflows/steps/swap/create-medusa-exchange-step.js +166 -20
- package/.medusa/server/src/workflows/steps/swap/create-medusa-return-step.js +76 -8
- package/.medusa/server/src/workflows/steps/swap/create-swap-step.js +7 -12
- package/.medusa/server/src/workflows/steps/swap/index.js +6 -4
- package/.medusa/server/src/workflows/steps/swap/rollback-return-step.js +70 -0
- package/.medusa/server/src/workflows/steps/swap/sync-medusa-status-step.js +49 -3
- package/.medusa/server/src/workflows/steps/swap/update-swap-exchange-details-step.js +27 -0
- package/.medusa/server/src/workflows/steps/swap/validate-eligibility-step.js +9 -4
- package/.medusa/server/src/workflows/steps/swap/validate-order-step.js +24 -1
- package/.medusa/server/src/workflows/swaps/approve-swap-workflow.js +23 -5
- package/.medusa/server/src/workflows/swaps/confirm-exchange-workflow.js +51 -0
- package/.medusa/server/src/workflows/swaps/create-swap-workflow.js +3 -1
- package/.medusa/server/src/workflows/swaps/execute-swap-workflow.js +26 -4
- package/package.json +1 -1
- package/.medusa/server/src/api/admin/swaps/[id]/process-payment/route.js +0 -152
- package/.medusa/server/src/api/admin/swaps/[id]/status/route.js +0 -45
- package/.medusa/server/src/api/admin/swaps/[id]/sync/route.js +0 -148
- package/.medusa/server/src/workflows/steps/swap/handle-payment-difference-step.js +0 -102
|
@@ -5,7 +5,7 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
5
5
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
6
|
const swap_1 = require("../../../modules/swap");
|
|
7
7
|
exports.createMedusaExchangeStep = (0, workflows_sdk_1.createStep)("create-medusa-exchange", async (input, { container }) => {
|
|
8
|
-
const { swap_id, return_id } = input;
|
|
8
|
+
const { swap_id, return_id, outbound_shipping_method_id, send_notification, new_items: inputNewItems } = input;
|
|
9
9
|
if (!swap_id) {
|
|
10
10
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "swap_id is required");
|
|
11
11
|
}
|
|
@@ -22,42 +22,188 @@ exports.createMedusaExchangeStep = (0, workflows_sdk_1.createStep)("create-medus
|
|
|
22
22
|
swap,
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
|
-
|
|
25
|
+
// Use new_items from input if provided, otherwise use from swap model
|
|
26
|
+
let newItems = [];
|
|
27
|
+
if (inputNewItems && inputNewItems.length > 0) {
|
|
28
|
+
// Use items from input (from exchange form)
|
|
29
|
+
newItems = inputNewItems;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// Use items from swap model
|
|
33
|
+
const swapNewItems = swapData.new_items || [];
|
|
34
|
+
if (Array.isArray(swapNewItems)) {
|
|
35
|
+
newItems = swapNewItems;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
26
38
|
if (newItems.length === 0) {
|
|
27
39
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Swap must have new items to create exchange");
|
|
28
40
|
}
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
if (!orderService) {
|
|
32
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order service is not available");
|
|
33
|
-
}
|
|
34
|
-
// Create exchange using Medusa's Order Module
|
|
41
|
+
// Try to resolve Medusa's exchange workflow first (preferred method)
|
|
42
|
+
// This ensures exchange follows Medusa's native workflow with automatic fulfillment creation
|
|
35
43
|
let exchangeId;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
let creationMethod = "service";
|
|
45
|
+
try {
|
|
46
|
+
// Try to resolve exchange workflow from container
|
|
47
|
+
// Common workflow names: "createExchangeWorkflow", "exchange.create", etc.
|
|
48
|
+
// Workflows in Medusa v2 are functions that take a scope and return an object with a run method
|
|
49
|
+
const possibleWorkflowNames = [
|
|
50
|
+
"createExchangeWorkflow",
|
|
51
|
+
"exchange.create",
|
|
52
|
+
"createExchange",
|
|
53
|
+
];
|
|
54
|
+
let workflowInstance = null;
|
|
55
|
+
for (const workflowName of possibleWorkflowNames) {
|
|
56
|
+
try {
|
|
57
|
+
const workflow = container.resolve(workflowName);
|
|
58
|
+
if (workflow && typeof workflow === "function") {
|
|
59
|
+
const instance = workflow(container);
|
|
60
|
+
if (instance &&
|
|
61
|
+
typeof instance === "object" &&
|
|
62
|
+
"run" in instance &&
|
|
63
|
+
typeof instance.run === "function") {
|
|
64
|
+
workflowInstance = instance;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Workflow not found or not in expected format, try next name
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (workflowInstance) {
|
|
75
|
+
// Use Medusa's exchange workflow (triggers fulfillment workflow automatically)
|
|
76
|
+
// Workflows are executed with scope and run method
|
|
77
|
+
try {
|
|
78
|
+
const { result } = await workflowInstance.run({
|
|
79
|
+
input: {
|
|
80
|
+
return_id,
|
|
81
|
+
items: newItems,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
if (!result || !result.exchange || !result.exchange.id) {
|
|
85
|
+
throw new Error("Workflow executed but did not return valid exchange ID");
|
|
86
|
+
}
|
|
87
|
+
exchangeId = result.exchange.id;
|
|
88
|
+
creationMethod = "workflow";
|
|
89
|
+
}
|
|
90
|
+
catch (executionError) {
|
|
91
|
+
// Workflow execution failed, fall through to service call fallback
|
|
92
|
+
throw executionError;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
throw new Error("Exchange workflow not found");
|
|
97
|
+
}
|
|
42
98
|
}
|
|
43
|
-
|
|
44
|
-
//
|
|
45
|
-
|
|
46
|
-
|
|
99
|
+
catch (workflowError) {
|
|
100
|
+
// Log workflow error for debugging, then fallback to service call
|
|
101
|
+
const errorMessage = workflowError instanceof Error ? workflowError.message : String(workflowError);
|
|
102
|
+
console.log(`[Create Medusa Exchange] Workflow resolution/execution failed, falling back to service call: ${errorMessage}`);
|
|
103
|
+
// Fallback to direct service call if workflow not available
|
|
104
|
+
try {
|
|
105
|
+
const orderService = container.resolve("order");
|
|
106
|
+
if (!orderService) {
|
|
107
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order service is not available");
|
|
108
|
+
}
|
|
109
|
+
if (orderService.createExchange) {
|
|
110
|
+
const exchange = await orderService.createExchange({
|
|
111
|
+
return_id,
|
|
112
|
+
items: newItems,
|
|
113
|
+
});
|
|
114
|
+
exchangeId = exchange.id;
|
|
115
|
+
creationMethod = "service";
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNKNOWN_MODULES, `Exchange creation is not available. Workflow error: ${errorMessage}. Order service createExchange method also not found.`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (serviceError) {
|
|
122
|
+
// If service call also fails, throw with both errors
|
|
123
|
+
const serviceErrorMessage = serviceError instanceof Error ? serviceError.message : String(serviceError);
|
|
124
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNKNOWN_MODULES, `Failed to create exchange via workflow and service: Workflow error: ${errorMessage}, Service error: ${serviceErrorMessage}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Add outbound shipping method if provided
|
|
128
|
+
// Note: This may need to be done via Medusa's exchange API after creation
|
|
129
|
+
// depending on Medusa v2 API structure
|
|
130
|
+
if (outbound_shipping_method_id) {
|
|
131
|
+
try {
|
|
132
|
+
const exchangeService = container.resolve("exchange");
|
|
133
|
+
if (exchangeService?.addShippingMethod) {
|
|
134
|
+
await exchangeService.addShippingMethod({
|
|
135
|
+
exchange_id: exchangeId,
|
|
136
|
+
shipping_method_id: outbound_shipping_method_id,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
// Log but don't fail if shipping method addition fails
|
|
142
|
+
// Shipping method can be added manually via admin UI if needed
|
|
143
|
+
console.warn("[Create Medusa Exchange] Failed to add outbound shipping method:", error);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Send notification if requested
|
|
147
|
+
if (send_notification) {
|
|
148
|
+
try {
|
|
149
|
+
// Resolve notification service if available
|
|
150
|
+
const notificationService = container.resolve("notification");
|
|
151
|
+
if (notificationService?.send) {
|
|
152
|
+
const orderId = swapData.order_id;
|
|
153
|
+
// Get order email from remote query if needed
|
|
154
|
+
const remoteQuery = container.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
155
|
+
if (orderId && remoteQuery) {
|
|
156
|
+
try {
|
|
157
|
+
const orderQuery = (0, utils_1.remoteQueryObjectFromString)({
|
|
158
|
+
entryPoint: "order",
|
|
159
|
+
fields: ["id", "email"],
|
|
160
|
+
filters: { id: [orderId] },
|
|
161
|
+
});
|
|
162
|
+
const orders = await remoteQuery(orderQuery);
|
|
163
|
+
const orderArray = Array.isArray(orders) ? orders : orders ? [orders] : [];
|
|
164
|
+
const order = orderArray[0];
|
|
165
|
+
if (order?.email) {
|
|
166
|
+
await notificationService.send({
|
|
167
|
+
to: order.email,
|
|
168
|
+
channel: "email",
|
|
169
|
+
template: "exchange-created",
|
|
170
|
+
data: {
|
|
171
|
+
exchange_id: exchangeId,
|
|
172
|
+
swap_id: swap_id,
|
|
173
|
+
order_id: orderId,
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (notificationError) {
|
|
179
|
+
console.warn("[Create Medusa Exchange] Failed to send notification:", notificationError);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
// Log but don't fail if notification fails
|
|
186
|
+
console.warn("[Create Medusa Exchange] Notification service not available:", error);
|
|
187
|
+
}
|
|
47
188
|
}
|
|
48
|
-
// Update swap with exchange_id
|
|
189
|
+
// Update swap with exchange_id, exchange details, and creation method
|
|
49
190
|
const swapMetadata = swapData.metadata || {};
|
|
50
191
|
const medusaIntegration = swapMetadata.medusa_integration || {};
|
|
51
192
|
const updatedSwap = await swapService.updateSwaps({
|
|
52
193
|
selector: { id: swap_id },
|
|
53
194
|
data: {
|
|
54
195
|
exchange_id: exchangeId,
|
|
196
|
+
outbound_shipping_method_id: outbound_shipping_method_id || null,
|
|
197
|
+
send_notification: send_notification || false,
|
|
55
198
|
metadata: {
|
|
56
199
|
...swapMetadata,
|
|
57
200
|
medusa_integration: {
|
|
58
201
|
...medusaIntegration,
|
|
59
202
|
exchange_id: exchangeId,
|
|
60
203
|
exchange_created_at: new Date().toISOString(),
|
|
204
|
+
exchange_creation_method: creationMethod,
|
|
205
|
+
outbound_shipping_method_id,
|
|
206
|
+
notification_sent: send_notification || false,
|
|
61
207
|
},
|
|
62
208
|
},
|
|
63
209
|
},
|
|
@@ -68,4 +214,4 @@ exports.createMedusaExchangeStep = (0, workflows_sdk_1.createStep)("create-medus
|
|
|
68
214
|
swap: finalSwap || swap,
|
|
69
215
|
});
|
|
70
216
|
});
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW1lZHVzYS1leGNoYW5nZS1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9zd2FwL2NyZWF0ZS1tZWR1c2EtZXhjaGFuZ2Utc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBK0c7QUFDL0cscUVBQTRFO0FBRTVFLGdEQUFtRDtBQWlCdEMsUUFBQSx3QkFBd0IsR0FBRyxJQUFBLDBCQUFVLEVBQ2hELHdCQUF3QixFQUN4QixLQUFLLEVBQ0gsS0FBb0MsRUFDcEMsRUFBRSxTQUFTLEVBQUUsRUFDMEMsRUFBRTtJQUN6RCxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSwyQkFBMkIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRTlHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHFCQUFxQixDQUN0QixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDBDQUEwQyxDQUMzQyxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQWMsa0JBQVcsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwRCxNQUFNLFFBQVEsR0FBRyxJQUlOLENBQUE7SUFFWCxJQUFLLFFBQXFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkQsMkJBQTJCO1FBQzNCLE9BQU8sSUFBSSw0QkFBWSxDQUFpQztZQUN0RCxXQUFXLEVBQUcsUUFBcUMs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
|
|
@@ -6,7 +6,7 @@ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
|
6
6
|
const utils_2 = require("@medusajs/framework/utils");
|
|
7
7
|
const swap_1 = require("../../../modules/swap");
|
|
8
8
|
exports.createMedusaReturnStep = (0, workflows_sdk_1.createStep)("create-medusa-return", async (input, { container }) => {
|
|
9
|
-
const { swap_id } = input;
|
|
9
|
+
const { swap_id, return_location_id, return_shipping_method_id, return_items: inputReturnItems } = input;
|
|
10
10
|
if (!swap_id) {
|
|
11
11
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "swap_id is required");
|
|
12
12
|
}
|
|
@@ -23,10 +23,49 @@ exports.createMedusaReturnStep = (0, workflows_sdk_1.createStep)("create-medusa-
|
|
|
23
23
|
swap,
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
if
|
|
27
|
-
|
|
26
|
+
// Allow creating return if status is "approved" OR "requested" with pending_exchange_creation flag
|
|
27
|
+
const swapMetadata = swapData.metadata || {};
|
|
28
|
+
const pendingExchangeCreation = swapMetadata.pending_exchange_creation === true;
|
|
29
|
+
if (swapData.status !== "approved" && !(swapData.status === "requested" && pendingExchangeCreation)) {
|
|
30
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Swap must be approved or pending exchange creation before creating Medusa return. Current status: ${swapData.status}`);
|
|
31
|
+
}
|
|
32
|
+
// Use return_items from input if provided, otherwise parse from swap model
|
|
33
|
+
let returnItems = [];
|
|
34
|
+
if (inputReturnItems && inputReturnItems.length > 0) {
|
|
35
|
+
// Use items from input (from exchange form)
|
|
36
|
+
returnItems = inputReturnItems.map((item) => ({
|
|
37
|
+
id: item.item_id,
|
|
38
|
+
quantity: item.quantity,
|
|
39
|
+
reason: item.reason_id,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// Parse return_items from JSONB format in swap model
|
|
44
|
+
if (swapData.return_items) {
|
|
45
|
+
if (Array.isArray(swapData.return_items)) {
|
|
46
|
+
returnItems = swapData.return_items.map((item) => ({
|
|
47
|
+
id: String(item.id || item.item_id || ""),
|
|
48
|
+
quantity: Number(item.quantity || 0),
|
|
49
|
+
reason: item.reason,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
else if (typeof swapData.return_items === "string") {
|
|
53
|
+
try {
|
|
54
|
+
const parsed = JSON.parse(swapData.return_items);
|
|
55
|
+
if (Array.isArray(parsed)) {
|
|
56
|
+
returnItems = parsed.map((item) => ({
|
|
57
|
+
id: String(item.id || item.item_id || ""),
|
|
58
|
+
quantity: Number(item.quantity || 0),
|
|
59
|
+
reason: item.reason,
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Invalid JSON, will throw error below
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
28
68
|
}
|
|
29
|
-
const returnItems = swapData.return_items || [];
|
|
30
69
|
if (returnItems.length === 0) {
|
|
31
70
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Swap must have return items");
|
|
32
71
|
}
|
|
@@ -38,16 +77,38 @@ exports.createMedusaReturnStep = (0, workflows_sdk_1.createStep)("create-medusa-
|
|
|
38
77
|
// Create return using Medusa's Order Module
|
|
39
78
|
let returnId;
|
|
40
79
|
if (orderService.createReturn) {
|
|
80
|
+
// Map SwapItem format (id) to Medusa return format (item_id)
|
|
41
81
|
const returnItemsForMedusa = returnItems.map((item) => ({
|
|
42
|
-
item_id: item.
|
|
82
|
+
item_id: item.id,
|
|
43
83
|
quantity: item.quantity,
|
|
44
|
-
reason_id: item.reason_id
|
|
84
|
+
reason_id: item.reason, // Assuming reason is the reason_id
|
|
45
85
|
}));
|
|
46
86
|
const medusaReturn = await orderService.createReturn({
|
|
47
87
|
order_id: swapData.order_id,
|
|
48
88
|
items: returnItemsForMedusa,
|
|
89
|
+
location_id: return_location_id,
|
|
49
90
|
});
|
|
50
91
|
returnId = medusaReturn.id;
|
|
92
|
+
// Add return shipping method if provided
|
|
93
|
+
// Note: This may need to be done via Medusa's return API after creation
|
|
94
|
+
// depending on Medusa v2 API structure
|
|
95
|
+
if (return_shipping_method_id) {
|
|
96
|
+
// Try to resolve return service to add shipping method
|
|
97
|
+
try {
|
|
98
|
+
const returnService = container.resolve("return");
|
|
99
|
+
if (returnService?.addShippingMethod) {
|
|
100
|
+
await returnService.addShippingMethod({
|
|
101
|
+
return_id: returnId,
|
|
102
|
+
shipping_method_id: return_shipping_method_id,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
// Log but don't fail if shipping method addition fails
|
|
108
|
+
// Shipping method can be added manually via admin UI if needed
|
|
109
|
+
console.warn("[Create Medusa Return] Failed to add return shipping method:", error);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
51
112
|
}
|
|
52
113
|
else {
|
|
53
114
|
// Fallback: Use remote query to create return via API
|
|
@@ -57,15 +118,22 @@ exports.createMedusaReturnStep = (0, workflows_sdk_1.createStep)("create-medusa-
|
|
|
57
118
|
// In production, you'd use Medusa's return workflow or API
|
|
58
119
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNKNOWN_MODULES, "Return creation via Order Module is not directly available. Please use Medusa's return workflow.");
|
|
59
120
|
}
|
|
60
|
-
// Update swap with return_id
|
|
121
|
+
// Update swap with return_id and exchange details
|
|
122
|
+
const medusaIntegration = swapMetadata.medusa_integration || {};
|
|
61
123
|
const updatedSwap = await swapService.updateSwaps({
|
|
62
124
|
selector: { id: swap_id },
|
|
63
125
|
data: {
|
|
64
126
|
return_id: returnId,
|
|
127
|
+
return_location_id: return_location_id || null,
|
|
128
|
+
return_shipping_method_id: return_shipping_method_id || null,
|
|
65
129
|
metadata: {
|
|
130
|
+
...swapMetadata,
|
|
66
131
|
medusa_integration: {
|
|
132
|
+
...medusaIntegration,
|
|
67
133
|
return_id: returnId,
|
|
68
134
|
return_created_at: new Date().toISOString(),
|
|
135
|
+
return_location_id,
|
|
136
|
+
return_shipping_method_id,
|
|
69
137
|
},
|
|
70
138
|
},
|
|
71
139
|
},
|
|
@@ -76,4 +144,4 @@ exports.createMedusaReturnStep = (0, workflows_sdk_1.createStep)("create-medusa-
|
|
|
76
144
|
swap: finalSwap || swap,
|
|
77
145
|
});
|
|
78
146
|
});
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW1lZHVzYS1yZXR1cm4tc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc3dhcC9jcmVhdGUtbWVkdXNhLXJldHVybi1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF1RDtBQUN2RCxxRUFBNEU7QUFDNUUscURBQWtHO0FBRWxHLGdEQUFtRDtBQWdCdEMsUUFBQSxzQkFBc0IsR0FBRyxJQUFBLDBCQUFVLEVBQzlDLHNCQUFzQixFQUN0QixLQUFLLEVBQ0gsS0FBa0MsRUFDbEMsRUFBRSxTQUFTLEVBQUUsRUFDd0MsRUFBRTtJQUN2RCxNQUFNLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUV4RyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxQkFBcUIsQ0FDdEIsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFjLGtCQUFXLENBQUMsQ0FBQTtJQUMvRCxNQUFNLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFLaEIsQ0FBQTtJQUVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsNEJBQTRCLENBQzdCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkIseUJBQXlCO1FBQ3pCLE9BQU8sSUFBSSw0QkFBWSxDQUErQjtZQUNwRCxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7WUFDN0IsSUFBSTtTQUNMLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxtR0FBbUc7SUFDbkcsTUFBTSxZQUFZLEdBQUksUUFBbUQsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFBO0lBQ3hGLE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDLHlCQUF5QixLQUFLLElBQUksQ0FBQTtJQUUvRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssVUFBVSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7UUFDcEcsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIscUdBQXFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FDdkgsQ0FBQTtJQUNILENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsSUFBSSxXQUFXLEdBQTZELEVBQUUsQ0FBQTtJQUU5RSxJQUFJLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwRCw0Q0FBNEM7UUFDNUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUztTQUN2QixDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7U0FBTSxDQUFDO1FBQ04scURBQXFEO1FBQ3JELElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMxRCxFQUFFLEVBQUUsTUFBTSxDQUFFLElBQTBDLENBQUMsRUFBRSxJQUFLLElBQTBDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztvQkFDdkgsUUFBUSxFQUFFLE1BQU0sQ0FBRSxJQUE4QixDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7b0JBQy9ELE1BQU0sRUFBRyxJQUE0QixDQUFDLE1BQU07aUJBQzdDLENBQUMsQ0FBQyxDQUFBO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLE9BQU8sUUFBUSxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO29CQUNoRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDMUIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQzNDLEVBQUUsRUFBRSxNQUFNLENBQUUsSUFBMEMsQ0FBQyxFQUFFLElBQUssSUFBMEMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDOzRCQUN2SCxRQUFRLEVBQUUsTUFBTSxDQUFFLElBQThCLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQzs0QkFDL0QsTUFBTSxFQUFHLElBQTRCLENBQUMsTUFBTTt5QkFDN0MsQ0FBQyxDQUFDLENBQUE7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCx1Q0FBdUM7Z0JBQ3pDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsNkJBQTZCLENBQzlCLENBQUE7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBT25DLE9BQU8sQ0FBQyxDQUFBO0lBRVgsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLGdDQUFnQyxDQUNqQyxDQUFBO0lBQ0gsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxJQUFJLFFBQWdCLENBQUE7SUFFcEIsSUFBSSxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDOUIsNkRBQTZEO1FBQzdELE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLG1DQUFtQztTQUM1RCxDQUFDLENBQUMsQ0FBQTtRQUVILE1BQU0sWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLFlBQVksQ0FBQztZQUNuRCxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsS0FBSyxFQUFFLG9CQUFvQjtZQUMzQixXQUFXLEVBQUUsa0JBQWtCO1NBQ2hDLENBQUMsQ0FBQTtRQUVGLFFBQVEsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFBO1FBRTFCLHlDQUF5QztRQUN6Qyx3RUFBd0U7UUFDeEUsdUNBQXVDO1FBQ3ZDLElBQUkseUJBQXlCLEVBQUUsQ0FBQztZQUM5Qix1REFBdUQ7WUFDdkQsSUFBSSxDQUFDO2dCQUNILE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBS3BDLFFBQVEsQ0FBQyxDQUFBO2dCQUVaLElBQUksYUFBYSxFQUFFLGlCQUFpQixFQUFFLENBQUM7b0JBQ3JDLE1BQU0sYUFBYSxDQUFDLGlCQUFpQixDQUFDO3dCQUNwQyxTQUFTLEVBQUUsUUFBUTt3QkFDbkIsa0JBQWtCLEVBQUUseUJBQXlCO3FCQUM5QyxDQUFDLENBQUE7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLHVEQUF1RDtnQkFDdkQsK0RBQStEO2dCQUMvRCxPQUFPLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQ3JGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixzREFBc0Q7UUFDdEQsaUVBQWlFO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ25DLGlDQUF5QixDQUFDLFlBQVksQ0FDdkMsQ0FBQTtRQUVELDRDQUE0QztRQUM1QywyREFBMkQ7UUFDM0QsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFDakMsa0dBQWtHLENBQ25HLENBQUE7SUFDSCxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELE1BQU0saUJBQWlCLEdBQUksWUFBWSxDQUFDLGtCQUE4QyxJQUFJLEVBQUUsQ0FBQTtJQUU1RixNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDaEQsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTtRQUN6QixJQUFJLEVBQUU7WUFDSixTQUFTLEVBQUUsUUFBUTtZQUNuQixrQkFBa0IsRUFBRSxrQkFBa0IsSUFBSSxJQUFJO1lBQzlDLHlCQUF5QixFQUFFLHlCQUF5QixJQUFJLElBQUk7WUFDNUQsUUFBUSxFQUFFO2dCQUNSLEdBQUcsWUFBWTtnQkFDZixrQkFBa0IsRUFBRTtvQkFDbEIsR0FBRyxpQkFBaUI7b0JBQ3BCLFNBQVMsRUFBRSxRQUFRO29CQUNuQixpQkFBaUIsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtvQkFDM0Msa0JBQWtCO29CQUNsQix5QkFBeUI7aUJBQzFCO2FBQ0Y7U0FDRjtLQUNGLENBQUMsQ0FBQTtJQUVGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO0lBRTNFLE9BQU8sSUFBSSw0QkFBWSxDQUErQjtRQUNwRCxTQUFTLEVBQUUsUUFBUTtRQUNuQixJQUFJLEVBQUUsU0FBUyxJQUFJLElBQUk7S0FDeEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUEifQ==
|
|
@@ -4,26 +4,21 @@ exports.createSwapStep = void 0;
|
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
5
|
const swap_1 = require("../../../modules/swap");
|
|
6
6
|
exports.createSwapStep = (0, workflows_sdk_1.createStep)("create-swap", async (input, { container }) => {
|
|
7
|
-
const { order_id, return_items, new_items, difference_due, reason, note } = input;
|
|
7
|
+
const { order_id, customer_id, return_items, new_items, difference_due, reason, note } = input;
|
|
8
8
|
const swapService = container.resolve(swap_1.SWAP_MODULE);
|
|
9
|
+
// Create swap atomically with difference_due and customer_id included
|
|
10
|
+
// This ensures consistency - swap is created with correct difference_due and customer_id in single operation
|
|
9
11
|
const swap = await swapService.createSwap({
|
|
10
12
|
order_id,
|
|
13
|
+
customer_id,
|
|
11
14
|
return_items,
|
|
12
15
|
new_items,
|
|
16
|
+
difference_due, // Include difference_due during creation
|
|
13
17
|
reason,
|
|
14
18
|
note,
|
|
15
19
|
});
|
|
16
|
-
// Update difference_due after creation
|
|
17
|
-
const swapData = swap;
|
|
18
|
-
await swapService.updateSwaps({
|
|
19
|
-
selector: { id: swapData.id },
|
|
20
|
-
data: {
|
|
21
|
-
difference_due,
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
const updatedSwap = await swapService.retrieveSwap(swapData.id);
|
|
25
20
|
return new workflows_sdk_1.StepResponse({
|
|
26
|
-
swap
|
|
21
|
+
swap,
|
|
27
22
|
});
|
|
28
23
|
});
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXN3YXAtc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc3dhcC9jcmVhdGUtc3dhcC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFFQUE0RTtBQUM1RSxnREFBbUQ7QUFtQnRDLFFBQUEsY0FBYyxHQUFHLElBQUEsMEJBQVUsRUFDdEMsYUFBYSxFQUNiLEtBQUssRUFDSCxLQUEwQixFQUMxQixFQUFFLFNBQVMsRUFBRSxFQUNnQyxFQUFFO0lBQy9DLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFOUYsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBYyxrQkFBVyxDQUFDLENBQUE7SUFFL0Qsc0VBQXNFO0lBQ3RFLDZHQUE2RztJQUM3RyxNQUFNLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDeEMsUUFBUTtRQUNSLFdBQVc7UUFDWCxZQUFZO1FBQ1osU0FBUztRQUNULGNBQWMsRUFBRSx5Q0FBeUM7UUFDekQsTUFBTTtRQUNOLElBQUk7S0FDTCxDQUFDLENBQUE7SUFFRixPQUFPLElBQUksNEJBQVksQ0FBdUI7UUFDNUMsSUFBSTtLQUNMLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBIn0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.updateSwapExchangeDetailsStep = exports.rollbackReturnStep = exports.syncMedusaStatusStep = exports.createMedusaExchangeStep = exports.createMedusaReturnStep = exports.validateEligibilityStep = exports.updateSwapStatusStep = exports.retrieveSwapStep = exports.createSwapStep = exports.calculateDifferenceStep = exports.validateSwapItemsStep = exports.validateOrderStep = void 0;
|
|
4
4
|
var validate_order_step_1 = require("./validate-order-step");
|
|
5
5
|
Object.defineProperty(exports, "validateOrderStep", { enumerable: true, get: function () { return validate_order_step_1.validateOrderStep; } });
|
|
6
6
|
var validate_swap_items_step_1 = require("./validate-swap-items-step");
|
|
@@ -19,8 +19,10 @@ var create_medusa_return_step_1 = require("./create-medusa-return-step");
|
|
|
19
19
|
Object.defineProperty(exports, "createMedusaReturnStep", { enumerable: true, get: function () { return create_medusa_return_step_1.createMedusaReturnStep; } });
|
|
20
20
|
var create_medusa_exchange_step_1 = require("./create-medusa-exchange-step");
|
|
21
21
|
Object.defineProperty(exports, "createMedusaExchangeStep", { enumerable: true, get: function () { return create_medusa_exchange_step_1.createMedusaExchangeStep; } });
|
|
22
|
-
var handle_payment_difference_step_1 = require("./handle-payment-difference-step");
|
|
23
|
-
Object.defineProperty(exports, "handlePaymentDifferenceStep", { enumerable: true, get: function () { return handle_payment_difference_step_1.handlePaymentDifferenceStep; } });
|
|
24
22
|
var sync_medusa_status_step_1 = require("./sync-medusa-status-step");
|
|
25
23
|
Object.defineProperty(exports, "syncMedusaStatusStep", { enumerable: true, get: function () { return sync_medusa_status_step_1.syncMedusaStatusStep; } });
|
|
26
|
-
|
|
24
|
+
var rollback_return_step_1 = require("./rollback-return-step");
|
|
25
|
+
Object.defineProperty(exports, "rollbackReturnStep", { enumerable: true, get: function () { return rollback_return_step_1.rollbackReturnStep; } });
|
|
26
|
+
var update_swap_exchange_details_step_1 = require("./update-swap-exchange-details-step");
|
|
27
|
+
Object.defineProperty(exports, "updateSwapExchangeDetailsStep", { enumerable: true, get: function () { return update_swap_exchange_details_step_1.updateSwapExchangeDetailsStep; } });
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3N3YXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkRBQXlEO0FBQWhELHdIQUFBLGlCQUFpQixPQUFBO0FBRzFCLHVFQUFrRTtBQUF6RCxpSUFBQSxxQkFBcUIsT0FBQTtBQUc5Qix5RUFBcUU7QUFBNUQsb0lBQUEsdUJBQXVCLE9BQUE7QUFHaEMsdURBQW1EO0FBQTFDLGtIQUFBLGNBQWMsT0FBQTtBQUd2QiwyREFBdUQ7QUFBOUMsc0hBQUEsZ0JBQWdCLE9BQUE7QUFHekIscUVBQWdFO0FBQXZELCtIQUFBLG9CQUFvQixPQUFBO0FBRzdCLHlFQUFxRTtBQUE1RCxvSUFBQSx1QkFBdUIsT0FBQTtBQUdoQyx5RUFBb0U7QUFBM0QsbUlBQUEsc0JBQXNCLE9BQUE7QUFHL0IsNkVBQXdFO0FBQS9ELHVJQUFBLHdCQUF3QixPQUFBO0FBR2pDLHFFQUFnRTtBQUF2RCwrSEFBQSxvQkFBb0IsT0FBQTtBQUc3QiwrREFBMkQ7QUFBbEQsMEhBQUEsa0JBQWtCLE9BQUE7QUFHM0IseUZBQW1GO0FBQTFFLGtKQUFBLDZCQUE2QixPQUFBIn0=
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rollbackReturnStep = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const swap_1 = require("../../../modules/swap");
|
|
7
|
+
/**
|
|
8
|
+
* Rollback step to clean up orphaned return if exchange creation fails
|
|
9
|
+
* This step removes the return_id from swap and logs the rollback reason
|
|
10
|
+
* Note: We don't delete the Medusa return itself as it may have dependencies
|
|
11
|
+
* The return will remain in Medusa but won't be linked to the swap
|
|
12
|
+
*/
|
|
13
|
+
exports.rollbackReturnStep = (0, workflows_sdk_1.createStep)("rollback-return", async (input, { container }) => {
|
|
14
|
+
const { swap_id, return_id, reason } = input;
|
|
15
|
+
if (!swap_id) {
|
|
16
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "swap_id is required for rollback");
|
|
17
|
+
}
|
|
18
|
+
if (!return_id) {
|
|
19
|
+
// No return to rollback
|
|
20
|
+
return new workflows_sdk_1.StepResponse({
|
|
21
|
+
success: true,
|
|
22
|
+
swap: null,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const swapService = container.resolve(swap_1.SWAP_MODULE);
|
|
26
|
+
const swap = await swapService.retrieveSwap(swap_id);
|
|
27
|
+
const swapData = swap;
|
|
28
|
+
// Only rollback if return_id matches
|
|
29
|
+
if (swapData.return_id !== return_id) {
|
|
30
|
+
// Return already changed or doesn't match
|
|
31
|
+
return new workflows_sdk_1.StepResponse({
|
|
32
|
+
success: false,
|
|
33
|
+
swap,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const swapMetadata = swapData.metadata || {};
|
|
37
|
+
const medusaIntegration = swapMetadata.medusa_integration || {};
|
|
38
|
+
const rollbackHistory = swapMetadata.rollback_history || [];
|
|
39
|
+
// Remove return_id from swap and log rollback
|
|
40
|
+
const updatedSwap = await swapService.updateSwaps({
|
|
41
|
+
selector: { id: swap_id },
|
|
42
|
+
data: {
|
|
43
|
+
return_id: null,
|
|
44
|
+
metadata: {
|
|
45
|
+
...swapMetadata,
|
|
46
|
+
medusa_integration: {
|
|
47
|
+
...medusaIntegration,
|
|
48
|
+
return_id: null,
|
|
49
|
+
return_rollback_at: new Date().toISOString(),
|
|
50
|
+
return_rollback_reason: reason,
|
|
51
|
+
},
|
|
52
|
+
rollback_history: [
|
|
53
|
+
...rollbackHistory,
|
|
54
|
+
{
|
|
55
|
+
action: "rollback_return",
|
|
56
|
+
return_id,
|
|
57
|
+
reason,
|
|
58
|
+
timestamp: new Date().toISOString(),
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
const finalSwap = Array.isArray(updatedSwap) ? updatedSwap[0] : updatedSwap;
|
|
65
|
+
return new workflows_sdk_1.StepResponse({
|
|
66
|
+
success: true,
|
|
67
|
+
swap: finalSwap || swap,
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbGJhY2stcmV0dXJuLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3N3YXAvcm9sbGJhY2stcmV0dXJuLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXVEO0FBQ3ZELHFFQUE0RTtBQUM1RSxnREFBbUQ7QUFjbkQ7Ozs7O0dBS0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHLElBQUEsMEJBQVUsRUFDMUMsaUJBQWlCLEVBQ2pCLEtBQUssRUFDSCxLQUE4QixFQUM5QixFQUFFLFNBQVMsRUFBRSxFQUNvQyxFQUFFO0lBQ25ELE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUU1QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixrQ0FBa0MsQ0FDbkMsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZix3QkFBd0I7UUFDeEIsT0FBTyxJQUFJLDRCQUFZLENBQTJCO1lBQ2hELE9BQU8sRUFBRSxJQUFJO1lBQ2IsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBYyxrQkFBVyxDQUFDLENBQUE7SUFDL0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3BELE1BQU0sUUFBUSxHQUFHLElBR2hCLENBQUE7SUFFRCxxQ0FBcUM7SUFDckMsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLDBDQUEwQztRQUMxQyxPQUFPLElBQUksNEJBQVksQ0FBMkI7WUFDaEQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJO1NBQ0wsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFBO0lBQzVDLE1BQU0saUJBQWlCLEdBQUksWUFBWSxDQUFDLGtCQUE4QyxJQUFJLEVBQUUsQ0FBQTtJQUM1RixNQUFNLGVBQWUsR0FBSSxZQUFZLENBQUMsZ0JBQW1ELElBQUksRUFBRSxDQUFBO0lBRS9GLDhDQUE4QztJQUM5QyxNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDaEQsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTtRQUN6QixJQUFJLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRTtnQkFDUixHQUFHLFlBQVk7Z0JBQ2Ysa0JBQWtCLEVBQUU7b0JBQ2xCLEdBQUcsaUJBQWlCO29CQUNwQixTQUFTLEVBQUUsSUFBSTtvQkFDZixrQkFBa0IsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtvQkFDNUMsc0JBQXNCLEVBQUUsTUFBTTtpQkFDL0I7Z0JBQ0QsZ0JBQWdCLEVBQUU7b0JBQ2hCLEdBQUcsZUFBZTtvQkFDbEI7d0JBQ0UsTUFBTSxFQUFFLGlCQUFpQjt3QkFDekIsU0FBUzt3QkFDVCxNQUFNO3dCQUNOLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtxQkFDcEM7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUE7SUFFM0UsT0FBTyxJQUFJLDRCQUFZLENBQTJCO1FBQ2hELE9BQU8sRUFBRSxJQUFJO1FBQ2IsSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJO0tBQ3hCLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBIn0=
|