order-management 0.0.1
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 +23 -0
- package/.medusa/server/src/admin/index.mjs +24 -0
- package/.medusa/server/src/api/admin/plugin/route.js +7 -0
- package/.medusa/server/src/api/store/plugin/route.js +7 -0
- package/.medusa/server/src/api/store/returns/[id]/payment-details/route.js +133 -0
- package/.medusa/server/src/config/plugin-options.js +59 -0
- package/.medusa/server/src/providers/refund-payment/base-refund-provider.js +80 -0
- package/.medusa/server/src/providers/refund-payment/index.js +38 -0
- package/.medusa/server/src/providers/refund-payment/razorpay-provider.js +96 -0
- package/.medusa/server/src/providers/refund-payment/stripe-provider.js +82 -0
- package/.medusa/server/src/subscribers/return-received.js +91 -0
- package/.medusa/server/src/types/plugin-options.js +3 -0
- package/.medusa/server/src/types/refund-payment.js +3 -0
- package/.medusa/server/src/workflows/index.js +11 -0
- package/.medusa/server/src/workflows/process-cod-refund-workflow.js +86 -0
- package/.medusa/server/src/workflows/steps/calculate-refund-amount-step.js +51 -0
- package/.medusa/server/src/workflows/steps/create-refund-record-step.js +193 -0
- package/.medusa/server/src/workflows/steps/process-refund-payment-step.js +87 -0
- package/.medusa/server/src/workflows/steps/retrieve-order-and-payment-step.js +44 -0
- package/.medusa/server/src/workflows/steps/retrieve-return-payment-details-step.js +56 -0
- package/.medusa/server/src/workflows/steps/select-payment-method-step.js +61 -0
- package/.medusa/server/src/workflows/steps/update-payment-status-step.js +45 -0
- package/.medusa/server/src/workflows/steps/validate-payment-details-step.js +90 -0
- package/.medusa/server/src/workflows/steps/verify-cod-order-step.js +39 -0
- package/.medusa/server/src/workflows/types.js +3 -0
- package/README.md +64 -0
- package/package.json +67 -0
|
@@ -0,0 +1,91 @@
|
|
|
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.config = void 0;
|
|
7
|
+
exports.default = returnReceivedHandler;
|
|
8
|
+
const process_cod_refund_workflow_1 = __importDefault(require("../workflows/process-cod-refund-workflow"));
|
|
9
|
+
/**
|
|
10
|
+
* Subscriber for return.updated events
|
|
11
|
+
*
|
|
12
|
+
* This subscriber listens to Medusa's built-in `return.updated` event
|
|
13
|
+
* and automatically processes COD refunds when return status changes to "received".
|
|
14
|
+
*
|
|
15
|
+
* Logic:
|
|
16
|
+
* - Listens to return.updated events
|
|
17
|
+
* - Checks if status changed to "received"
|
|
18
|
+
* - Verifies order is COD (via workflow)
|
|
19
|
+
* - Triggers COD refund workflow
|
|
20
|
+
* - Handles errors gracefully (doesn't break main flow)
|
|
21
|
+
*/
|
|
22
|
+
async function returnReceivedHandler({ event: { data }, container, }) {
|
|
23
|
+
const returnId = data.id;
|
|
24
|
+
const orderId = data.order_id;
|
|
25
|
+
const status = data.status;
|
|
26
|
+
const previousStatus = data.previous_status;
|
|
27
|
+
console.log(`[return-received] Event received for return: ${returnId}, order: ${orderId}, status: ${status}`);
|
|
28
|
+
if (!returnId) {
|
|
29
|
+
console.error("[return-received] No return ID in event data");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (!orderId) {
|
|
33
|
+
console.error("[return-received] No order ID in event data");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Only process if status is "received"
|
|
37
|
+
if (status !== "received") {
|
|
38
|
+
console.log(`[return-received] Return ${returnId} status is "${status}", not "received". Skipping COD refund processing.`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Check if status actually changed to "received" (avoid processing if already received)
|
|
42
|
+
if (previousStatus === "received") {
|
|
43
|
+
console.log(`[return-received] Return ${returnId} was already in "received" status. Skipping duplicate processing.`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
console.log(`[return-received] Processing COD refund for return ${returnId}, order ${orderId}`);
|
|
48
|
+
// Execute workflow to process COD refund
|
|
49
|
+
const { result } = await (0, process_cod_refund_workflow_1.default)(container).run({
|
|
50
|
+
input: {
|
|
51
|
+
return_id: returnId,
|
|
52
|
+
order_id: orderId,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
console.log(`[return-received] ✓ COD refund processed successfully for return ${returnId}:`, {
|
|
56
|
+
refund_id: result.refund_id,
|
|
57
|
+
amount: result.amount,
|
|
58
|
+
currency_code: result.currency_code,
|
|
59
|
+
order_id: result.order_id,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
// Log error but don't throw - subscriber errors shouldn't break the main flow
|
|
64
|
+
// The workflow will handle validation (e.g., if order is not COD, it will throw)
|
|
65
|
+
// We catch here to prevent breaking the return update flow
|
|
66
|
+
if (error instanceof Error) {
|
|
67
|
+
// Check if error is because order is not COD (expected case)
|
|
68
|
+
if (error.message.includes("COD") ||
|
|
69
|
+
error.message.includes("not COD") ||
|
|
70
|
+
error.message.includes("payment_type")) {
|
|
71
|
+
console.log(`[return-received] Order ${orderId} is not COD. Skipping refund processing:`, error.message);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Other errors should be logged
|
|
75
|
+
console.error(`[return-received] ✗ Error processing COD refund for return ${returnId}, order ${orderId}:`, error.message);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
console.error(`[return-received] ✗ Unknown error processing COD refund for return ${returnId}, order ${orderId}:`, error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Subscriber configuration
|
|
84
|
+
*
|
|
85
|
+
* Listens to Medusa's built-in return.updated event
|
|
86
|
+
* This event is triggered when a return status is updated.
|
|
87
|
+
*/
|
|
88
|
+
exports.config = {
|
|
89
|
+
event: "return.updated",
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0dXJuLXJlY2VpdmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL3JldHVybi1yZWNlaXZlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUE2QkEsd0NBMkZDO0FBcEhELDJHQUErRTtBQVkvRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDWSxLQUFLLFVBQVUscUJBQXFCLENBQUMsRUFDbEQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUM4QjtJQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFBO0lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUE7SUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFBO0lBRTNDLE9BQU8sQ0FBQyxHQUFHLENBQ1QsZ0RBQWdELFFBQVEsWUFBWSxPQUFPLGFBQWEsTUFBTSxFQUFFLENBQ2pHLENBQUE7SUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUE7UUFDN0QsT0FBTTtJQUNSLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDNUQsT0FBTTtJQUNSLENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsSUFBSSxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FDVCw0QkFBNEIsUUFBUSxlQUFlLE1BQU0sb0RBQW9ELENBQzlHLENBQUE7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUVELHdGQUF3RjtJQUN4RixJQUFJLGNBQWMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxPQUFPLENBQUMsR0FBRyxDQUNULDRCQUE0QixRQUFRLG1FQUFtRSxDQUN4RyxDQUFBO1FBQ0QsT0FBTTtJQUNSLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUNULHNEQUFzRCxRQUFRLFdBQVcsT0FBTyxFQUFFLENBQ25GLENBQUE7UUFFRCx5Q0FBeUM7UUFDekMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSxxQ0FBd0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDL0QsS0FBSyxFQUFFO2dCQUNMLFNBQVMsRUFBRSxRQUFRO2dCQUNuQixRQUFRLEVBQUUsT0FBTzthQUNsQjtTQUNGLENBQUMsQ0FBQTtRQUVGLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsb0VBQW9FLFFBQVEsR0FBRyxFQUMvRTtZQUNFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztZQUMzQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1lBQ25DLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtTQUMxQixDQUNGLENBQUE7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDhFQUE4RTtRQUM5RSxpRkFBaUY7UUFDakYsMkRBQTJEO1FBQzNELElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQzNCLDZEQUE2RDtZQUM3RCxJQUNFLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDN0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUNqQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFDdEMsQ0FBQztnQkFDRCxPQUFPLENBQUMsR0FBRyxDQUNULDJCQUEyQixPQUFPLDBDQUEwQyxFQUM1RSxLQUFLLENBQUMsT0FBTyxDQUNkLENBQUE7Z0JBQ0QsT0FBTTtZQUNSLENBQUM7WUFFRCxnQ0FBZ0M7WUFDaEMsT0FBTyxDQUFDLEtBQUssQ0FDWCw4REFBOEQsUUFBUSxXQUFXLE9BQU8sR0FBRyxFQUMzRixLQUFLLENBQUMsT0FBTyxDQUNkLENBQUE7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQ1gsc0VBQXNFLFFBQVEsV0FBVyxPQUFPLEdBQUcsRUFDbkcsS0FBSyxDQUNOLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNVLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsZ0JBQWdCO0NBQ3hCLENBQUEifQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMvcGx1Z2luLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmdW5kLXBheW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMvcmVmdW5kLXBheW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
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.default = exports.processCodRefundWorkflow = void 0;
|
|
7
|
+
var process_cod_refund_workflow_1 = require("./process-cod-refund-workflow");
|
|
8
|
+
Object.defineProperty(exports, "processCodRefundWorkflow", { enumerable: true, get: function () { return process_cod_refund_workflow_1.processCodRefundWorkflow; } });
|
|
9
|
+
var process_cod_refund_workflow_2 = require("./process-cod-refund-workflow");
|
|
10
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(process_cod_refund_workflow_2).default; } });
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZFQUF3RTtBQUEvRCx1SUFBQSx3QkFBd0IsT0FBQTtBQUNqQyw2RUFBdUQ7QUFBOUMsdUlBQUEsT0FBTyxPQUFBIn0=
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processCodRefundWorkflow = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const verify_cod_order_step_1 = require("./steps/verify-cod-order-step");
|
|
6
|
+
const retrieve_order_and_payment_step_1 = require("./steps/retrieve-order-and-payment-step");
|
|
7
|
+
const calculate_refund_amount_step_1 = require("./steps/calculate-refund-amount-step");
|
|
8
|
+
const retrieve_return_payment_details_step_1 = require("./steps/retrieve-return-payment-details-step");
|
|
9
|
+
const select_payment_method_step_1 = require("./steps/select-payment-method-step");
|
|
10
|
+
const validate_payment_details_step_1 = require("./steps/validate-payment-details-step");
|
|
11
|
+
const process_refund_payment_step_1 = require("./steps/process-refund-payment-step");
|
|
12
|
+
const create_refund_record_step_1 = require("./steps/create-refund-record-step");
|
|
13
|
+
const update_payment_status_step_1 = require("./steps/update-payment-status-step");
|
|
14
|
+
exports.processCodRefundWorkflow = (0, workflows_sdk_1.createWorkflow)("process-cod-refund", (input) => {
|
|
15
|
+
// Step 1: Verify order is COD
|
|
16
|
+
const { is_cod } = (0, verify_cod_order_step_1.verifyCodOrderStep)({
|
|
17
|
+
order_id: input.order_id,
|
|
18
|
+
});
|
|
19
|
+
// If not COD, the step will throw an error, so we don't need to check here
|
|
20
|
+
// The workflow will fail gracefully if order is not COD
|
|
21
|
+
// Step 2: Retrieve order and payment with currency
|
|
22
|
+
const { order, payment_collection, currency_code } = (0, retrieve_order_and_payment_step_1.retrieveOrderAndPaymentStep)({
|
|
23
|
+
order_id: input.order_id,
|
|
24
|
+
});
|
|
25
|
+
// Step 3: Calculate refund amount
|
|
26
|
+
const { amount, currency_code: refundCurrency } = (0, calculate_refund_amount_step_1.calculateRefundAmountStep)({
|
|
27
|
+
return_id: input.return_id,
|
|
28
|
+
order_id: input.order_id,
|
|
29
|
+
currency_code,
|
|
30
|
+
});
|
|
31
|
+
// Step 4: Retrieve payment details from return
|
|
32
|
+
const { payment_details, has_payment_details } = (0, retrieve_return_payment_details_step_1.retrieveReturnPaymentDetailsStep)({
|
|
33
|
+
return_id: input.return_id,
|
|
34
|
+
order_id: input.order_id,
|
|
35
|
+
});
|
|
36
|
+
// If payment details are not provided, skip payment processing
|
|
37
|
+
// This allows the workflow to still create refund records for manual processing
|
|
38
|
+
let transaction_id;
|
|
39
|
+
if (has_payment_details && payment_details) {
|
|
40
|
+
// Step 5: Validate payment method is supported for currency
|
|
41
|
+
const { selected_method, payment_details: validatedPaymentDetails } = (0, select_payment_method_step_1.selectPaymentMethodStep)({
|
|
42
|
+
currency_code: refundCurrency,
|
|
43
|
+
payment_details,
|
|
44
|
+
});
|
|
45
|
+
// Step 6: Validate payment details format
|
|
46
|
+
const { payment_details: finalPaymentDetails } = (0, validate_payment_details_step_1.validatePaymentDetailsStep)({
|
|
47
|
+
payment_details: validatedPaymentDetails,
|
|
48
|
+
payment_method: selected_method,
|
|
49
|
+
currency_code: refundCurrency,
|
|
50
|
+
});
|
|
51
|
+
// Step 7: Process actual refund via payment gateway
|
|
52
|
+
// Provider selection happens here based on configured providers
|
|
53
|
+
const { refund_result, transaction_id: gatewayTransactionId } = (0, process_refund_payment_step_1.processRefundPaymentStep)({
|
|
54
|
+
amount,
|
|
55
|
+
currency_code: refundCurrency,
|
|
56
|
+
payment_details: finalPaymentDetails,
|
|
57
|
+
payment_method: selected_method,
|
|
58
|
+
return_id: input.return_id,
|
|
59
|
+
order_id: input.order_id,
|
|
60
|
+
});
|
|
61
|
+
transaction_id = gatewayTransactionId;
|
|
62
|
+
}
|
|
63
|
+
// Step 8: Create refund record with transaction ID
|
|
64
|
+
const { refund_id, amount: refundAmount, currency_code: refundCurrencyCode } = (0, create_refund_record_step_1.createRefundRecordStep)({
|
|
65
|
+
payment_collection_id: payment_collection.id,
|
|
66
|
+
amount,
|
|
67
|
+
currency_code: refundCurrency,
|
|
68
|
+
order_id: input.order_id,
|
|
69
|
+
return_id: input.return_id,
|
|
70
|
+
transaction_id, // Include gateway transaction ID
|
|
71
|
+
});
|
|
72
|
+
// Step 9: Update payment status
|
|
73
|
+
(0, update_payment_status_step_1.updatePaymentStatusStep)({
|
|
74
|
+
payment_collection_id: payment_collection.id,
|
|
75
|
+
refund_id,
|
|
76
|
+
refund_amount: refundAmount,
|
|
77
|
+
});
|
|
78
|
+
return new workflows_sdk_1.WorkflowResponse({
|
|
79
|
+
refund_id,
|
|
80
|
+
amount: refundAmount,
|
|
81
|
+
currency_code: refundCurrencyCode,
|
|
82
|
+
order_id: input.order_id,
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
exports.default = exports.processCodRefundWorkflow;
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1jb2QtcmVmdW5kLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9wcm9jZXNzLWNvZC1yZWZ1bmQtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBRzBDO0FBQzFDLHlFQUVzQztBQUN0Qyw2RkFFZ0Q7QUFDaEQsdUZBRTZDO0FBQzdDLHVHQUVxRDtBQUNyRCxtRkFFMkM7QUFDM0MseUZBRThDO0FBQzlDLHFGQUU0QztBQUM1QyxpRkFFMEM7QUFDMUMsbUZBRTJDO0FBTTlCLFFBQUEsd0JBQXdCLEdBQUcsSUFBQSw4QkFBYyxFQUNwRCxvQkFBb0IsRUFDcEIsQ0FDRSxLQUFvQyxFQUNjLEVBQUU7SUFDcEQsOEJBQThCO0lBQzlCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLDBDQUFrQixFQUFDO1FBQ3BDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtLQUN6QixDQUFDLENBQUE7SUFFRiwyRUFBMkU7SUFDM0Usd0RBQXdEO0lBRXhELG1EQUFtRDtJQUNuRCxNQUFNLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxHQUNoRCxJQUFBLDZEQUEyQixFQUFDO1FBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtLQUN6QixDQUFDLENBQUE7SUFFSixrQ0FBa0M7SUFDbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQzdDLElBQUEsd0RBQXlCLEVBQUM7UUFDeEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtRQUN4QixhQUFhO0tBQ2QsQ0FBQyxDQUFBO0lBRUosK0NBQStDO0lBQy9DLE1BQU0sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsR0FDNUMsSUFBQSx1RUFBZ0MsRUFBQztRQUMvQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO0tBQ3pCLENBQUMsQ0FBQTtJQUVKLCtEQUErRDtJQUMvRCxnRkFBZ0Y7SUFDaEYsSUFBSSxjQUFrQyxDQUFBO0lBRXRDLElBQUksbUJBQW1CLElBQUksZUFBZSxFQUFFLENBQUM7UUFDM0MsNERBQTREO1FBQzVELE1BQU0sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLHVCQUF1QixFQUFFLEdBQ2pFLElBQUEsb0RBQXVCLEVBQUM7WUFDdEIsYUFBYSxFQUFFLGNBQWM7WUFDN0IsZUFBZTtTQUNoQixDQUFDLENBQUE7UUFFSiwwQ0FBMEM7UUFDMUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxHQUM1QyxJQUFBLDBEQUEwQixFQUFDO1lBQ3pCLGVBQWUsRUFBRSx1QkFBdUI7WUFDeEMsY0FBYyxFQUFFLGVBQWU7WUFDL0IsYUFBYSxFQUFFLGNBQWM7U0FDOUIsQ0FBQyxDQUFBO1FBRUosb0RBQW9EO1FBQ3BELGdFQUFnRTtRQUNoRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxHQUMzRCxJQUFBLHNEQUF3QixFQUFDO1lBQ3ZCLE1BQU07WUFDTixhQUFhLEVBQUUsY0FBYztZQUM3QixlQUFlLEVBQUUsbUJBQW1CO1lBQ3BDLGNBQWMsRUFBRSxlQUFlO1lBQy9CLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7U0FDekIsQ0FBQyxDQUFBO1FBRUosY0FBYyxHQUFHLG9CQUFvQixDQUFBO0lBQ3ZDLENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxHQUMxRSxJQUFBLGtEQUFzQixFQUFDO1FBQ3JCLHFCQUFxQixFQUFHLGtCQUFxQyxDQUFDLEVBQUU7UUFDaEUsTUFBTTtRQUNOLGFBQWEsRUFBRSxjQUFjO1FBQzdCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtRQUN4QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDMUIsY0FBYyxFQUFFLGlDQUFpQztLQUNsRCxDQUFDLENBQUE7SUFFSixnQ0FBZ0M7SUFDaEMsSUFBQSxvREFBdUIsRUFBQztRQUN0QixxQkFBcUIsRUFBRyxrQkFBcUMsQ0FBQyxFQUFFO1FBQ2hFLFNBQVM7UUFDVCxhQUFhLEVBQUUsWUFBWTtLQUM1QixDQUFDLENBQUE7SUFFRixPQUFPLElBQUksZ0NBQWdCLENBQWlDO1FBQzFELFNBQVM7UUFDVCxNQUFNLEVBQUUsWUFBWTtRQUNwQixhQUFhLEVBQUUsa0JBQWtCO1FBQ2pDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtLQUN6QixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLGdDQUF3QixDQUFBIn0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateRefundAmountStep = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
7
|
+
exports.calculateRefundAmountStep = (0, workflows_sdk_1.createStep)("calculate-refund-amount", async (input, { container }) => {
|
|
8
|
+
const { return_id, order_id, currency_code } = input;
|
|
9
|
+
if (!return_id) {
|
|
10
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Return ID is required to calculate refund amount");
|
|
11
|
+
}
|
|
12
|
+
if (!currency_code) {
|
|
13
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Currency code is required to calculate refund amount");
|
|
14
|
+
}
|
|
15
|
+
const orderService = container.resolve(utils_2.Modules.ORDER);
|
|
16
|
+
// Retrieve return with items
|
|
17
|
+
// Note: In Medusa v2, returns are part of the order module
|
|
18
|
+
// We need to retrieve the return and calculate refund from return items
|
|
19
|
+
const order = await orderService.retrieveOrder(order_id, {
|
|
20
|
+
relations: ["returns", "returns.items", "items"],
|
|
21
|
+
});
|
|
22
|
+
if (!order) {
|
|
23
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Order with ID ${order_id} not found`);
|
|
24
|
+
}
|
|
25
|
+
// Find the return by ID
|
|
26
|
+
// Type assertion needed because returns relation is not in OrderDTO type definition
|
|
27
|
+
// even though we requested it via relations
|
|
28
|
+
const orderWithReturns = order;
|
|
29
|
+
const returns = orderWithReturns.returns || [];
|
|
30
|
+
const returnRecord = returns.find((ret) => ret.id === return_id);
|
|
31
|
+
if (!returnRecord) {
|
|
32
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Return with ID ${return_id} not found for order ${order_id}`);
|
|
33
|
+
}
|
|
34
|
+
// Get refund amount from return
|
|
35
|
+
// Returns have a refund_amount field that is calculated when return is created
|
|
36
|
+
const refundAmount = returnRecord.refund_amount ?? 0;
|
|
37
|
+
if (refundAmount <= 0) {
|
|
38
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Return ${return_id} has invalid refund amount: ${refundAmount}`);
|
|
39
|
+
}
|
|
40
|
+
// Verify currency matches
|
|
41
|
+
const returnCurrency = returnRecord.currency_code ||
|
|
42
|
+
currency_code;
|
|
43
|
+
if (returnCurrency !== currency_code) {
|
|
44
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Currency mismatch: return currency ${returnCurrency} does not match order currency ${currency_code}`);
|
|
45
|
+
}
|
|
46
|
+
return new workflows_sdk_1.StepResponse({
|
|
47
|
+
amount: refundAmount,
|
|
48
|
+
currency_code: currency_code,
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLXJlZnVuZC1hbW91bnQtc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvY2FsY3VsYXRlLXJlZnVuZC1hbW91bnQtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFDdkQscUVBQTRFO0FBQzVFLHFEQUFtRDtBQVV0QyxRQUFBLHlCQUF5QixHQUFHLElBQUEsMEJBQVUsRUFDakQseUJBQXlCLEVBQ3pCLEtBQUssRUFDSCxLQUFxQyxFQUNyQyxFQUFFLFNBQVMsRUFBRSxFQUMyQyxFQUFFO0lBQzFELE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUVwRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixrREFBa0QsQ0FDbkQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsc0RBQXNELENBQ3ZELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDcEMsZUFBTyxDQUFDLEtBQUssQ0FDZCxDQUFBO0lBRUQsNkJBQTZCO0lBQzdCLDJEQUEyRDtJQUMzRCx3RUFBd0U7SUFDeEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtRQUN2RCxTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQztLQUNqRCxDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixpQkFBaUIsUUFBUSxZQUFZLENBQ3RDLENBQUE7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLG9GQUFvRjtJQUNwRiw0Q0FBNEM7SUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxLQUEyQyxDQUFBO0lBQ3BFLE1BQU0sT0FBTyxHQUFJLGdCQUFnQixDQUFDLE9BQXFCLElBQUksRUFBRSxDQUFBO0lBQzdELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQy9CLENBQUMsR0FBbUIsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQzlDLENBQUE7SUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0Isa0JBQWtCLFNBQVMsd0JBQXdCLFFBQVEsRUFBRSxDQUM5RCxDQUFBO0lBQ0gsQ0FBQztJQUVELGdDQUFnQztJQUNoQywrRUFBK0U7SUFDL0UsTUFBTSxZQUFZLEdBQ2YsWUFBMkMsQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFBO0lBRWpFLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLFVBQVUsU0FBUywrQkFBK0IsWUFBWSxFQUFFLENBQ2pFLENBQUE7SUFDSCxDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLE1BQU0sY0FBYyxHQUNqQixZQUEyQyxDQUFDLGFBQWE7UUFDMUQsYUFBYSxDQUFBO0lBRWYsSUFBSSxjQUFjLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsc0NBQXNDLGNBQWMsa0NBQWtDLGFBQWEsRUFBRSxDQUN0RyxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFrQztRQUN2RCxNQUFNLEVBQUUsWUFBWTtRQUNwQixhQUFhLEVBQUUsYUFBYTtLQUM3QixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQSJ9
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRefundRecordStep = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
7
|
+
exports.createRefundRecordStep = (0, workflows_sdk_1.createStep)("create-refund-record", async (input, { container }) => {
|
|
8
|
+
const { payment_collection_id, amount, currency_code, order_id, return_id, transaction_id, } = input;
|
|
9
|
+
if (!payment_collection_id) {
|
|
10
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Payment collection ID is required to create refund record");
|
|
11
|
+
}
|
|
12
|
+
if (!amount || amount <= 0) {
|
|
13
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invalid refund amount: ${amount}. Amount must be greater than 0`);
|
|
14
|
+
}
|
|
15
|
+
if (!currency_code) {
|
|
16
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Currency code is required to create refund record");
|
|
17
|
+
}
|
|
18
|
+
const paymentService = container.resolve(utils_2.Modules.PAYMENT);
|
|
19
|
+
const orderService = container.resolve(utils_2.Modules.ORDER);
|
|
20
|
+
// Retrieve return record to get timing information for Medusa refund detection
|
|
21
|
+
const order = await orderService.retrieveOrder(order_id, {
|
|
22
|
+
relations: ["returns"],
|
|
23
|
+
});
|
|
24
|
+
if (!order) {
|
|
25
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Order with ID ${order_id} not found`);
|
|
26
|
+
}
|
|
27
|
+
// Find the return record
|
|
28
|
+
const orderWithReturns = order;
|
|
29
|
+
const returns = orderWithReturns.returns || [];
|
|
30
|
+
const returnRecord = returns.find((ret) => ret.id === return_id);
|
|
31
|
+
if (!returnRecord) {
|
|
32
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Return with ID ${return_id} not found for order ${order_id}`);
|
|
33
|
+
}
|
|
34
|
+
// Get return updated_at for timing comparison (when status changed to "received")
|
|
35
|
+
const returnUpdatedAt = returnRecord.updated_at;
|
|
36
|
+
// Check if refund already exists for this return (idempotency)
|
|
37
|
+
const paymentCollection = await paymentService.retrievePaymentCollection(payment_collection_id, {
|
|
38
|
+
relations: ["refunds"],
|
|
39
|
+
});
|
|
40
|
+
if (!paymentCollection) {
|
|
41
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Payment collection ${payment_collection_id} not found`);
|
|
42
|
+
}
|
|
43
|
+
// Check for existing refunds linked to this return (Medusa's or ours)
|
|
44
|
+
// Type assertion needed because refunds relation is not in PaymentCollectionDTO type definition
|
|
45
|
+
// even though we requested it via relations
|
|
46
|
+
const paymentCollectionWithRefunds = paymentCollection;
|
|
47
|
+
const refunds = paymentCollectionWithRefunds.refunds || [];
|
|
48
|
+
// Enhanced detection: Check for our refund OR Medusa's refund
|
|
49
|
+
const existingRefund = refunds.find((refund) => {
|
|
50
|
+
const refundData = refund;
|
|
51
|
+
// Check if it's our refund (has return_id in metadata)
|
|
52
|
+
const metadata = refundData.metadata;
|
|
53
|
+
if (metadata?.return_id === return_id) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
// Check if it's Medusa's refund (matches amount, currency, and timing)
|
|
57
|
+
const refundAmount = refundData.amount;
|
|
58
|
+
const refundCurrency = refundData.currency_code;
|
|
59
|
+
const refundCreatedAt = refundData.created_at;
|
|
60
|
+
// If amount and currency match, check timing
|
|
61
|
+
if (refundAmount === amount &&
|
|
62
|
+
refundCurrency === currency_code &&
|
|
63
|
+
refundCreatedAt &&
|
|
64
|
+
returnUpdatedAt) {
|
|
65
|
+
const timeDiff = Math.abs(new Date(refundCreatedAt).getTime() -
|
|
66
|
+
new Date(returnUpdatedAt).getTime());
|
|
67
|
+
// Created within 5 minutes of return status change to "received"
|
|
68
|
+
// This indicates Medusa automatically created the refund
|
|
69
|
+
if (timeDiff < 5 * 60 * 1000) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
});
|
|
75
|
+
if (existingRefund) {
|
|
76
|
+
// Refund already exists (either ours or Medusa's), use it
|
|
77
|
+
const refundData = existingRefund;
|
|
78
|
+
const refundId = refundData.id;
|
|
79
|
+
const refundAmount = refundData.amount ?? amount;
|
|
80
|
+
const refundCurrency = refundData.currency_code ?? currency_code;
|
|
81
|
+
// If we have a gateway transaction_id, update the refund metadata
|
|
82
|
+
if (transaction_id) {
|
|
83
|
+
const currentMetadata = refundData.metadata || {};
|
|
84
|
+
// Update refund metadata with gateway transaction info
|
|
85
|
+
const updatedMetadata = {
|
|
86
|
+
...currentMetadata,
|
|
87
|
+
transaction_id,
|
|
88
|
+
processed_via_gateway: true,
|
|
89
|
+
gateway_transaction_added_at: new Date().toISOString(),
|
|
90
|
+
return_id, // Ensure return_id is in metadata
|
|
91
|
+
order_id,
|
|
92
|
+
payment_type: "cod",
|
|
93
|
+
};
|
|
94
|
+
// Try to update refund metadata via payment collection
|
|
95
|
+
// Note: We update payment collection metadata as fallback since
|
|
96
|
+
// direct refund update may not be available
|
|
97
|
+
const paymentCollectionMetadata = paymentCollection.metadata || {};
|
|
98
|
+
// Store gateway transaction info in payment collection metadata
|
|
99
|
+
await paymentService.updatePaymentCollection?.(payment_collection_id, {
|
|
100
|
+
metadata: {
|
|
101
|
+
...paymentCollectionMetadata,
|
|
102
|
+
refund_transactions: {
|
|
103
|
+
...(paymentCollectionMetadata.refund_transactions || {}),
|
|
104
|
+
[refundId]: {
|
|
105
|
+
transaction_id,
|
|
106
|
+
processed_via_gateway: true,
|
|
107
|
+
updated_at: new Date().toISOString(),
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return new workflows_sdk_1.StepResponse({
|
|
114
|
+
refund_id: refundId,
|
|
115
|
+
amount: refundAmount,
|
|
116
|
+
currency_code: refundCurrency,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Get payments from collection to link refund
|
|
120
|
+
const payments = paymentCollection.payments || [];
|
|
121
|
+
const payment = payments.find((p) => p.captured_at !== null);
|
|
122
|
+
if (!payment) {
|
|
123
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `No captured payment found in payment collection ${payment_collection_id}`);
|
|
124
|
+
}
|
|
125
|
+
const paymentId = payment.id;
|
|
126
|
+
// Create refund record
|
|
127
|
+
// Note: Medusa v2 payment module may use different method names
|
|
128
|
+
// Try createRefunds (plural) or store refund info in payment collection metadata
|
|
129
|
+
let refundId;
|
|
130
|
+
let refundAmount = amount;
|
|
131
|
+
let refundCurrency = currency_code;
|
|
132
|
+
try {
|
|
133
|
+
// Try createRefunds (plural) method if available
|
|
134
|
+
const refunds = await paymentService.createRefunds?.([
|
|
135
|
+
{
|
|
136
|
+
payment_id: paymentId,
|
|
137
|
+
amount,
|
|
138
|
+
currency_code,
|
|
139
|
+
created_by: "system",
|
|
140
|
+
metadata: {
|
|
141
|
+
return_id,
|
|
142
|
+
order_id,
|
|
143
|
+
payment_type: "cod",
|
|
144
|
+
refund_type: "return",
|
|
145
|
+
transaction_id,
|
|
146
|
+
processed_via_gateway: transaction_id ? true : false,
|
|
147
|
+
refund_status: transaction_id ? "succeeded" : "pending",
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
]);
|
|
151
|
+
if (refunds && Array.isArray(refunds) && refunds.length > 0) {
|
|
152
|
+
const refund = refunds[0];
|
|
153
|
+
refundId = refund.id;
|
|
154
|
+
refundAmount = refund.amount ?? amount;
|
|
155
|
+
refundCurrency = refund.currency_code ?? currency_code;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
// Fallback: Generate a refund ID and store in metadata
|
|
159
|
+
refundId = `refund_${return_id}_${Date.now()}`;
|
|
160
|
+
// Store refund info in payment collection metadata as fallback
|
|
161
|
+
const currentMetadata = paymentCollection.metadata || {};
|
|
162
|
+
await paymentService.updatePaymentCollection?.(payment_collection_id, {
|
|
163
|
+
metadata: {
|
|
164
|
+
...currentMetadata,
|
|
165
|
+
refunds: [
|
|
166
|
+
...(currentMetadata.refunds || []),
|
|
167
|
+
{
|
|
168
|
+
id: refundId,
|
|
169
|
+
payment_id: paymentId,
|
|
170
|
+
amount,
|
|
171
|
+
currency_code,
|
|
172
|
+
return_id,
|
|
173
|
+
order_id,
|
|
174
|
+
transaction_id,
|
|
175
|
+
created_at: new Date().toISOString(),
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
// If refund creation fails, generate ID and log
|
|
184
|
+
refundId = `refund_${return_id}_${Date.now()}`;
|
|
185
|
+
console.warn(`Could not create refund via payment service, using fallback ID: ${refundId}`, error);
|
|
186
|
+
}
|
|
187
|
+
return new workflows_sdk_1.StepResponse({
|
|
188
|
+
refund_id: refundId,
|
|
189
|
+
amount: refundAmount,
|
|
190
|
+
currency_code: refundCurrency,
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXJlZnVuZC1yZWNvcmQtc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvY3JlYXRlLXJlZnVuZC1yZWNvcmQtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFDdkQscUVBQTRFO0FBQzVFLHFEQUFtRDtBQWdCdEMsUUFBQSxzQkFBc0IsR0FBRyxJQUFBLDBCQUFVLEVBQzlDLHNCQUFzQixFQUN0QixLQUFLLEVBQ0gsS0FBa0MsRUFDbEMsRUFBRSxTQUFTLEVBQUUsRUFDd0MsRUFBRTtJQUN2RCxNQUFNLEVBQ0oscUJBQXFCLEVBQ3JCLE1BQU0sRUFDTixhQUFhLEVBQ2IsUUFBUSxFQUNSLFNBQVMsRUFDVCxjQUFjLEdBQ2YsR0FBRyxLQUFLLENBQUE7SUFFVCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QiwyREFBMkQsQ0FDNUQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QiwwQkFBMEIsTUFBTSxpQ0FBaUMsQ0FDbEUsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbURBQW1ELENBQ3BELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDdEMsZUFBTyxDQUFDLE9BQU8sQ0FDaEIsQ0FBQTtJQUVELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXNC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
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processRefundPaymentStep = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
7
|
+
const refund_payment_1 = require("../../providers/refund-payment");
|
|
8
|
+
const plugin_options_1 = require("../../config/plugin-options");
|
|
9
|
+
exports.processRefundPaymentStep = (0, workflows_sdk_1.createStep)("process-refund-payment", async (input, { container }) => {
|
|
10
|
+
const { amount, currency_code, payment_details, payment_method, return_id, order_id, } = input;
|
|
11
|
+
if (!amount || amount <= 0) {
|
|
12
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invalid refund amount: ${amount}`);
|
|
13
|
+
}
|
|
14
|
+
// Get plugin options from config module
|
|
15
|
+
const configModule = container.resolve(utils_2.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
16
|
+
const pluginOptions = (0, plugin_options_1.resolveOrderManagementOptions)(configModule);
|
|
17
|
+
// Build provider config from plugin options or environment variables (backward compatibility)
|
|
18
|
+
const providerConfig = {
|
|
19
|
+
razorpay: pluginOptions.refundProviders?.credentials?.razorpay ||
|
|
20
|
+
(process.env.RAZORPAY_KEY_ID && process.env.RAZORPAY_KEY_SECRET
|
|
21
|
+
? {
|
|
22
|
+
keyId: process.env.RAZORPAY_KEY_ID,
|
|
23
|
+
keySecret: process.env.RAZORPAY_KEY_SECRET,
|
|
24
|
+
}
|
|
25
|
+
: undefined),
|
|
26
|
+
stripe: pluginOptions.refundProviders?.credentials?.stripe ||
|
|
27
|
+
(process.env.STRIPE_API_KEY
|
|
28
|
+
? {
|
|
29
|
+
apiKey: process.env.STRIPE_API_KEY,
|
|
30
|
+
}
|
|
31
|
+
: undefined),
|
|
32
|
+
};
|
|
33
|
+
// Filter providers based on enabled list (if specified)
|
|
34
|
+
const enabledProviders = pluginOptions.refundProviders?.enabled;
|
|
35
|
+
if (enabledProviders && enabledProviders.length > 0) {
|
|
36
|
+
// Only enable providers that are in the enabled list
|
|
37
|
+
if (!enabledProviders.includes("razorpay")) {
|
|
38
|
+
providerConfig.razorpay = undefined;
|
|
39
|
+
}
|
|
40
|
+
if (!enabledProviders.includes("stripe")) {
|
|
41
|
+
providerConfig.stripe = undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Create providers
|
|
45
|
+
const providers = (0, refund_payment_1.createRefundProviders)(providerConfig);
|
|
46
|
+
if (providers.length === 0) {
|
|
47
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "No payment providers configured. Please configure at least one payment provider (Razorpay or Stripe) via plugin options or environment variables.");
|
|
48
|
+
}
|
|
49
|
+
// Filter by enabled providers if specified
|
|
50
|
+
const availableProviders = enabledProviders && enabledProviders.length > 0
|
|
51
|
+
? providers.filter((p) => enabledProviders.includes(p.getName()))
|
|
52
|
+
: providers;
|
|
53
|
+
// Select appropriate provider that supports currency + payment method
|
|
54
|
+
let selectedProvider = (0, refund_payment_1.selectProvider)(availableProviders, currency_code, payment_method);
|
|
55
|
+
// Fallback logic if no provider found: prefer provider based on currency
|
|
56
|
+
if (!selectedProvider) {
|
|
57
|
+
if (currency_code.toUpperCase() === "INR") {
|
|
58
|
+
// For INR, prefer Razorpay if available
|
|
59
|
+
selectedProvider =
|
|
60
|
+
availableProviders.find((p) => p.getName() === "razorpay") || null;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// For other currencies, prefer Stripe if available
|
|
64
|
+
selectedProvider =
|
|
65
|
+
availableProviders.find((p) => p.getName() === "stripe") || null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!selectedProvider) {
|
|
69
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `No payment provider found that supports ${payment_method} for currency ${currency_code}. Available providers: ${availableProviders.map((p) => p.getName()).join(", ")}`);
|
|
70
|
+
}
|
|
71
|
+
// Process refund
|
|
72
|
+
const refundResult = await selectedProvider.processRefund({
|
|
73
|
+
amount,
|
|
74
|
+
currency_code,
|
|
75
|
+
payment_details,
|
|
76
|
+
return_id,
|
|
77
|
+
order_id,
|
|
78
|
+
});
|
|
79
|
+
if (!refundResult.success) {
|
|
80
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Refund processing failed: ${refundResult.error_message || "Unknown error"}`, refundResult.error_code);
|
|
81
|
+
}
|
|
82
|
+
return new workflows_sdk_1.StepResponse({
|
|
83
|
+
refund_result: refundResult,
|
|
84
|
+
transaction_id: refundResult.transaction_id,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1yZWZ1bmQtcGF5bWVudC1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9wcm9jZXNzLXJlZnVuZC1wYXltZW50LXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXVEO0FBQ3ZELHFFQUE0RTtBQUM1RSxxREFBcUU7QUFFckUsbUVBSXVDO0FBQ3ZDLGdFQUdvQztBQWdCdkIsUUFBQSx3QkFBd0IsR0FBRyxJQUFBLDBCQUFVLEVBQ2hELHdCQUF3QixFQUN4QixLQUFLLEVBQ0gsS0FBb0MsRUFDcEMsRUFBRSxTQUFTLEVBQUUsRUFDMEMsRUFBRTtJQUN6RCxNQUFNLEVBQ0osTUFBTSxFQUNOLGFBQWEsRUFDYixlQUFlLEVBQ2YsY0FBYyxFQUNkLFNBQVMsRUFDVCxRQUFRLEdBQ1QsR0FBRyxLQUFLLENBQUE7SUFFVCxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QiwwQkFBMEIsTUFBTSxFQUFFLENBQ25DLENBQUE7SUFDSCxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3BDLGlDQUF5QixDQUFDLGFBQWEsQ0FDeEMsQ0FBQTtJQUNELE1BQU0sYUFBYSxHQUFHLElBQUEsOENBQTZCLEVBQ2pELFlBQWlDLENBQ2xDLENBQUE7SUFFRCw4RkFBOEY7SUFDOUYsTUFBTSxjQUFjLEdBQXlCO1FBQzNDLFFBQVEsRUFDTixhQUFhLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxRQUFRO1lBQ3BELENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7Z0JBQzdELENBQUMsQ0FBQztvQkFDRSxLQUFLLEVB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
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retrieveOrderAndPaymentStep = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
7
|
+
exports.retrieveOrderAndPaymentStep = (0, workflows_sdk_1.createStep)("retrieve-order-and-payment", async (input, { container }) => {
|
|
8
|
+
const { order_id } = input;
|
|
9
|
+
if (!order_id) {
|
|
10
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order ID is required to retrieve order and payment");
|
|
11
|
+
}
|
|
12
|
+
const orderService = container.resolve(utils_2.Modules.ORDER);
|
|
13
|
+
const paymentService = container.resolve(utils_2.Modules.PAYMENT);
|
|
14
|
+
// Retrieve order with payment collection
|
|
15
|
+
const order = await orderService.retrieveOrder(order_id, {
|
|
16
|
+
relations: ["payment_collection"],
|
|
17
|
+
});
|
|
18
|
+
if (!order) {
|
|
19
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Order with ID ${order_id} not found`);
|
|
20
|
+
}
|
|
21
|
+
// Extract currency code from order
|
|
22
|
+
const currencyCode = order.currency_code;
|
|
23
|
+
if (!currencyCode) {
|
|
24
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Order ${order_id} does not have a currency code`);
|
|
25
|
+
}
|
|
26
|
+
// Retrieve payment collection
|
|
27
|
+
const orderWithPayment = order;
|
|
28
|
+
const paymentCollectionId = orderWithPayment.payment_collection_id;
|
|
29
|
+
if (!paymentCollectionId) {
|
|
30
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Order ${order_id} does not have a payment collection`);
|
|
31
|
+
}
|
|
32
|
+
const paymentCollection = await paymentService.retrievePaymentCollection(paymentCollectionId, {
|
|
33
|
+
relations: ["payments", "payment_providers"],
|
|
34
|
+
});
|
|
35
|
+
if (!paymentCollection) {
|
|
36
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Payment collection ${paymentCollectionId} not found`);
|
|
37
|
+
}
|
|
38
|
+
return new workflows_sdk_1.StepResponse({
|
|
39
|
+
order,
|
|
40
|
+
payment_collection: paymentCollection,
|
|
41
|
+
currency_code: currencyCode,
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cmlldmUtb3JkZXItYW5kLXBheW1lbnQtc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvcmV0cmlldmUtb3JkZXItYW5kLXBheW1lbnQtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFDdkQscUVBQTRFO0FBQzVFLHFEQUFtRDtBQVd0QyxRQUFBLDJCQUEyQixHQUFHLElBQUEsMEJBQVUsRUFDbkQsNEJBQTRCLEVBQzVCLEtBQUssRUFDSCxLQUF1QyxFQUN2QyxFQUFFLFNBQVMsRUFBRSxFQUM2QyxFQUFFO0lBQzVELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsb0RBQW9ELENBQ3JELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDcEMsZUFBTyxDQUFDLEtBQUssQ0FDZCxDQUFBO0lBRUQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDdEMsZUFBTyxDQUFDLE9BQU8sQ0FDaEIsQ0FBQTtJQUVELHlDQUF5QztJQUN6QyxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO1FBQ3ZELFNBQVMsRUFBRSxDQUFDLG9CQUFvQixDQUFDO0tBQ2xDLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLGlCQUFpQixRQUFRLFlBQVksQ0FDdEMsQ0FBQTtJQUNILENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQTtJQUV4QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsU0FBUyxRQUFRLGdDQUFnQyxDQUNsRCxDQUFBO0lBQ0gsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixNQUFNLGdCQUFnQixHQUFHLEtBQXNELENBQUE7SUFDL0UsTUFBTSxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQTtJQUVsRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixTQUFTLFFBQVEscUNBQXFDLENBQ3ZELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLGNBQWMsQ0FBQyx5QkFBeUIsQ0FDdEUsbUJBQW1CLEVBQ25CO1FBQ0UsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDO0tBQzdDLENBQ0YsQ0FBQTtJQUVELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLHNCQUFzQixtQkFBbUIsWUFBWSxDQUN0RCxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFvQztRQUN6RCxLQUFLO1FBQ0wsa0JBQWtCLEVBQUUsaUJBQWlCO1FBQ3JDLGFBQWEsRUFBRSxZQUFZO0tBQzVCLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBIn0=
|