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
|
@@ -20,6 +20,10 @@ exports.syncMedusaStatusStep = (0, workflows_sdk_1.createStep)("sync-medusa-stat
|
|
|
20
20
|
status_synced: false,
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
+
// Check if exchange was created via workflow (preferred) or service call
|
|
24
|
+
const swapMetadata = swapData.metadata || {};
|
|
25
|
+
const medusaIntegration = swapMetadata.medusa_integration || {};
|
|
26
|
+
const creationMethod = medusaIntegration.exchange_creation_method;
|
|
23
27
|
const remoteQuery = container.resolve(utils_2.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
24
28
|
let medusaStatus;
|
|
25
29
|
let updatedStatus;
|
|
@@ -55,13 +59,24 @@ exports.syncMedusaStatusStep = (0, workflows_sdk_1.createStep)("sync-medusa-stat
|
|
|
55
59
|
cancelled: "cancelled",
|
|
56
60
|
};
|
|
57
61
|
updatedStatus = statusMap[medusaStatus || ""];
|
|
62
|
+
if (!updatedStatus && medusaStatus) {
|
|
63
|
+
// Unknown exchange status - log for debugging
|
|
64
|
+
console.debug(`[Sync Medusa Status] Unknown exchange status "${medusaStatus}" for exchange ${swapData.exchange_id}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Exchange not found - might have been deleted or ID is invalid
|
|
69
|
+
console.warn(`[Sync Medusa Status] Exchange ${swapData.exchange_id} not found in Medusa`);
|
|
58
70
|
}
|
|
59
71
|
}
|
|
60
72
|
catch (error) {
|
|
73
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
74
|
+
console.error(`[Sync Medusa Status] Failed to query exchange ${swapData.exchange_id}:`, errorMessage);
|
|
61
75
|
// If exchange query fails, continue with return status
|
|
62
76
|
}
|
|
63
77
|
}
|
|
64
78
|
// Query Medusa return status if return_id exists and exchange status not found
|
|
79
|
+
// This provides fallback status tracking when exchange status is not available
|
|
65
80
|
if (!medusaStatus && swapData.return_id) {
|
|
66
81
|
try {
|
|
67
82
|
const returnQuery = (0, utils_2.remoteQueryObjectFromString)({
|
|
@@ -88,17 +103,26 @@ exports.syncMedusaStatusStep = (0, workflows_sdk_1.createStep)("sync-medusa-stat
|
|
|
88
103
|
};
|
|
89
104
|
if (!updatedStatus) {
|
|
90
105
|
updatedStatus = statusMap[medusaStatus || ""];
|
|
106
|
+
if (!updatedStatus && medusaStatus) {
|
|
107
|
+
// Unknown return status - log for debugging
|
|
108
|
+
console.debug(`[Sync Medusa Status] Unknown return status "${medusaStatus}" for return ${swapData.return_id}`);
|
|
109
|
+
}
|
|
91
110
|
}
|
|
92
111
|
}
|
|
112
|
+
else {
|
|
113
|
+
// Return not found - might have been deleted or ID is invalid
|
|
114
|
+
console.warn(`[Sync Medusa Status] Return ${swapData.return_id} not found in Medusa`);
|
|
115
|
+
}
|
|
93
116
|
}
|
|
94
117
|
catch (error) {
|
|
118
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
119
|
+
console.error(`[Sync Medusa Status] Failed to query return ${swapData.return_id}:`, errorMessage);
|
|
95
120
|
// If return query fails, cannot sync
|
|
96
121
|
}
|
|
97
122
|
}
|
|
98
123
|
// Update swap status if it differs from Medusa status
|
|
99
124
|
let statusSynced = false;
|
|
100
125
|
if (updatedStatus && updatedStatus !== swapData.status) {
|
|
101
|
-
const swapMetadata = swapData.metadata || {};
|
|
102
126
|
const statusHistory = swapMetadata.status_history || [];
|
|
103
127
|
await swapService.updateSwaps({
|
|
104
128
|
selector: { id: swap_id },
|
|
@@ -106,6 +130,12 @@ exports.syncMedusaStatusStep = (0, workflows_sdk_1.createStep)("sync-medusa-stat
|
|
|
106
130
|
status: updatedStatus,
|
|
107
131
|
metadata: {
|
|
108
132
|
...swapMetadata,
|
|
133
|
+
medusa_integration: {
|
|
134
|
+
...medusaIntegration,
|
|
135
|
+
last_synced_at: new Date().toISOString(),
|
|
136
|
+
last_synced_status: medusaStatus,
|
|
137
|
+
creation_method: creationMethod || "unknown",
|
|
138
|
+
},
|
|
109
139
|
status_history: [
|
|
110
140
|
...statusHistory,
|
|
111
141
|
{
|
|
@@ -113,14 +143,30 @@ exports.syncMedusaStatusStep = (0, workflows_sdk_1.createStep)("sync-medusa-stat
|
|
|
113
143
|
timestamp: new Date().toISOString(),
|
|
114
144
|
synced_from_medusa: true,
|
|
115
145
|
medusa_status: medusaStatus,
|
|
146
|
+
sync_method: "manual", // This is manual sync, subscribers handle automatic sync
|
|
116
147
|
},
|
|
117
148
|
],
|
|
118
|
-
last_synced_at: new Date().toISOString(),
|
|
119
149
|
},
|
|
120
150
|
},
|
|
121
151
|
});
|
|
122
152
|
statusSynced = true;
|
|
123
153
|
}
|
|
154
|
+
else if (updatedStatus && updatedStatus === swapData.status) {
|
|
155
|
+
// Status already matches, but update last_synced_at timestamp
|
|
156
|
+
await swapService.updateSwaps({
|
|
157
|
+
selector: { id: swap_id },
|
|
158
|
+
data: {
|
|
159
|
+
metadata: {
|
|
160
|
+
...swapMetadata,
|
|
161
|
+
medusa_integration: {
|
|
162
|
+
...medusaIntegration,
|
|
163
|
+
last_synced_at: new Date().toISOString(),
|
|
164
|
+
last_synced_status: medusaStatus,
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
124
170
|
// Retrieve the latest swap data after update
|
|
125
171
|
const finalSwap = await swapService.retrieveSwap(swap_id);
|
|
126
172
|
return new workflows_sdk_1.StepResponse({
|
|
@@ -129,4 +175,4 @@ exports.syncMedusaStatusStep = (0, workflows_sdk_1.createStep)("sync-medusa-stat
|
|
|
129
175
|
medusa_status: medusaStatus,
|
|
130
176
|
});
|
|
131
177
|
});
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1tZWR1c2Etc3RhdHVzLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3N3YXAvc3luYy1tZWR1c2Etc3RhdHVzLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXVEO0FBQ3ZELHFFQUE0RTtBQUM1RSxxREFBa0c7QUFFbEcsZ0RBQW1EO0FBYXRDLFFBQUEsb0JBQW9CLEdBQUcsSUFBQSwwQkFBVSxFQUM1QyxvQkFBb0IsRUFDcEIsS0FBSyxFQUNILEtBQWdDLEVBQ2hDLEVBQUUsU0FBUyxFQUFFLEVBQ3NDLEVBQUU7SUFDckQsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUV6QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxQkFBcUIsQ0FDdEIsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFjLGtCQUFXLENBQUMsQ0FBQTtJQUMvRCxNQUFNLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFLaEIsQ0FBQTtJQUVELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pELDZDQUE2QztRQUM3QyxPQUFPLElBQUksNEJBQVksQ0FBNkI7WUFDbEQsSUFBSTtZQUNKLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUE7SUFDNUMsTUFBTSxpQkFBaUIsR0FBSSxZQUFZLENBQUMsa0JBQThD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
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.updateSwapExchangeDetailsStep = 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
|
+
exports.updateSwapExchangeDetailsStep = (0, workflows_sdk_1.createStep)("update-swap-exchange-details", async (input, { container }) => {
|
|
8
|
+
const { swap_id, return_location_id, return_shipping_method_id, outbound_shipping_method_id, send_notification, } = input;
|
|
9
|
+
if (!swap_id) {
|
|
10
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "swap_id is required");
|
|
11
|
+
}
|
|
12
|
+
const swapService = container.resolve(swap_1.SWAP_MODULE);
|
|
13
|
+
await swapService.updateSwaps({
|
|
14
|
+
selector: { id: swap_id },
|
|
15
|
+
data: {
|
|
16
|
+
return_location_id: return_location_id || null,
|
|
17
|
+
return_shipping_method_id: return_shipping_method_id || null,
|
|
18
|
+
outbound_shipping_method_id: outbound_shipping_method_id || null,
|
|
19
|
+
send_notification: send_notification || false,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
const swap = await swapService.retrieveSwap(swap_id);
|
|
23
|
+
return new workflows_sdk_1.StepResponse({
|
|
24
|
+
swap,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXN3YXAtZXhjaGFuZ2UtZGV0YWlscy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9zd2FwL3VwZGF0ZS1zd2FwLWV4Y2hhbmdlLWRldGFpbHMtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFDdkQscUVBQTRFO0FBQzVFLGdEQUFtRDtBQWV0QyxRQUFBLDZCQUE2QixHQUFHLElBQUEsMEJBQVUsRUFDckQsOEJBQThCLEVBQzlCLEtBQUssRUFDSCxLQUF5QyxFQUN6QyxFQUFFLFNBQVMsRUFBRSxFQUMrQyxFQUFFO0lBQzlELE1BQU0sRUFDSixPQUFPLEVBQ1Asa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IsaUJBQWlCLEdBQ2xCLEdBQUcsS0FBSyxDQUFBO0lBRVQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIscUJBQXFCLENBQ3RCLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBYyxrQkFBVyxDQUFDLENBQUE7SUFFL0QsTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDO1FBQzVCLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDekIsSUFBSSxFQUFFO1lBQ0osa0JBQWtCLEVBQUUsa0JBQWtCLElBQUksSUFBSTtZQUM5Qyx5QkFBeUIsRUFBRSx5QkFBeUIsSUFBSSxJQUFJO1lBQzVELDJCQUEyQixFQUFFLDJCQUEyQixJQUFJLElBQUk7WUFDaEUsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksS0FBSztTQUM5QztLQUNGLENBQUMsQ0FBQTtJQUVGLE1BQU0sSUFBSSxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVwRCxPQUFPLElBQUksNEJBQVksQ0FBc0M7UUFDM0QsSUFBSTtLQUNMLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBIn0=
|
|
@@ -5,12 +5,17 @@ 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.validateEligibilityStep = (0, workflows_sdk_1.createStep)("validate-eligibility", async (input, { container }) => {
|
|
8
|
-
const { order, return_items, customer_id } = input;
|
|
8
|
+
const { order, return_items, new_items, customer_id } = input;
|
|
9
9
|
const swapService = container.resolve(swap_1.SWAP_MODULE);
|
|
10
10
|
// Check rate limits
|
|
11
11
|
await swapService.checkRateLimit(customer_id, order.id);
|
|
12
|
-
//
|
|
13
|
-
|
|
12
|
+
// Extract order items for quantity validation
|
|
13
|
+
const orderItems = (order.items || []).map((item) => ({
|
|
14
|
+
id: item.id,
|
|
15
|
+
quantity: item.quantity,
|
|
16
|
+
}));
|
|
17
|
+
// Validate eligibility with enhanced duplicate and quantity checks
|
|
18
|
+
await swapService.validateEligibility(order.id, return_items, new_items, orderItems);
|
|
14
19
|
// Validate item eligibility
|
|
15
20
|
for (const returnItem of return_items) {
|
|
16
21
|
const isEligible = await swapService.validateItemEligibility(returnItem.id);
|
|
@@ -22,4 +27,4 @@ exports.validateEligibilityStep = (0, workflows_sdk_1.createStep)("validate-elig
|
|
|
22
27
|
eligible: true,
|
|
23
28
|
});
|
|
24
29
|
});
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtZWxpZ2liaWxpdHktc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc3dhcC92YWxpZGF0ZS1lbGlnaWJpbGl0eS1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF1RDtBQUN2RCxxRUFBNEU7QUFDNUUsZ0RBQW1EO0FBZ0J0QyxRQUFBLHVCQUF1QixHQUFHLElBQUEsMEJBQVUsRUFDL0Msc0JBQXNCLEVBQ3RCLEtBQUssRUFDSCxLQUFtQyxFQUNuQyxFQUFFLFNBQVMsRUFBRSxFQUN5QyxFQUFFO0lBQ3hELE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFN0QsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBYyxrQkFBVyxDQUFDLENBQUE7SUFFL0Qsb0JBQW9CO0lBQ3BCLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRXZELDhDQUE4QztJQUM5QyxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBc0MsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7UUFDWCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7S0FDeEIsQ0FBQyxDQUFDLENBQUE7SUFFSCxtRUFBbUU7SUFDbkUsTUFBTSxXQUFXLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBRXBGLDRCQUE0QjtJQUM1QixLQUFLLE1BQU0sVUFBVSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3RDLE1BQU0sVUFBVSxHQUFHLE1BQU0sV0FBVyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMzRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsUUFBUSxVQUFVLENBQUMsRUFBRSwrQkFBK0IsQ0FDckQsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQWdDO1FBQ3JELFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUEifQ==
|
|
@@ -23,6 +23,8 @@ exports.validateOrderStep = (0, workflows_sdk_1.createStep)("validate-order", as
|
|
|
23
23
|
"fulfilled_at",
|
|
24
24
|
"created_at",
|
|
25
25
|
"items.*",
|
|
26
|
+
"fulfillments.*",
|
|
27
|
+
"fulfillments.tracking_links.*",
|
|
26
28
|
],
|
|
27
29
|
filters: {
|
|
28
30
|
id: [order_id],
|
|
@@ -49,6 +51,27 @@ exports.validateOrderStep = (0, workflows_sdk_1.createStep)("validate-order", as
|
|
|
49
51
|
if (!orderStatus || !allowedStatuses.includes(orderStatus)) {
|
|
50
52
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Order must be fulfilled or partially fulfilled to create a swap. Current status: ${orderStatus || "unknown"}`);
|
|
51
53
|
}
|
|
54
|
+
// Enhanced validation: Check if order has at least one fulfilled/delivered fulfillment
|
|
55
|
+
// This ensures items have actually been shipped/delivered before allowing exchange
|
|
56
|
+
const fulfillments = orderData.fulfillments || [];
|
|
57
|
+
if (fulfillments.length > 0) {
|
|
58
|
+
const hasDeliveredFulfillment = fulfillments.some((fulfillment) => {
|
|
59
|
+
// Check if fulfillment is delivered, shipped, or fulfilled
|
|
60
|
+
const fulfillmentStatus = fulfillment.status;
|
|
61
|
+
const isDelivered = fulfillment.delivered_at !== null && fulfillment.delivered_at !== undefined;
|
|
62
|
+
const isShipped = fulfillment.shipped_at !== null && fulfillment.shipped_at !== undefined;
|
|
63
|
+
const isFulfilled = fulfillmentStatus === "fulfilled" || fulfillmentStatus === "shipped" || fulfillmentStatus === "delivered";
|
|
64
|
+
const isCanceled = fulfillment.canceled_at !== null && fulfillment.canceled_at !== undefined;
|
|
65
|
+
return !isCanceled && (isDelivered || isShipped || isFulfilled);
|
|
66
|
+
});
|
|
67
|
+
if (!hasDeliveredFulfillment && fulfillments.length > 0) {
|
|
68
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order must have at least one shipped or delivered fulfillment to create a swap. Please wait until your order is shipped.");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (!orderData.fulfilled_at) {
|
|
72
|
+
// If no fulfillments exist and order hasn't been fulfilled, reject
|
|
73
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order must be fulfilled before creating a swap request");
|
|
74
|
+
}
|
|
52
75
|
// Eligibility validation: Check order age (30 days from fulfillment or creation)
|
|
53
76
|
const fulfillmentDate = orderData.fulfilled_at
|
|
54
77
|
? new Date(orderData.fulfilled_at)
|
|
@@ -66,4 +89,4 @@ exports.validateOrderStep = (0, workflows_sdk_1.createStep)("validate-order", as
|
|
|
66
89
|
order: order,
|
|
67
90
|
});
|
|
68
91
|
});
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtb3JkZXItc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc3dhcC92YWxpZGF0ZS1vcmRlci1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF1RDtBQUN2RCxxRUFBNEU7QUFDNUUscURBQWtHO0FBd0JyRixRQUFBLGlCQUFpQixHQUFHLElBQUEsMEJBQVUsRUFDekMsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDSCxLQUE2QixFQUM3QixFQUFFLFNBQVMsRUFBRSxFQUNtQyxFQUFFO0lBQ2xELE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRXZDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHNCQUFzQixDQUN2QixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxQ0FBcUMsQ0FDdEMsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUNuQyxpQ0FBeUIsQ0FBQyxZQUFZLENBQ3ZDLENBQUE7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFBLG1DQUEyQixFQUFDO1FBQzlDLFVBQVUsRUFBRSxPQUFPO1FBQ25CLE1BQU0sRUFBRTtZQUNOLElBQUk7WUFDSixhQUFhO1lBQ2IsT0FBTztZQUNQLFFBQVE7WUFDUixjQUFjO1lBQ2QsWUFBWTtZQUNaLFNBQVM7WUFDVCxnQkFBZ0I7WUFDaEIsK0JBQStCO1NBQ2hDO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ2Y7S0FDRixDQUFDLENB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
|
|
@@ -4,19 +4,37 @@ exports.approveSwapWorkflow = void 0;
|
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
5
|
const swap_1 = require("../steps/swap");
|
|
6
6
|
exports.approveSwapWorkflow = (0, workflows_sdk_1.createWorkflow)("approve-swap", (input) => {
|
|
7
|
-
const { swap_id, admin_id } = input;
|
|
8
|
-
//
|
|
7
|
+
const { swap_id, admin_id, return_location_id, return_shipping_method_id, outbound_shipping_method_id, send_notification, } = input;
|
|
8
|
+
// Store exchange details but keep status as "requested"
|
|
9
|
+
// Status will change to "approved" when exchange is confirmed
|
|
10
|
+
// Store exchange details in metadata for audit trail
|
|
9
11
|
const { swap: approvedSwap } = (0, swap_1.updateSwapStatusStep)({
|
|
10
12
|
swap_id,
|
|
11
|
-
status: "
|
|
13
|
+
status: "requested", // Keep as requested until exchange is confirmed
|
|
12
14
|
metadata: {
|
|
13
15
|
approved_at: new Date().toISOString(),
|
|
14
16
|
approved_by: admin_id,
|
|
17
|
+
pending_exchange_creation: true,
|
|
18
|
+
exchange_details: {
|
|
19
|
+
return_location_id,
|
|
20
|
+
return_shipping_method_id,
|
|
21
|
+
outbound_shipping_method_id,
|
|
22
|
+
send_notification,
|
|
23
|
+
configured_at: new Date().toISOString(),
|
|
24
|
+
},
|
|
15
25
|
},
|
|
16
26
|
});
|
|
27
|
+
// Also store exchange details in model fields directly
|
|
28
|
+
const { swap: swapWithExchangeDetails } = (0, swap_1.updateSwapExchangeDetailsStep)({
|
|
29
|
+
swap_id,
|
|
30
|
+
return_location_id,
|
|
31
|
+
return_shipping_method_id,
|
|
32
|
+
outbound_shipping_method_id,
|
|
33
|
+
send_notification,
|
|
34
|
+
});
|
|
17
35
|
return new workflows_sdk_1.WorkflowResponse({
|
|
18
|
-
swap:
|
|
36
|
+
swap: swapWithExchangeDetails,
|
|
19
37
|
});
|
|
20
38
|
});
|
|
21
39
|
exports.default = exports.approveSwapWorkflow;
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcm92ZS1zd2FwLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zd2Fwcy9hcHByb3ZlLXN3YXAtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBRzBDO0FBQzFDLHdDQUdzQjtBQU1ULFFBQUEsbUJBQW1CLEdBQUcsSUFBQSw4QkFBYyxFQUMvQyxjQUFjLEVBQ2QsQ0FDRSxLQUErQixFQUNjLEVBQUU7SUFDL0MsTUFBTSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1Isa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IsaUJBQWlCLEdBQ2xCLEdBQUcsS0FBSyxDQUFBO0lBRVQsd0RBQXdEO0lBQ3hELDhEQUE4RDtJQUM5RCxxREFBcUQ7SUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFBLDJCQUFvQixFQUFDO1FBQ2xELE9BQU87UUFDUCxNQUFNLEVBQUUsV0FBVyxFQUFFLGdEQUFnRDtRQUNyRSxRQUFRLEVBQUU7WUFDUixXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDckMsV0FBVyxFQUFFLFFBQVE7WUFDckIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQixnQkFBZ0IsRUFBRTtnQkFDaEIsa0JBQWtCO2dCQUNsQix5QkFBeUI7Z0JBQ3pCLDJCQUEyQjtnQkFDM0IsaUJBQWlCO2dCQUNqQixhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDeEM7U0FDRjtLQUNGLENBQUMsQ0FBQTtJQUVGLHVEQUF1RDtJQUN2RCxNQUFNLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsSUFBQSxvQ0FBNkIsRUFBQztRQUN0RSxPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLHlCQUF5QjtRQUN6QiwyQkFBMkI7UUFDM0IsaUJBQWlCO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBNEI7UUFDckQsSUFBSSxFQUFFLHVCQUF1QjtLQUM5QixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLDJCQUFtQixDQUFBIn0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.confirmExchangeWorkflow = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const swap_1 = require("../steps/swap");
|
|
6
|
+
exports.confirmExchangeWorkflow = (0, workflows_sdk_1.createWorkflow)("confirm-exchange", (input) => {
|
|
7
|
+
const { swap_id, admin_id, return_items, new_items, return_location_id, return_shipping_method_id, outbound_shipping_method_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: Create Medusa Return
|
|
13
|
+
// Pass return_items from input (from exchange form)
|
|
14
|
+
const { return_id, swap: swapWithReturn } = (0, swap_1.createMedusaReturnStep)({
|
|
15
|
+
swap_id,
|
|
16
|
+
return_location_id,
|
|
17
|
+
return_shipping_method_id,
|
|
18
|
+
return_items: return_items,
|
|
19
|
+
});
|
|
20
|
+
// Step 3: Create Medusa Exchange linked to return
|
|
21
|
+
// Pass new_items from input (from exchange form)
|
|
22
|
+
// This will trigger Medusa's native exchange workflow which handles:
|
|
23
|
+
// - Fulfillment creation for new items
|
|
24
|
+
// - Payment Collection creation if difference_due > 0 (customer owes)
|
|
25
|
+
// - Refund processing if difference_due < 0 (customer gets refund)
|
|
26
|
+
// - Status transitions (requested → received → shipped → delivered)
|
|
27
|
+
const { exchange_id, swap: swapWithExchange } = (0, swap_1.createMedusaExchangeStep)({
|
|
28
|
+
swap_id,
|
|
29
|
+
return_id,
|
|
30
|
+
outbound_shipping_method_id,
|
|
31
|
+
send_notification,
|
|
32
|
+
new_items: new_items,
|
|
33
|
+
});
|
|
34
|
+
// Step 4: Update swap status to "approved" after successful exchange creation
|
|
35
|
+
const { swap: finalSwap } = (0, swap_1.updateSwapStatusStep)({
|
|
36
|
+
swap_id,
|
|
37
|
+
status: "approved",
|
|
38
|
+
metadata: {
|
|
39
|
+
exchange_confirmed_at: new Date().toISOString(),
|
|
40
|
+
exchange_confirmed_by: admin_id,
|
|
41
|
+
pending_exchange_creation: false,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
return new workflows_sdk_1.WorkflowResponse({
|
|
45
|
+
swap: finalSwap,
|
|
46
|
+
return_id,
|
|
47
|
+
exchange_id,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
exports.default = exports.confirmExchangeWorkflow;
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1leGNoYW5nZS13b3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3dhcHMvY29uZmlybS1leGNoYW5nZS13b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFHMEM7QUFDMUMsd0NBS3NCO0FBTVQsUUFBQSx1QkFBdUIsR0FBRyxJQUFBLDhCQUFjLEVBQ25ELGtCQUFrQixFQUNsQixDQUNFLEtBQW1DLEVBQ2MsRUFBRTtJQUNuRCxNQUFNLEVBQ0osT0FBTyxFQUNQLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULGtCQUFrQixFQUNsQix5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLGlCQUFpQixHQUNsQixHQUFHLEtBQUssQ0FBQTtJQUVULDZEQUE2RDtJQUM3RCxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUEsdUJBQWdCLEVBQUM7UUFDL0MsT0FBTztLQUNSLENBQUMsQ0FBQTtJQUVGLCtCQUErQjtJQUMvQixvREFBb0Q7SUFDcEQsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBQSw2QkFBc0IsRUFBQztRQUNqRSxPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLHlCQUF5QjtRQUN6QixZQUFZLEVBQUUsWUFBWTtLQUMzQixDQUFDLENBQUE7SUFFRixrREFBa0Q7SUFDbEQsaURBQWlEO0lBQ2pELHFFQUFxRTtJQUNyRSx1Q0FBdUM7SUFDdkMsc0VBQXNFO0lBQ3RFLG1FQUFtRTtJQUNuRSxvRUFBb0U7SUFDcEUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxJQUFBLCtCQUF3QixFQUFDO1FBQ3ZFLE9BQU87UUFDUCxTQUFTO1FBQ1QsMkJBQTJCO1FBQzNCLGlCQUFpQjtRQUNqQixTQUFTLEVBQUUsU0FBUztLQUNyQixDQUFDLENBQUE7SUFFRiw4RUFBOEU7SUFDOUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFBLDJCQUFvQixFQUFDO1FBQy9DLE9BQU87UUFDUCxNQUFNLEVBQUUsVUFBVTtRQUNsQixRQUFRLEVBQUU7WUFDUixxQkFBcUIsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUMvQyxxQkFBcUIsRUFBRSxRQUFRO1lBQy9CLHlCQUF5QixFQUFFLEtBQUs7U0FDakM7S0FDRixDQUFDLENBQUE7SUFFRixPQUFPLElBQUksZ0NBQWdCLENBQWdDO1FBQ3pELElBQUksRUFBRSxTQUFTO1FBQ2YsU0FBUztRQUNULFdBQVc7S0FDWixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLCtCQUF1QixDQUFBIn0=
|
|
@@ -20,6 +20,7 @@ exports.createSwapWorkflow = (0, workflows_sdk_1.createWorkflow)("create-swap",
|
|
|
20
20
|
(0, swap_1.validateEligibilityStep)({
|
|
21
21
|
order,
|
|
22
22
|
return_items: validatedReturnItems,
|
|
23
|
+
new_items: validatedNewItems,
|
|
23
24
|
customer_id,
|
|
24
25
|
});
|
|
25
26
|
// Step 3: Calculate price difference
|
|
@@ -31,6 +32,7 @@ exports.createSwapWorkflow = (0, workflows_sdk_1.createWorkflow)("create-swap",
|
|
|
31
32
|
// Step 4: Create swap record
|
|
32
33
|
const { swap } = (0, swap_1.createSwapStep)({
|
|
33
34
|
order_id,
|
|
35
|
+
customer_id,
|
|
34
36
|
return_items: validatedReturnItems,
|
|
35
37
|
new_items: validatedNewItems,
|
|
36
38
|
difference_due,
|
|
@@ -49,4 +51,4 @@ exports.createSwapWorkflow = (0, workflows_sdk_1.createWorkflow)("create-swap",
|
|
|
49
51
|
});
|
|
50
52
|
});
|
|
51
53
|
exports.default = exports.createSwapWorkflow;
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXN3YXAtd29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N3YXBzL2NyZWF0ZS1zd2FwLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUcwQztBQUMxQyx3Q0FNc0I7QUFPVCxRQUFBLGtCQUFrQixHQUFHLElBQUEsOEJBQWMsRUFDOUMsYUFBYSxFQUNiLENBQ0UsS0FBd0QsRUFDWixFQUFFO0lBQzlDLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUU5RSx3REFBd0Q7SUFDeEQsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUEsd0JBQWlCLEVBQUM7UUFDbEMsUUFBUTtRQUNSLFdBQVc7S0FDWixDQUFDLENBQUE7SUFFRiw4QkFBOEI7SUFDOUIsTUFBTSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsR0FDeEUsSUFBQSw0QkFBcUIsRUFBQztRQUNwQixLQUFLO1FBQ0wsWUFBWTtRQUNaLFNBQVM7S0FDVixDQUFDLENBQUE7SUFFSixpREFBaUQ7SUFDakQsSUFBQSw4QkFBdUIsRUFBQztRQUN0QixLQUFLO1FBQ0wsWUFBWSxFQUFFLG9CQUFvQjtRQUNsQyxTQUFTLEVBQUUsaUJBQWlCO1FBQzVCLFdBQVc7S0FDWixDQUFDLENBQUE7SUFFRixxQ0FBcUM7SUFDckMsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUEsOEJBQXVCLEVBQUM7UUFDakQsS0FBSztRQUNMLFlBQVksRUFBRSxvQkFBb0I7UUFDbEMsU0FBUyxFQUFFLGlCQUFpQjtLQUM3QixDQUFDLENBQUE7SUFFRiw2QkFBNkI7SUFDN0IsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEscUJBQWMsRUFBQztRQUM5QixRQUFRO1FBQ1IsV0FBVztRQUNYLFlBQVksRUFBRSxvQkFBb0I7UUFDbEMsU0FBUyxFQUFFLGlCQUFpQjtRQUM1QixjQUFjO1FBQ2QsTUFBTTtRQUNOLElBQUk7S0FDTCxDQUFDLENBQUE7SUFFRiw2RUFBNkU7SUFDN0UseUJBQXlCO0lBQ3pCLDJCQUEyQjtJQUMzQixxQ0FBcUM7SUFDckMsd0RBQXdEO0lBQ3hELHNCQUFzQjtJQUN0QixLQUFLO0lBRUwsT0FBTyxJQUFJLGdDQUFnQixDQUEyQjtRQUNwRCxJQUFJO0tBQ0wsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUE7QUFFRCxrQkFBZSwwQkFBa0IsQ0FBQSJ9
|
|
@@ -4,21 +4,43 @@ exports.executeSwapWorkflow = void 0;
|
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
5
|
const swap_1 = require("../steps/swap");
|
|
6
6
|
exports.executeSwapWorkflow = (0, workflows_sdk_1.createWorkflow)("execute-swap", (input) => {
|
|
7
|
-
const { swap_id } = input;
|
|
8
|
-
// Step 1: Retrieve swap to validate it's approved
|
|
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
9
|
const { swap: retrievedSwap } = (0, swap_1.retrieveSwapStep)({
|
|
10
10
|
swap_id,
|
|
11
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);
|
|
12
19
|
// Step 2: Create Medusa Return
|
|
13
20
|
const { return_id, swap: swapWithReturn } = (0, swap_1.createMedusaReturnStep)({
|
|
14
21
|
swap_id,
|
|
22
|
+
return_location_id,
|
|
23
|
+
return_shipping_method_id,
|
|
15
24
|
});
|
|
16
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.
|
|
17
35
|
const { exchange_id, swap: swapWithExchange } = (0, swap_1.createMedusaExchangeStep)({
|
|
18
36
|
swap_id,
|
|
19
37
|
return_id,
|
|
38
|
+
outbound_shipping_method_id,
|
|
39
|
+
send_notification,
|
|
20
40
|
});
|
|
21
|
-
// Step 4: Update swap status to return_started
|
|
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.
|
|
22
44
|
const { swap: finalSwap } = (0, swap_1.updateSwapStatusStep)({
|
|
23
45
|
swap_id,
|
|
24
46
|
status: "return_started",
|
|
@@ -33,4 +55,4 @@ exports.executeSwapWorkflow = (0, workflows_sdk_1.createWorkflow)("execute-swap"
|
|
|
33
55
|
});
|
|
34
56
|
});
|
|
35
57
|
exports.default = exports.executeSwapWorkflow;
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS1zd2FwLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zd2Fwcy9leGVjdXRlLXN3YXAtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBRzBDO0FBQzFDLHdDQUtzQjtBQU1ULFFBQUEsbUJBQW1CLEdBQUcsSUFBQSw4QkFBYyxFQUMvQyxjQUFjLEVBQ2QsQ0FDRSxLQUErQixFQUNjLEVBQUU7SUFDL0MsTUFBTSxFQUNKLE9BQU8sRUFDUCxrQkFBa0IsRUFBRSxxQkFBcUIsRUFDekMseUJBQXlCLEVBQUUsMkJBQTJCLEVBQ3RELDJCQUEyQixFQUFFLDZCQUE2QixFQUMxRCxpQkFBaUIsRUFBRSxxQkFBcUIsR0FDekMsR0FBRyxLQUFLLENBQUE7SUFFVCwyRUFBMkU7SUFDM0UsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFBLHVCQUFnQixFQUFDO1FBQy9DLE9BQU87S0FDUixDQUFDLENBQUE7SUFFRiw4REFBOEQ7SUFDOUQsc0VBQXNFO0lBQ3RFLE1BQU0sUUFBUSxHQUFHLGFBS2hCLENBQUE7SUFFRCxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQTtJQUMvRSxNQUFNLHlCQUF5QixHQUFHLDJCQUEyQixJQUFJLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQTtJQUNuRyxNQUFNLDJCQUEyQixHQUFHLDZCQUE2QixJQUFJLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQTtJQUN6RyxNQUFNLGlCQUFpQixHQUFHLHFCQUFxQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixJQUFJLEtBQUssQ0FBQyxDQUFBO0lBRTdILCtCQUErQjtJQUMvQixNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFBLDZCQUFzQixFQUFDO1FBQ2pFLE9BQU87UUFDUCxrQkFBa0I7UUFDbEIseUJBQXlCO0tBQzFCLENBQUMsQ0FBQTtJQUVGLGtEQUFrRDtJQUNsRCxxRUFBcUU7SUFDckUsdUNBQXVDO0lBQ3ZDLHNFQUFzRTtJQUN0RSxtRUFBbUU7SUFDbkUsb0VBQW9FO0lBQ3BFLEdBQUc7SUFDSCwwRkFBMEY7SUFDMUYscUZBQXFGO0lBQ3JGLDBDQUEwQztJQUMxQyxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUEsK0JBQXdCLEVBQUM7UUFDdkUsT0FBTztRQUNQLFNBQVM7UUFDVCwyQkFBMkI7UUFDM0IsaUJBQWlCO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLGtGQUFrRjtJQUNsRix1RkFBdUY7SUFDdkYsd0RBQXdEO0lBQ3hELE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBQSwyQkFBb0IsRUFBQztRQUMvQyxPQUFPO1FBQ1AsTUFBTSxFQUFFLGdCQUFnQjtRQUN4QixRQUFRLEVBQUU7WUFDUiwrQkFBK0IsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtTQUMxRDtLQUNGLENBQUMsQ0FBQTtJQUVGLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBNEI7UUFDckQsSUFBSSxFQUFFLFNBQVM7UUFDZixTQUFTO1FBQ1QsV0FBVztLQUNaLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBO0FBRUQsa0JBQWUsMkJBQW1CLENBQUEifQ==
|
package/package.json
CHANGED
|
@@ -1,152 +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 zod_1 = require("zod");
|
|
6
|
-
const swap_1 = require("../../../../../modules/swap");
|
|
7
|
-
const ProcessPaymentSchema = zod_1.z.object({
|
|
8
|
-
action: zod_1.z.enum(["approve", "reject"]),
|
|
9
|
-
payment_intent_id: zod_1.z.string().optional(),
|
|
10
|
-
});
|
|
11
|
-
const POST = async (req, res) => {
|
|
12
|
-
const { id } = req.params;
|
|
13
|
-
if (!id) {
|
|
14
|
-
res.status(400).json({ message: "Swap ID is required" });
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
// Type-safe access to auth_context
|
|
18
|
-
const authContext = req.auth_context;
|
|
19
|
-
const adminId = authContext?.actor_id || authContext?.user_id || "admin";
|
|
20
|
-
try {
|
|
21
|
-
const body = ProcessPaymentSchema.parse(req.body);
|
|
22
|
-
const swapService = req.scope.resolve(swap_1.SWAP_MODULE);
|
|
23
|
-
const swap = await swapService.retrieveSwap(id);
|
|
24
|
-
const swapData = swap;
|
|
25
|
-
if (swapData.payment_status !== "pending") {
|
|
26
|
-
res.status(400).json({
|
|
27
|
-
message: `Payment cannot be processed. Current status: ${swapData.payment_status}`,
|
|
28
|
-
});
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
const differenceDue = swapData.difference_due || 0;
|
|
32
|
-
if (differenceDue <= 0) {
|
|
33
|
-
res.status(400).json({
|
|
34
|
-
message: "No payment required for this swap",
|
|
35
|
-
});
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
const swapMetadata = swapData.metadata || {};
|
|
39
|
-
const medusaIntegration = swapMetadata.medusa_integration || {};
|
|
40
|
-
if (body.action === "approve") {
|
|
41
|
-
// Resolve payment service
|
|
42
|
-
const paymentService = req.scope.resolve("payment");
|
|
43
|
-
let paymentIntentId = body.payment_intent_id;
|
|
44
|
-
if (paymentService?.capturePayment && swapData.order_id) {
|
|
45
|
-
try {
|
|
46
|
-
const payment = await paymentService.capturePayment({
|
|
47
|
-
order_id: swapData.order_id,
|
|
48
|
-
amount: differenceDue,
|
|
49
|
-
payment_intent_id: paymentIntentId,
|
|
50
|
-
});
|
|
51
|
-
paymentIntentId = payment.id;
|
|
52
|
-
// Update swap with captured payment
|
|
53
|
-
await swapService.updateSwaps({
|
|
54
|
-
selector: { id },
|
|
55
|
-
data: {
|
|
56
|
-
payment_status: "captured",
|
|
57
|
-
metadata: {
|
|
58
|
-
...swapMetadata,
|
|
59
|
-
medusa_integration: {
|
|
60
|
-
...medusaIntegration,
|
|
61
|
-
payment_intent_id: paymentIntentId,
|
|
62
|
-
payment_captured_at: new Date().toISOString(),
|
|
63
|
-
payment_captured_by: adminId,
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
res.status(500).json({
|
|
71
|
-
message: "Failed to capture payment",
|
|
72
|
-
error: error instanceof Error ? error.message : "Unknown error",
|
|
73
|
-
});
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
// Mark as manually processed if payment service not available
|
|
79
|
-
await swapService.updateSwaps({
|
|
80
|
-
selector: { id },
|
|
81
|
-
data: {
|
|
82
|
-
payment_status: "captured",
|
|
83
|
-
metadata: {
|
|
84
|
-
...swapMetadata,
|
|
85
|
-
medusa_integration: {
|
|
86
|
-
...medusaIntegration,
|
|
87
|
-
payment_manually_processed: true,
|
|
88
|
-
payment_captured_at: new Date().toISOString(),
|
|
89
|
-
payment_captured_by: adminId,
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
const updatedSwap = await swapService.retrieveSwap(id);
|
|
96
|
-
res.json({
|
|
97
|
-
swap: updatedSwap,
|
|
98
|
-
message: "Payment approved and captured",
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
else if (body.action === "reject") {
|
|
102
|
-
// Reject payment - cancel the swap or mark for manual review
|
|
103
|
-
await swapService.updateSwaps({
|
|
104
|
-
selector: { id },
|
|
105
|
-
data: {
|
|
106
|
-
payment_status: "rejected",
|
|
107
|
-
metadata: {
|
|
108
|
-
...swapMetadata,
|
|
109
|
-
medusa_integration: {
|
|
110
|
-
...medusaIntegration,
|
|
111
|
-
payment_rejected_at: new Date().toISOString(),
|
|
112
|
-
payment_rejected_by: adminId,
|
|
113
|
-
},
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
});
|
|
117
|
-
const updatedSwap = await swapService.retrieveSwap(id);
|
|
118
|
-
res.json({
|
|
119
|
-
swap: updatedSwap,
|
|
120
|
-
message: "Payment rejected",
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
if (error instanceof zod_1.z.ZodError) {
|
|
126
|
-
res.status(400).json({
|
|
127
|
-
message: "Invalid request data",
|
|
128
|
-
errors: error.errors,
|
|
129
|
-
});
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
if (error instanceof utils_1.MedusaError) {
|
|
133
|
-
const statusCode = error.type === utils_1.MedusaError.Types.NOT_FOUND
|
|
134
|
-
? 404
|
|
135
|
-
: error.type === utils_1.MedusaError.Types.INVALID_DATA
|
|
136
|
-
? 400
|
|
137
|
-
: 500;
|
|
138
|
-
res.status(statusCode).json({
|
|
139
|
-
message: error.message,
|
|
140
|
-
type: error.type,
|
|
141
|
-
});
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
145
|
-
res.status(500).json({
|
|
146
|
-
message: "Failed to process payment",
|
|
147
|
-
error: errorMessage,
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
exports.POST = POST;
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N3YXBzL1tpZF0vcHJvY2Vzcy1wYXltZW50L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUF1RDtBQUN2RCw2QkFBdUI7QUFDdkIsc0RBQXlEO0FBR3pELE1BQU0sb0JBQW9CLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxNQUFNLEVBQUUsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNyQyxpQkFBaUIsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3pDLENBQUMsQ0FBQTtBQUVLLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDSixFQUFFO0lBQ2pCLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO0lBRXpCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNSLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQTtRQUN4RCxPQUFNO0lBQ1IsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxNQUFNLFdBQVcsR0FBSSxHQUVuQixDQUFDLFlBQVksQ0FBQTtJQUVmLE1BQU0sT0FBTyxHQUFHLFdBQVcsRUFBRSxRQUFRLElBQUksV0FBVyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUE7SUFFeEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqRCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBYyxrQkFBVyxDQUFDLENBQUE7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
|