order-management 0.0.2 → 0.0.3
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 +4 -639
- package/.medusa/server/src/admin/index.mjs +4 -639
- package/.medusa/server/src/api/store/orders/reorder/[order_id]/route.js +52 -0
- package/.medusa/server/src/workflows/index.js +4 -9
- package/.medusa/server/src/workflows/{types.js → reorder/types.js} +1 -1
- package/.medusa/server/src/workflows/reorder-workflow.js +27 -0
- package/.medusa/server/src/workflows/steps/create-cart-from-order-step.js +26 -0
- package/.medusa/server/src/workflows/steps/index.js +10 -0
- package/.medusa/server/src/workflows/steps/retrieve-order-step.js +52 -0
- package/.medusa/server/src/workflows/steps/transform-order-to-cart-step.js +53 -0
- package/README.md +59 -73
- package/package.json +1 -1
- package/.medusa/server/src/api/admin/returns/[id]/retry-refund/route.js +0 -84
- package/.medusa/server/src/api/admin/returns/failed-refunds/route.js +0 -137
- package/.medusa/server/src/api/store/returns/[id]/payment-details/route.js +0 -326
- package/.medusa/server/src/config/plugin-options.js +0 -61
- package/.medusa/server/src/providers/refund-payment/base-refund-provider.js +0 -80
- package/.medusa/server/src/providers/refund-payment/index.js +0 -38
- package/.medusa/server/src/providers/refund-payment/razorpay-provider.js +0 -96
- package/.medusa/server/src/providers/refund-payment/stripe-provider.js +0 -82
- package/.medusa/server/src/subscribers/return-received.js +0 -103
- package/.medusa/server/src/types/plugin-options.js +0 -3
- package/.medusa/server/src/types/refund-payment.js +0 -3
- package/.medusa/server/src/workflows/process-cod-refund-workflow.js +0 -99
- package/.medusa/server/src/workflows/steps/calculate-refund-amount-step.js +0 -51
- package/.medusa/server/src/workflows/steps/create-refund-record-step.js +0 -243
- package/.medusa/server/src/workflows/steps/process-refund-payment-step.js +0 -86
- package/.medusa/server/src/workflows/steps/retrieve-order-and-payment-step.js +0 -44
- package/.medusa/server/src/workflows/steps/retrieve-return-payment-details-step.js +0 -56
- package/.medusa/server/src/workflows/steps/select-payment-method-step.js +0 -61
- package/.medusa/server/src/workflows/steps/update-payment-status-step.js +0 -45
- package/.medusa/server/src/workflows/steps/validate-payment-details-step.js +0 -90
- package/.medusa/server/src/workflows/steps/verify-cod-order-step.js +0 -39
|
@@ -1,326 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.POST = exports.GET = void 0;
|
|
7
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
-
const utils_2 = require("@medusajs/framework/utils");
|
|
9
|
-
const process_cod_refund_workflow_1 = __importDefault(require("../../../../../workflows/process-cod-refund-workflow"));
|
|
10
|
-
/**
|
|
11
|
-
* GET endpoint to retrieve current payment details and refund status
|
|
12
|
-
*
|
|
13
|
-
* GET /store/returns/[id]/payment-details
|
|
14
|
-
*/
|
|
15
|
-
const GET = async (req, res) => {
|
|
16
|
-
const { id: return_id } = req.params;
|
|
17
|
-
if (!return_id) {
|
|
18
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Return ID is required");
|
|
19
|
-
}
|
|
20
|
-
// Get order service to retrieve return
|
|
21
|
-
const orderService = req.scope.resolve(utils_2.Modules.ORDER);
|
|
22
|
-
const paymentService = req.scope.resolve(utils_2.Modules.PAYMENT);
|
|
23
|
-
// Find return by ID
|
|
24
|
-
const returnRecord = await findReturnById(orderService, return_id);
|
|
25
|
-
if (!returnRecord) {
|
|
26
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Return with ID ${return_id} not found`);
|
|
27
|
-
}
|
|
28
|
-
// Get order to verify customer ownership
|
|
29
|
-
const orderId = returnRecord.order_id;
|
|
30
|
-
const order = await orderService.retrieveOrder(orderId);
|
|
31
|
-
// Verify customer ownership
|
|
32
|
-
const authContext = req.auth_context;
|
|
33
|
-
if (authContext?.actor_type === "customer") {
|
|
34
|
-
const customerId = authContext.actor_id;
|
|
35
|
-
if (order.customer_id !== customerId) {
|
|
36
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "You are not authorized to view this return");
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
// Get current payment details from metadata
|
|
40
|
-
const metadata = returnRecord.metadata || {};
|
|
41
|
-
const paymentDetails = metadata.refund_payment_details;
|
|
42
|
-
const lastUpdatedAt = metadata.payment_details_updated_at;
|
|
43
|
-
const paymentDetailsHistory = metadata.payment_details_history || [];
|
|
44
|
-
// Get refund status
|
|
45
|
-
const refundStatus = await getRefundStatusForReturn(orderService, paymentService, return_id, orderId);
|
|
46
|
-
const refundStatusValue = refundStatus.status;
|
|
47
|
-
const canUpdate = refundStatusValue !== "succeeded";
|
|
48
|
-
return res.json({
|
|
49
|
-
payment_details: paymentDetails || null,
|
|
50
|
-
refund_status: refundStatusValue,
|
|
51
|
-
can_update: canUpdate,
|
|
52
|
-
last_updated_at: lastUpdatedAt || null,
|
|
53
|
-
payment_details_history_count: paymentDetailsHistory.length,
|
|
54
|
-
});
|
|
55
|
-
};
|
|
56
|
-
exports.GET = GET;
|
|
57
|
-
const POST = async (req, res) => {
|
|
58
|
-
const { id: return_id } = req.params;
|
|
59
|
-
const paymentDetails = req.body;
|
|
60
|
-
if (!return_id) {
|
|
61
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Return ID is required");
|
|
62
|
-
}
|
|
63
|
-
if (!paymentDetails) {
|
|
64
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Payment details are required");
|
|
65
|
-
}
|
|
66
|
-
// Validate required fields
|
|
67
|
-
if (!paymentDetails.method) {
|
|
68
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Payment method is required");
|
|
69
|
-
}
|
|
70
|
-
if (!paymentDetails.currency_code) {
|
|
71
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Currency code is required");
|
|
72
|
-
}
|
|
73
|
-
// Get order service to retrieve return
|
|
74
|
-
const orderService = req.scope.resolve(utils_2.Modules.ORDER);
|
|
75
|
-
const paymentService = req.scope.resolve(utils_2.Modules.PAYMENT);
|
|
76
|
-
// Find return by ID
|
|
77
|
-
// Note: In Medusa, returns are linked to orders, so we need to search through orders
|
|
78
|
-
// This is a simplified approach - in production, you might want to use a more efficient query
|
|
79
|
-
const returnRecord = await findReturnById(orderService, return_id);
|
|
80
|
-
if (!returnRecord) {
|
|
81
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Return with ID ${return_id} not found`);
|
|
82
|
-
}
|
|
83
|
-
// Get order to verify customer ownership (if needed)
|
|
84
|
-
const orderId = returnRecord.order_id;
|
|
85
|
-
const order = await orderService.retrieveOrder(orderId);
|
|
86
|
-
// Verify customer ownership (optional - depends on your security requirements)
|
|
87
|
-
const authContext = req.auth_context;
|
|
88
|
-
if (authContext?.actor_type === "customer") {
|
|
89
|
-
const customerId = authContext.actor_id;
|
|
90
|
-
if (order.customer_id !== customerId) {
|
|
91
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "You are not authorized to update this return");
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Check refund status before allowing update
|
|
95
|
-
const refundStatus = await getRefundStatusForReturn(orderService, paymentService, return_id, orderId);
|
|
96
|
-
// Reject update if refund is already succeeded
|
|
97
|
-
if (refundStatus.status === "succeeded") {
|
|
98
|
-
return res.status(400).json({
|
|
99
|
-
success: false,
|
|
100
|
-
error: "Payment details cannot be updated after refund is successful",
|
|
101
|
-
refund_status: "succeeded",
|
|
102
|
-
refund_id: refundStatus.refund_id,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
// Get current metadata
|
|
106
|
-
const currentMetadata = returnRecord.metadata || {};
|
|
107
|
-
// Get current payment details for history
|
|
108
|
-
const currentPaymentDetails = currentMetadata.refund_payment_details;
|
|
109
|
-
// Build payment details history
|
|
110
|
-
const paymentDetailsHistory = currentMetadata.payment_details_history || [];
|
|
111
|
-
// Add current payment details to history if they exist
|
|
112
|
-
if (currentPaymentDetails) {
|
|
113
|
-
const historyEntry = {
|
|
114
|
-
payment_details: currentPaymentDetails,
|
|
115
|
-
updated_at: currentMetadata.payment_details_updated_at ||
|
|
116
|
-
new Date().toISOString(),
|
|
117
|
-
reason: refundStatus.status === "failed" ? "refund_failed" : "user_update",
|
|
118
|
-
};
|
|
119
|
-
// Add to history (limit to last 10 entries)
|
|
120
|
-
paymentDetailsHistory.push(historyEntry);
|
|
121
|
-
if (paymentDetailsHistory.length > 10) {
|
|
122
|
-
paymentDetailsHistory.shift(); // Remove oldest entry
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
// Update return metadata with payment details
|
|
126
|
-
const updatedMetadata = {
|
|
127
|
-
...currentMetadata,
|
|
128
|
-
refund_payment_details: paymentDetails,
|
|
129
|
-
payment_details_updated_at: new Date().toISOString(),
|
|
130
|
-
payment_details_history: paymentDetailsHistory,
|
|
131
|
-
// Cache refund status for quick access
|
|
132
|
-
refund_status: refundStatus.status,
|
|
133
|
-
};
|
|
134
|
-
// Store previous refund status to check if we need to trigger retry
|
|
135
|
-
const previousRefundStatus = refundStatus.status;
|
|
136
|
-
// Attempt to update return metadata via order service
|
|
137
|
-
// Note: Medusa v2 may not expose direct return update API
|
|
138
|
-
// We'll try to update through the order service if available
|
|
139
|
-
try {
|
|
140
|
-
// Try to update the return through order service
|
|
141
|
-
// Check if orderService has an updateReturn or similar method
|
|
142
|
-
const orderServiceWithReturns = orderService;
|
|
143
|
-
if (orderServiceWithReturns.updateReturn) {
|
|
144
|
-
await orderServiceWithReturns.updateReturn(return_id, {
|
|
145
|
-
metadata: updatedMetadata,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
// If direct return update is not available, try updating through order
|
|
150
|
-
// This is a workaround - in production, you may need a custom module
|
|
151
|
-
const orderWithReturns = order;
|
|
152
|
-
const returns = orderWithReturns.returns || [];
|
|
153
|
-
const returnIndex = returns.findIndex((ret) => ret.id === return_id);
|
|
154
|
-
if (returnIndex >= 0) {
|
|
155
|
-
returns[returnIndex] = {
|
|
156
|
-
...returns[returnIndex],
|
|
157
|
-
metadata: updatedMetadata,
|
|
158
|
-
};
|
|
159
|
-
// Try to update order with modified returns
|
|
160
|
-
const orderServiceWithUpdate = orderService;
|
|
161
|
-
if (orderServiceWithUpdate.updateOrder) {
|
|
162
|
-
await orderServiceWithUpdate.updateOrder(orderId, {
|
|
163
|
-
returns: returns,
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
// If update methods are not available, log warning
|
|
168
|
-
console.warn(`[payment-details] Unable to persist return metadata for return ${return_id}. ` +
|
|
169
|
-
`Order service does not expose return update methods. ` +
|
|
170
|
-
`Payment details structure is correct but may not be persisted. ` +
|
|
171
|
-
`Consider implementing a custom return module or extending Medusa's return service.`);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
catch (error) {
|
|
177
|
-
// Log error but don't fail the request - metadata structure is correct
|
|
178
|
-
// The limitation is in Medusa's API, not our implementation
|
|
179
|
-
console.error(`[payment-details] Error updating return metadata for return ${return_id}:`, error instanceof Error ? error.message : error);
|
|
180
|
-
console.warn(`[payment-details] Payment details metadata structure is correct but may not be persisted. ` +
|
|
181
|
-
`This is a known limitation when Medusa's return update API is not available.`);
|
|
182
|
-
}
|
|
183
|
-
// If refund was failed and payment details are updated, trigger auto-retry
|
|
184
|
-
if (previousRefundStatus === "failed") {
|
|
185
|
-
// Trigger refund retry asynchronously (don't await)
|
|
186
|
-
triggerRefundRetry(req.scope, return_id, orderId).catch((error) => {
|
|
187
|
-
console.error(`[payment-details] Error triggering refund retry for return ${return_id}:`, error instanceof Error ? error.message : error);
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
return res.json({
|
|
191
|
-
success: true,
|
|
192
|
-
message: "Payment details saved successfully",
|
|
193
|
-
return_id,
|
|
194
|
-
refund_status: refundStatus.status,
|
|
195
|
-
can_update: refundStatus.status !== "succeeded",
|
|
196
|
-
payment_details_history_count: paymentDetailsHistory.length,
|
|
197
|
-
...(previousRefundStatus === "failed" && {
|
|
198
|
-
note: "Refund retry has been automatically initiated with updated payment details",
|
|
199
|
-
}),
|
|
200
|
-
...(previousRefundStatus !== "failed" && {
|
|
201
|
-
note: "Payment details have been processed. If return update API is not available in your Medusa version, " +
|
|
202
|
-
"you may need to implement a custom return module to persist metadata.",
|
|
203
|
-
}),
|
|
204
|
-
});
|
|
205
|
-
};
|
|
206
|
-
exports.POST = POST;
|
|
207
|
-
// Helper function to find return by ID
|
|
208
|
-
async function findReturnById(orderService, returnId) {
|
|
209
|
-
// This is a simplified implementation
|
|
210
|
-
// In production, you might want to use a more efficient query method
|
|
211
|
-
// or extend Medusa's return service
|
|
212
|
-
// For now, we'll need to search through orders
|
|
213
|
-
// This is not ideal for performance but works for the initial implementation
|
|
214
|
-
try {
|
|
215
|
-
// Try to retrieve via order relations
|
|
216
|
-
// Note: This assumes returns are accessible via order relations
|
|
217
|
-
// You may need to adjust based on your Medusa version and setup
|
|
218
|
-
const orders = await orderService.listOrders({
|
|
219
|
-
// Query to find order with this return
|
|
220
|
-
});
|
|
221
|
-
for (const order of orders) {
|
|
222
|
-
const orderWithReturns = order;
|
|
223
|
-
const returns = orderWithReturns.returns || [];
|
|
224
|
-
const returnRecord = returns.find((ret) => ret.id === returnId);
|
|
225
|
-
if (returnRecord) {
|
|
226
|
-
return returnRecord;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
console.error("Error finding return:", error);
|
|
232
|
-
}
|
|
233
|
-
return null;
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Helper function to get refund status for a return
|
|
237
|
-
* Checks payment collection refunds to find refund linked to return_id
|
|
238
|
-
*/
|
|
239
|
-
async function getRefundStatusForReturn(orderService, paymentService, return_id, order_id) {
|
|
240
|
-
try {
|
|
241
|
-
// Retrieve order with payment collection
|
|
242
|
-
const order = await orderService.retrieveOrder(order_id, {
|
|
243
|
-
relations: ["payment_collection"],
|
|
244
|
-
});
|
|
245
|
-
if (!order) {
|
|
246
|
-
return { status: null };
|
|
247
|
-
}
|
|
248
|
-
// Get payment collection ID
|
|
249
|
-
const orderWithPayment = order;
|
|
250
|
-
const paymentCollectionId = orderWithPayment.payment_collection_id;
|
|
251
|
-
if (!paymentCollectionId) {
|
|
252
|
-
return { status: null };
|
|
253
|
-
}
|
|
254
|
-
// Retrieve payment collection with refunds
|
|
255
|
-
const paymentCollection = await paymentService.retrievePaymentCollection(paymentCollectionId, {
|
|
256
|
-
relations: ["refunds"],
|
|
257
|
-
});
|
|
258
|
-
if (!paymentCollection) {
|
|
259
|
-
return { status: null };
|
|
260
|
-
}
|
|
261
|
-
// Check refunds in collection
|
|
262
|
-
const paymentCollectionWithRefunds = paymentCollection;
|
|
263
|
-
const refunds = paymentCollectionWithRefunds.refunds || [];
|
|
264
|
-
// Find refund linked to this return
|
|
265
|
-
for (const refund of refunds) {
|
|
266
|
-
const refundData = refund;
|
|
267
|
-
const metadata = refundData.metadata || {};
|
|
268
|
-
// Check if refund is linked to this return
|
|
269
|
-
if (metadata.return_id === return_id) {
|
|
270
|
-
const refundStatus = metadata.refund_status;
|
|
271
|
-
return {
|
|
272
|
-
status: refundStatus || null,
|
|
273
|
-
refund_id: refundData.id,
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
// Also check payment collection metadata for fallback refunds
|
|
278
|
-
const collectionMetadata = paymentCollectionWithRefunds.metadata || {};
|
|
279
|
-
const refundTransactions = collectionMetadata.refund_transactions || {};
|
|
280
|
-
// Check each refund transaction
|
|
281
|
-
for (const [refundId, refundData] of Object.entries(refundTransactions)) {
|
|
282
|
-
const refundInfo = refundData;
|
|
283
|
-
if (refundInfo.return_id === return_id) {
|
|
284
|
-
return {
|
|
285
|
-
status: refundInfo.refund_status || null,
|
|
286
|
-
refund_id: refundId,
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
return { status: null };
|
|
291
|
-
}
|
|
292
|
-
catch (error) {
|
|
293
|
-
console.error(`[getRefundStatusForReturn] Error checking refund status for return ${return_id}:`, error instanceof Error ? error.message : error);
|
|
294
|
-
return { status: null };
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Helper function to trigger refund retry when payment details are updated
|
|
299
|
-
* Executes workflow asynchronously without blocking the response
|
|
300
|
-
*/
|
|
301
|
-
async function triggerRefundRetry(scope, return_id, order_id) {
|
|
302
|
-
try {
|
|
303
|
-
// Execute workflow asynchronously (don't await to avoid blocking)
|
|
304
|
-
(0, process_cod_refund_workflow_1.default)(scope)
|
|
305
|
-
.run({
|
|
306
|
-
input: {
|
|
307
|
-
return_id,
|
|
308
|
-
order_id,
|
|
309
|
-
},
|
|
310
|
-
})
|
|
311
|
-
.then(({ result }) => {
|
|
312
|
-
console.log(`[triggerRefundRetry] Refund retry initiated successfully for return ${return_id}`, {
|
|
313
|
-
refund_id: result.refund_id,
|
|
314
|
-
amount: result.amount,
|
|
315
|
-
currency_code: result.currency_code,
|
|
316
|
-
});
|
|
317
|
-
})
|
|
318
|
-
.catch((error) => {
|
|
319
|
-
console.error(`[triggerRefundRetry] Refund retry failed for return ${return_id}:`, error instanceof Error ? error.message : error);
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
catch (error) {
|
|
323
|
-
console.error(`[triggerRefundRetry] Error initiating refund retry for return ${return_id}:`, error instanceof Error ? error.message : error);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3JldHVybnMvW2lkXS9wYXltZW50LWRldGFpbHMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EscURBQXVEO0FBQ3ZELHFEQUFtRDtBQU1uRCx1SEFBMkY7QUFFM0Y7Ozs7R0FJRztBQUNJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUVwQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix1QkFBdUIsQ0FDeEIsQ0FBQTtJQUNILENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQXNCLGVBQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRSxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDdEMsZUFBTyxDQUFDLE9BQU8sQ0FDaEIsQ0FBQTtJQUVELG9CQUFvQjtJQUNwQixNQUFNLFlBQVksR0FBRyxNQUFNLGNBQWMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFFbEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLGtCQUFrQixTQUFTLFlBQVksQ0FDeEMsQ0FBQTtJQUNILENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsTUFBTSxPQUFPLEdBQUksWUFBcUMsQ0FBQyxRQUFRLENBQUE7SUFDL0QsTUFBTSxLQUFLLEdBQUcs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
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEFAULT_ORDER_MANAGEMENT_OPTIONS = void 0;
|
|
4
|
-
exports.normalizeOrderManagementOptions = normalizeOrderManagementOptions;
|
|
5
|
-
exports.resolveOrderManagementOptions = resolveOrderManagementOptions;
|
|
6
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
-
const zod_1 = require("zod");
|
|
8
|
-
const RefundProviderCredentialsSchema = zod_1.z.object({
|
|
9
|
-
razorpay: zod_1.z
|
|
10
|
-
.object({
|
|
11
|
-
keyId: zod_1.z.string().min(1),
|
|
12
|
-
keySecret: zod_1.z.string().min(1),
|
|
13
|
-
})
|
|
14
|
-
.optional(),
|
|
15
|
-
stripe: zod_1.z
|
|
16
|
-
.object({
|
|
17
|
-
apiKey: zod_1.z.string().min(1),
|
|
18
|
-
})
|
|
19
|
-
.optional(),
|
|
20
|
-
});
|
|
21
|
-
const OrderManagementPluginOptionsSchema = zod_1.z.object({
|
|
22
|
-
refundProviders: zod_1.z
|
|
23
|
-
.object({
|
|
24
|
-
enabled: zod_1.z.array(zod_1.z.enum(["razorpay", "stripe"])).optional(),
|
|
25
|
-
credentials: RefundProviderCredentialsSchema.optional(),
|
|
26
|
-
providerSelection: zod_1.z.enum(["auto", "manual"]).default("auto"),
|
|
27
|
-
})
|
|
28
|
-
.optional(),
|
|
29
|
-
paymentProcessing: zod_1.z.enum(["automatic", "manual"]).default("automatic"),
|
|
30
|
-
});
|
|
31
|
-
function normalizeOrderManagementOptions(input) {
|
|
32
|
-
const parsed = OrderManagementPluginOptionsSchema.parse(input ?? {});
|
|
33
|
-
return {
|
|
34
|
-
refundProviders: parsed.refundProviders
|
|
35
|
-
? {
|
|
36
|
-
enabled: parsed.refundProviders.enabled,
|
|
37
|
-
credentials: parsed.refundProviders.credentials,
|
|
38
|
-
providerSelection: parsed.refundProviders.providerSelection,
|
|
39
|
-
}
|
|
40
|
-
: undefined,
|
|
41
|
-
paymentProcessing: parsed.paymentProcessing,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
exports.DEFAULT_ORDER_MANAGEMENT_OPTIONS = normalizeOrderManagementOptions({});
|
|
45
|
-
const PLUGIN_NAME = "order-management";
|
|
46
|
-
function resolveOrderManagementOptions(configModule) {
|
|
47
|
-
const plugins = configModule?.plugins ?? [];
|
|
48
|
-
for (const plugin of plugins) {
|
|
49
|
-
if ((0, utils_1.isString)(plugin)) {
|
|
50
|
-
if (plugin === PLUGIN_NAME) {
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
if (plugin?.resolve === PLUGIN_NAME) {
|
|
56
|
-
return normalizeOrderManagementOptions(plugin.options);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return exports.DEFAULT_ORDER_MANAGEMENT_OPTIONS;
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29uZmlnL3BsdWdpbi1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQThDQSwwRUFlQztBQU9ELHNFQW1CQztBQXZGRCxxREFBb0Q7QUFDcEQsNkJBQXVCO0FBTXZCLE1BQU0sK0JBQStCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMvQyxRQUFRLEVBQUUsT0FBQztTQUNSLE1BQU0sQ0FBQztRQUNOLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QixTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDN0IsQ0FBQztTQUNELFFBQVEsRUFBRTtJQUNiLE1BQU0sRUFBRSxPQUFDO1NBQ04sTUFBTSxDQUFDO1FBQ04sTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzFCLENBQUM7U0FDRCxRQUFRLEVBQUU7Q0FDZCxDQUFDLENBQUE7QUFFRixNQUFNLGtDQUFrQyxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDbEQsZUFBZSxFQUFFLE9BQUM7U0FDZixNQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsT0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDM0QsV0FBVyxFQUFFLCtCQUErQixDQUFDLFFBQVEsRUFBRTtRQUN2RCxpQkFBaUIsRUFBRSxPQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUM5RCxDQUFDO1NBQ0QsUUFBUSxFQUFFO0lBQ2IsaUJBQWlCLEVBQUUsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Q0FDeEUsQ0FBQyxDQUFBO0FBZ0JGLFNBQWdCLCtCQUErQixDQUM3QyxLQUE4QztJQUU5QyxNQUFNLE1BQU0sR0FBRyxrQ0FBa0MsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRXBFLE9BQU87UUFDTCxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7WUFDckMsQ0FBQyxDQUFDO2dCQUNFLE9BQU8sRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU87Z0JBQ3ZDLFdBQVcsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLFdBQVc7Z0JBQy9DLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsaUJBQWlCO2FBQzVEO1lBQ0gsQ0FBQyxDQUFDLFNBQVM7UUFDYixpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO0tBQzVDLENBQUE7QUFDSCxDQUFDO0FBRVksUUFBQSxnQ0FBZ0MsR0FDM0MsK0JBQStCLENBQUMsRUFBRSxDQUFDLENBQUE7QUFFckMsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUE7QUFFdEMsU0FBZ0IsNkJBQTZCLENBQzNDLFlBQWdDO0lBRWhDLE1BQU0sT0FBTyxHQUFHLFlBQVksRUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO0lBRTNDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxJQUFBLGdCQUFRLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyQixJQUFJLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDM0IsTUFBSztZQUNQLENBQUM7WUFDRCxTQUFRO1FBQ1YsQ0FBQztRQUVELElBQUksTUFBTSxFQUFFLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxPQUFPLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sd0NBQWdDLENBQUE7QUFDekMsQ0FBQyJ9
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BaseRefundProvider = void 0;
|
|
4
|
-
class BaseRefundProvider {
|
|
5
|
-
constructor(providerName) {
|
|
6
|
-
this.providerName = providerName;
|
|
7
|
-
}
|
|
8
|
-
getName() {
|
|
9
|
-
return this.providerName;
|
|
10
|
-
}
|
|
11
|
-
validatePaymentDetails(payment_details, requiredMethod) {
|
|
12
|
-
if (payment_details.method !== requiredMethod) {
|
|
13
|
-
return {
|
|
14
|
-
valid: false,
|
|
15
|
-
error: `Payment method mismatch. Expected ${requiredMethod}, got ${payment_details.method}`,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
switch (requiredMethod) {
|
|
19
|
-
case "bank_transfer":
|
|
20
|
-
if (!payment_details.bank_account) {
|
|
21
|
-
return {
|
|
22
|
-
valid: false,
|
|
23
|
-
error: "Bank account details are required for bank transfer",
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
if (!payment_details.bank_account.account_number) {
|
|
27
|
-
return {
|
|
28
|
-
valid: false,
|
|
29
|
-
error: "Bank account number is required",
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
if (!payment_details.bank_account.account_holder_name) {
|
|
33
|
-
return {
|
|
34
|
-
valid: false,
|
|
35
|
-
error: "Account holder name is required",
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
break;
|
|
39
|
-
case "upi":
|
|
40
|
-
if (!payment_details.upi_id) {
|
|
41
|
-
return {
|
|
42
|
-
valid: false,
|
|
43
|
-
error: "UPI ID is required for UPI refund",
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
break;
|
|
47
|
-
case "wallet":
|
|
48
|
-
if (!payment_details.wallet) {
|
|
49
|
-
return {
|
|
50
|
-
valid: false,
|
|
51
|
-
error: "Wallet details are required for wallet refund",
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
if (!payment_details.wallet.wallet_id) {
|
|
55
|
-
return {
|
|
56
|
-
valid: false,
|
|
57
|
-
error: "Wallet ID is required",
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
return { valid: true };
|
|
63
|
-
}
|
|
64
|
-
createErrorResult(errorMessage, errorCode) {
|
|
65
|
-
return {
|
|
66
|
-
success: false,
|
|
67
|
-
error_message: errorMessage,
|
|
68
|
-
error_code: errorCode,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
createSuccessResult(transactionId, gatewayResponse) {
|
|
72
|
-
return {
|
|
73
|
-
success: true,
|
|
74
|
-
transaction_id: transactionId,
|
|
75
|
-
gateway_response: gatewayResponse,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
exports.BaseRefundProvider = BaseRefundProvider;
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1yZWZ1bmQtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3JlZnVuZC1wYXltZW50L2Jhc2UtcmVmdW5kLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU9BLE1BQXNCLGtCQUFrQjtJQUd0QyxZQUFZLFlBQW9CO1FBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO0lBQ2xDLENBQUM7SUFpQkQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUMxQixDQUFDO0lBRVMsc0JBQXNCLENBQzlCLGVBQXFDLEVBQ3JDLGNBQTZCO1FBRTdCLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUM5QyxPQUFPO2dCQUNMLEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFBRSxxQ0FBcUMsY0FBYyxTQUFTLGVBQWUsQ0FBQyxNQUFNLEVBQUU7YUFDNUYsQ0FBQTtRQUNILENBQUM7UUFFRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssZUFBZTtnQkFDbEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDbEMsT0FBTzt3QkFDTCxLQUFLLEVBQUUsS0FBSzt3QkFDWixLQUFLLEVBQUUscURBQXFEO3FCQUM3RCxDQUFBO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ2pELE9BQU87d0JBQ0wsS0FBSyxFQUFFLEtBQUs7d0JBQ1osS0FBSyxFQUFFLGlDQUFpQztxQkFDekMsQ0FBQTtnQkFDSCxDQUFDO2dCQUNELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQ3RELE9BQU87d0JBQ0wsS0FBSyxFQUFFLEtBQUs7d0JBQ1osS0FBSyxFQUFFLGlDQUFpQztxQkFDekMsQ0FBQTtnQkFDSCxDQUFDO2dCQUNELE1BQUs7WUFFUCxLQUFLLEtBQUs7Z0JBQ1IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDNUIsT0FBTzt3QkFDTCxLQUFLLEVBQUUsS0FBSzt3QkFDWixLQUFLLEVBQUUsbUNBQW1DO3FCQUMzQyxDQUFBO2dCQUNILENBQUM7Z0JBQ0QsTUFBSztZQUVQLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUM1QixPQUFPO3dCQUNMLEtBQUssRUFBRSxLQUFLO3dCQUNaLEtBQUssRUFBRSwrQ0FBK0M7cUJBQ3ZELENBQUE7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDdEMsT0FBTzt3QkFDTCxLQUFLLEVBQUUsS0FBSzt3QkFDWixLQUFLLEVBQUUsdUJBQXVCO3FCQUMvQixDQUFBO2dCQUNILENBQUM7Z0JBQ0QsTUFBSztRQUNULENBQUM7UUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQ3hCLENBQUM7SUFFUyxpQkFBaUIsQ0FDekIsWUFBb0IsRUFDcEIsU0FBa0I7UUFFbEIsT0FBTztZQUNMLE9BQU8sRUFBRSxLQUFLO1lBQ2QsYUFBYSxFQUFFLFlBQVk7WUFDM0IsVUFBVSxFQUFFLFNBQVM7U0FDdEIsQ0FBQTtJQUNILENBQUM7SUFFUyxtQkFBbUIsQ0FDM0IsYUFBcUIsRUFDckIsZUFBeUI7UUFFekIsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsY0FBYyxFQUFFLGFBQWE7WUFDN0IsZ0JBQWdCLEVBQUUsZUFBZTtTQUNsQyxDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBNUdELGdEQTRHQyJ9
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StripeRefundProvider = exports.RazorpayRefundProvider = exports.BaseRefundProvider = void 0;
|
|
4
|
-
exports.createRefundProviders = createRefundProviders;
|
|
5
|
-
exports.selectProvider = selectProvider;
|
|
6
|
-
const razorpay_provider_1 = require("./razorpay-provider");
|
|
7
|
-
const stripe_provider_1 = require("./stripe-provider");
|
|
8
|
-
var base_refund_provider_1 = require("./base-refund-provider");
|
|
9
|
-
Object.defineProperty(exports, "BaseRefundProvider", { enumerable: true, get: function () { return base_refund_provider_1.BaseRefundProvider; } });
|
|
10
|
-
var razorpay_provider_2 = require("./razorpay-provider");
|
|
11
|
-
Object.defineProperty(exports, "RazorpayRefundProvider", { enumerable: true, get: function () { return razorpay_provider_2.RazorpayRefundProvider; } });
|
|
12
|
-
var stripe_provider_2 = require("./stripe-provider");
|
|
13
|
-
Object.defineProperty(exports, "StripeRefundProvider", { enumerable: true, get: function () { return stripe_provider_2.StripeRefundProvider; } });
|
|
14
|
-
function createRefundProviders(config) {
|
|
15
|
-
const providers = [];
|
|
16
|
-
if (config.razorpay) {
|
|
17
|
-
providers.push(new razorpay_provider_1.RazorpayRefundProvider({
|
|
18
|
-
keyId: config.razorpay.keyId,
|
|
19
|
-
keySecret: config.razorpay.keySecret,
|
|
20
|
-
}));
|
|
21
|
-
}
|
|
22
|
-
if (config.stripe) {
|
|
23
|
-
providers.push(new stripe_provider_1.StripeRefundProvider({
|
|
24
|
-
apiKey: config.stripe.apiKey,
|
|
25
|
-
}));
|
|
26
|
-
}
|
|
27
|
-
return providers;
|
|
28
|
-
}
|
|
29
|
-
function selectProvider(providers, currencyCode, paymentMethod) {
|
|
30
|
-
for (const provider of providers) {
|
|
31
|
-
if (provider.supportsCurrency(currencyCode) &&
|
|
32
|
-
provider.supportsPaymentMethod(paymentMethod, currencyCode)) {
|
|
33
|
-
return provider;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3JlZnVuZC1wYXltZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW1CQSxzREF1QkM7QUFFRCx3Q0FrQkM7QUE3REQsMkRBQTREO0FBQzVELHVEQUF3RDtBQUd4RCwrREFBMkQ7QUFBbEQsMEhBQUEsa0JBQWtCLE9BQUE7QUFDM0IseURBQTREO0FBQW5ELDJIQUFBLHNCQUFzQixPQUFBO0FBQy9CLHFEQUF3RDtBQUEvQyx1SEFBQSxvQkFBb0IsT0FBQTtBQVk3QixTQUFnQixxQkFBcUIsQ0FDbkMsTUFBNEI7SUFFNUIsTUFBTSxTQUFTLEdBQTRCLEVBQUUsQ0FBQTtJQUU3QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQixTQUFTLENBQUMsSUFBSSxDQUNaLElBQUksMENBQXNCLENBQUM7WUFDekIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSztZQUM1QixTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTO1NBQ3JDLENBQUMsQ0FDSCxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLFNBQVMsQ0FBQyxJQUFJLENBQ1osSUFBSSxzQ0FBb0IsQ0FBQztZQUN2QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1NBQzdCLENBQUMsQ0FDSCxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQzVCLFNBQWtDLEVBQ2xDLFlBQW9CLEVBQ3BCLGFBQXFCO0lBRXJCLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7UUFDakMsSUFDRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FDNUIsYUFBNkQsRUFDN0QsWUFBWSxDQUNiLEVBQ0QsQ0FBQztZQUNELE9BQU8sUUFBUSxDQUFBO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIn0=
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RazorpayRefundProvider = void 0;
|
|
4
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
const base_refund_provider_1 = require("./base-refund-provider");
|
|
6
|
-
class RazorpayRefundProvider extends base_refund_provider_1.BaseRefundProvider {
|
|
7
|
-
constructor(config) {
|
|
8
|
-
super("razorpay");
|
|
9
|
-
this.config = config;
|
|
10
|
-
}
|
|
11
|
-
supportsCurrency(currency_code) {
|
|
12
|
-
// Razorpay primarily supports INR
|
|
13
|
-
return currency_code.toUpperCase() === "INR";
|
|
14
|
-
}
|
|
15
|
-
supportsPaymentMethod(method, currency_code) {
|
|
16
|
-
if (!this.supportsCurrency(currency_code)) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
// Razorpay supports UPI, Bank Transfer, and Wallets for INR
|
|
20
|
-
return ["upi", "bank_transfer", "wallet"].includes(method);
|
|
21
|
-
}
|
|
22
|
-
async processRefund(params) {
|
|
23
|
-
const { amount, currency_code, payment_details, return_id, order_id } = params;
|
|
24
|
-
// Validate currency
|
|
25
|
-
if (!this.supportsCurrency(currency_code)) {
|
|
26
|
-
return this.createErrorResult(`Razorpay does not support currency: ${currency_code}`, "UNSUPPORTED_CURRENCY");
|
|
27
|
-
}
|
|
28
|
-
// Validate payment method
|
|
29
|
-
if (!this.supportsPaymentMethod(payment_details.method, currency_code)) {
|
|
30
|
-
return this.createErrorResult(`Razorpay does not support payment method: ${payment_details.method} for currency: ${currency_code}`, "UNSUPPORTED_PAYMENT_METHOD");
|
|
31
|
-
}
|
|
32
|
-
// Validate payment details
|
|
33
|
-
const validation = this.validatePaymentDetails(payment_details, payment_details.method);
|
|
34
|
-
if (!validation.valid) {
|
|
35
|
-
return this.createErrorResult(validation.error || "Invalid payment details", "INVALID_PAYMENT_DETAILS");
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
// Process refund based on payment method
|
|
39
|
-
switch (payment_details.method) {
|
|
40
|
-
case "upi":
|
|
41
|
-
return await this.processUpiRefund(amount, payment_details.upi_id, return_id, order_id);
|
|
42
|
-
case "bank_transfer":
|
|
43
|
-
return await this.processBankTransferRefund(amount, payment_details.bank_account, return_id, order_id);
|
|
44
|
-
case "wallet":
|
|
45
|
-
return await this.processWalletRefund(amount, payment_details.wallet, return_id, order_id);
|
|
46
|
-
default:
|
|
47
|
-
return this.createErrorResult(`Unsupported payment method: ${payment_details.method}`, "UNSUPPORTED_PAYMENT_METHOD");
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
52
|
-
return this.createErrorResult(`Razorpay refund failed: ${errorMessage}`, "RAZORPAY_ERROR");
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
async processUpiRefund(amount, upiId, returnId, orderId) {
|
|
56
|
-
// TODO: Implement Razorpay UPI refund API call
|
|
57
|
-
// This is a placeholder - actual implementation requires Razorpay SDK
|
|
58
|
-
// Example:
|
|
59
|
-
// const razorpay = new Razorpay({ key_id: this.config.keyId, key_secret: this.config.keySecret })
|
|
60
|
-
// const payout = await razorpay.payouts.create({
|
|
61
|
-
// account_number: upiId,
|
|
62
|
-
// amount: amount * 100, // Convert to paise
|
|
63
|
-
// currency: 'INR',
|
|
64
|
-
// mode: 'UPI',
|
|
65
|
-
// purpose: 'refund',
|
|
66
|
-
// fund_account: { ... }
|
|
67
|
-
// })
|
|
68
|
-
// For now, return a mock success response
|
|
69
|
-
// In production, replace with actual Razorpay API call
|
|
70
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Razorpay UPI refund integration not yet implemented. Please install razorpay SDK and configure.");
|
|
71
|
-
}
|
|
72
|
-
async processBankTransferRefund(amount, bankAccount, returnId, orderId) {
|
|
73
|
-
// TODO: Implement Razorpay Bank Transfer (NEFT/IMPS) refund API call
|
|
74
|
-
// This is a placeholder - actual implementation requires Razorpay SDK
|
|
75
|
-
// Example:
|
|
76
|
-
// const razorpay = new Razorpay({ key_id: this.config.keyId, key_secret: this.config.keySecret })
|
|
77
|
-
// const payout = await razorpay.payouts.create({
|
|
78
|
-
// account_number: bankAccount.account_number,
|
|
79
|
-
// ifsc: bankAccount.ifsc_code,
|
|
80
|
-
// amount: amount * 100, // Convert to paise
|
|
81
|
-
// currency: 'INR',
|
|
82
|
-
// mode: 'NEFT', // or 'IMPS'
|
|
83
|
-
// purpose: 'refund',
|
|
84
|
-
// fund_account: { ... }
|
|
85
|
-
// })
|
|
86
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Razorpay Bank Transfer refund integration not yet implemented. Please install razorpay SDK and configure.");
|
|
87
|
-
}
|
|
88
|
-
async processWalletRefund(amount, wallet, returnId, orderId) {
|
|
89
|
-
// TODO: Implement Razorpay Wallet refund API call
|
|
90
|
-
// This is a placeholder - actual implementation requires Razorpay SDK
|
|
91
|
-
// Wallet refunds may require different API endpoints based on wallet type
|
|
92
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Razorpay Wallet refund integration not yet implemented. Please install razorpay SDK and configure.");
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
exports.RazorpayRefundProvider = RazorpayRefundProvider;
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF6b3JwYXktcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3JlZnVuZC1wYXltZW50L3Jhem9ycGF5LXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF1RDtBQUN2RCxpRUFBMkQ7QUFZM0QsTUFBYSxzQkFBdUIsU0FBUSx5Q0FBa0I7SUFHNUQsWUFBWSxNQUFzQjtRQUNoQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLGFBQXFCO1FBQ3BDLGtDQUFrQztRQUNsQyxPQUFPLGFBQWEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUE7SUFDOUMsQ0FBQztJQUVELHFCQUFxQixDQUNuQixNQUFxQixFQUNyQixhQUFxQjtRQUVyQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDMUMsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO1FBRUQsNERBQTREO1FBQzVELE9BQU8sQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQU1uQjtRQUNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQ25FLE1BQU0sQ0FBQTtRQUVSLG9CQUFvQjtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDMUMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQzNCLHVDQUF1QyxhQUFhLEVBQUUsRUFDdEQsc0JBQXNCLENBQ3ZCLENBQUE7UUFDSCxDQUFDO1FB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
|