order-management 0.0.1 → 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.
Files changed (28) hide show
  1. package/.medusa/server/src/api/store/orders/reorder/[order_id]/route.js +52 -0
  2. package/.medusa/server/src/workflows/index.js +4 -9
  3. package/.medusa/server/src/workflows/{types.js → reorder/types.js} +1 -1
  4. package/.medusa/server/src/workflows/reorder-workflow.js +27 -0
  5. package/.medusa/server/src/workflows/steps/create-cart-from-order-step.js +26 -0
  6. package/.medusa/server/src/workflows/steps/index.js +10 -0
  7. package/.medusa/server/src/workflows/steps/retrieve-order-step.js +52 -0
  8. package/.medusa/server/src/workflows/steps/transform-order-to-cart-step.js +53 -0
  9. package/package.json +1 -1
  10. package/.medusa/server/src/api/store/returns/[id]/payment-details/route.js +0 -133
  11. package/.medusa/server/src/config/plugin-options.js +0 -59
  12. package/.medusa/server/src/providers/refund-payment/base-refund-provider.js +0 -80
  13. package/.medusa/server/src/providers/refund-payment/index.js +0 -38
  14. package/.medusa/server/src/providers/refund-payment/razorpay-provider.js +0 -96
  15. package/.medusa/server/src/providers/refund-payment/stripe-provider.js +0 -82
  16. package/.medusa/server/src/subscribers/return-received.js +0 -91
  17. package/.medusa/server/src/types/plugin-options.js +0 -3
  18. package/.medusa/server/src/types/refund-payment.js +0 -3
  19. package/.medusa/server/src/workflows/process-cod-refund-workflow.js +0 -86
  20. package/.medusa/server/src/workflows/steps/calculate-refund-amount-step.js +0 -51
  21. package/.medusa/server/src/workflows/steps/create-refund-record-step.js +0 -193
  22. package/.medusa/server/src/workflows/steps/process-refund-payment-step.js +0 -87
  23. package/.medusa/server/src/workflows/steps/retrieve-order-and-payment-step.js +0 -44
  24. package/.medusa/server/src/workflows/steps/retrieve-return-payment-details-step.js +0 -56
  25. package/.medusa/server/src/workflows/steps/select-payment-method-step.js +0 -61
  26. package/.medusa/server/src/workflows/steps/update-payment-status-step.js +0 -45
  27. package/.medusa/server/src/workflows/steps/validate-payment-details-step.js +0 -90
  28. package/.medusa/server/src/workflows/steps/verify-cod-order-step.js +0 -39
@@ -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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
@@ -1,82 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StripeRefundProvider = void 0;
4
- const utils_1 = require("@medusajs/framework/utils");
5
- const base_refund_provider_1 = require("./base-refund-provider");
6
- class StripeRefundProvider extends base_refund_provider_1.BaseRefundProvider {
7
- constructor(config) {
8
- super("stripe");
9
- this.config = config;
10
- }
11
- supportsCurrency(currency_code) {
12
- // Stripe supports most major currencies
13
- const supportedCurrencies = [
14
- "USD",
15
- "EUR",
16
- "GBP",
17
- "CAD",
18
- "AUD",
19
- "JPY",
20
- "CHF",
21
- "SGD",
22
- "HKD",
23
- "NZD",
24
- ];
25
- return supportedCurrencies.includes(currency_code.toUpperCase());
26
- }
27
- supportsPaymentMethod(method, currency_code) {
28
- if (!this.supportsCurrency(currency_code)) {
29
- return false;
30
- }
31
- // Stripe primarily supports bank transfers for refunds
32
- return method === "bank_transfer";
33
- }
34
- async processRefund(params) {
35
- const { amount, currency_code, payment_details, return_id, order_id } = params;
36
- // Validate currency
37
- if (!this.supportsCurrency(currency_code)) {
38
- return this.createErrorResult(`Stripe does not support currency: ${currency_code}`, "UNSUPPORTED_CURRENCY");
39
- }
40
- // Validate payment method
41
- if (!this.supportsPaymentMethod(payment_details.method, currency_code)) {
42
- return this.createErrorResult(`Stripe does not support payment method: ${payment_details.method} for currency: ${currency_code}`, "UNSUPPORTED_PAYMENT_METHOD");
43
- }
44
- // Validate payment details
45
- const validation = this.validatePaymentDetails(payment_details, "bank_transfer");
46
- if (!validation.valid) {
47
- return this.createErrorResult(validation.error || "Invalid payment details", "INVALID_PAYMENT_DETAILS");
48
- }
49
- try {
50
- return await this.processBankTransferRefund(amount, currency_code, payment_details.bank_account, return_id, order_id);
51
- }
52
- catch (error) {
53
- const errorMessage = error instanceof Error ? error.message : "Unknown error";
54
- return this.createErrorResult(`Stripe refund failed: ${errorMessage}`, "STRIPE_ERROR");
55
- }
56
- }
57
- async processBankTransferRefund(amount, currencyCode, bankAccount, returnId, orderId) {
58
- // TODO: Implement Stripe Bank Transfer refund API call
59
- // This is a placeholder - actual implementation requires Stripe SDK
60
- // Example:
61
- // const stripe = require('stripe')(this.config.apiKey)
62
- // const transfer = await stripe.transfers.create({
63
- // amount: Math.round(amount * 100), // Convert to cents
64
- // currency: currencyCode.toLowerCase(),
65
- // destination: {
66
- // account_number: bankAccount.account_number,
67
- // routing_number: bankAccount.routing_number, // For US
68
- // // or SWIFT code for international
69
- // },
70
- // metadata: {
71
- // return_id: returnId,
72
- // order_id: orderId,
73
- // purpose: 'refund'
74
- // }
75
- // })
76
- // For now, return a mock success response
77
- // In production, replace with actual Stripe API call
78
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Stripe Bank Transfer refund integration not yet implemented. Please install stripe SDK and configure.");
79
- }
80
- }
81
- exports.StripeRefundProvider = StripeRefundProvider;
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaXBlLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9yZWZ1bmQtcGF5bWVudC9zdHJpcGUtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXVEO0FBQ3ZELGlFQUEyRDtBQVczRCxNQUFhLG9CQUFxQixTQUFRLHlDQUFrQjtJQUcxRCxZQUFZLE1BQW9CO1FBQzlCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxhQUFxQjtRQUNwQyx3Q0FBd0M7UUFDeEMsTUFBTSxtQkFBbUIsR0FBRztZQUMxQixLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1NBQ04sQ0FBQTtRQUNELE9BQU8sbUJBQW1CLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxxQkFBcUIsQ0FDbkIsTUFBcUIsRUFDckIsYUFBcUI7UUFFckIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztRQUVELHVEQUF1RDtRQUN2RCxPQUFPLE1BQU0sS0FBSyxlQUFlLENBQUE7SUFDbkMsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsTUFNbkI7UUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUNuRSxNQUFNLENBQUE7UUFFUixvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUMzQixxQ0FBcUMsYUFBYSxFQUFFLEVBQ3BELHNCQUFzQixDQUN2QixDQUFBO1FBQ0gsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUN2RSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FDM0IsMkNBQTJDLGVBQWUsQ0FBQyxNQUFNLGtCQUFrQixhQUFhLEVBQUUsRUFDbEcsNEJBQTRCLENBQzdCLENBQUE7UUFDSCxDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDNUMsZUFBZSxFQUNmLGVBQWUsQ0FDaEIsQ0FBQTtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQzNCLFVBQVUsQ0FBQyxLQUFLLElBQUkseUJBQXlCLEVBQzdDLHlCQUF5QixDQUMxQixDQUFBO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQ3pDLE1BQU0sRUFDTixhQUFhLEVBQ2IsZUFBZSxDQUFDLFlBQWEsRUFDN0IsU0FBUyxFQUNULFFBQVEsQ0FDVCxDQUFBO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFlBQVksR0FDaEIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFBO1lBQzFELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUMzQix5QkFBeUIsWUFBWSxFQUFFLEVBQ3ZDLGNBQWMsQ0FDZixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMseUJBQXlCLENBQ3JDLE1BQWMsRUFDZCxZQUFvQixFQUNwQixXQUE4RCxFQUM5RCxRQUFnQixFQUNoQixPQUFlO1FBRWYsdURBQXVEO1FBQ3ZELG9FQUFvRTtRQUNwRSxXQUFXO1FBQ1gsdURBQXVEO1FBQ3ZELG1EQUFtRDtRQUNuRCwwREFBMEQ7UUFDMUQsMENBQTBDO1FBQzFDLG1CQUFtQjtRQUNuQixrREFBa0Q7UUFDbEQsNERBQTREO1FBQzVELHlDQUF5QztRQUN6QyxPQUFPO1FBQ1AsZ0JBQWdCO1FBQ2hCLDJCQUEyQjtRQUMzQix5QkFBeUI7UUFDekIsd0JBQXdCO1FBQ3hCLE1BQU07UUFDTixLQUFLO1FBRUwsMENBQTBDO1FBQzFDLHFEQUFxRDtRQUNyRCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix1R0FBdUcsQ0FDeEcsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQTlIRCxvREE4SEMifQ==
@@ -1,91 +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.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==
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMvcGx1Z2luLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmdW5kLXBheW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMvcmVmdW5kLXBheW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -1,86 +0,0 @@
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=
@@ -1,51 +0,0 @@
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
@@ -1,193 +0,0 @@
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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