order-management 0.0.2 → 0.0.4
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 +66 -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 +79 -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,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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
|
|
@@ -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,103 +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 utils_1 = require("@medusajs/framework/utils");
|
|
9
|
-
const process_cod_refund_workflow_1 = __importDefault(require("../workflows/process-cod-refund-workflow"));
|
|
10
|
-
const plugin_options_1 = require("../config/plugin-options");
|
|
11
|
-
/**
|
|
12
|
-
* Subscriber for return.updated events
|
|
13
|
-
*
|
|
14
|
-
* This subscriber listens to Medusa's built-in `return.updated` event
|
|
15
|
-
* and automatically processes COD refunds when return status changes to "received".
|
|
16
|
-
*
|
|
17
|
-
* Logic:
|
|
18
|
-
* - Listens to return.updated events
|
|
19
|
-
* - Checks if status changed to "received"
|
|
20
|
-
* - Verifies order is COD (via workflow)
|
|
21
|
-
* - Triggers COD refund workflow
|
|
22
|
-
* - Handles errors gracefully (doesn't break main flow)
|
|
23
|
-
*/
|
|
24
|
-
async function returnReceivedHandler({ event: { data }, container, }) {
|
|
25
|
-
const returnId = data.id;
|
|
26
|
-
const orderId = data.order_id;
|
|
27
|
-
const status = data.status;
|
|
28
|
-
const previousStatus = data.previous_status;
|
|
29
|
-
console.log(`[return-received] Event received for return: ${returnId}, order: ${orderId}, status: ${status}`);
|
|
30
|
-
if (!returnId) {
|
|
31
|
-
console.error("[return-received] No return ID in event data");
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
if (!orderId) {
|
|
35
|
-
console.error("[return-received] No order ID in event data");
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
// Only process if status is "received"
|
|
39
|
-
if (status !== "received") {
|
|
40
|
-
console.log(`[return-received] Return ${returnId} status is "${status}", not "received". Skipping COD refund processing.`);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
// Check if status actually changed to "received" (avoid processing if already received)
|
|
44
|
-
if (previousStatus === "received") {
|
|
45
|
-
console.log(`[return-received] Return ${returnId} was already in "received" status. Skipping duplicate processing.`);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
// Check payment processing mode from plugin configuration
|
|
49
|
-
const configModule = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
50
|
-
const pluginOptions = (0, plugin_options_1.resolveOrderManagementOptions)(configModule);
|
|
51
|
-
const paymentProcessing = pluginOptions.paymentProcessing || "automatic";
|
|
52
|
-
if (paymentProcessing === "manual") {
|
|
53
|
-
console.log(`[return-received] Payment processing is set to "manual" mode. ` +
|
|
54
|
-
`Skipping automatic refund processing for return ${returnId}. ` +
|
|
55
|
-
`Admin will process refund manually.`);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
try {
|
|
59
|
-
console.log(`[return-received] Processing COD refund for return ${returnId}, order ${orderId}`);
|
|
60
|
-
// Execute workflow to process COD refund
|
|
61
|
-
const { result } = await (0, process_cod_refund_workflow_1.default)(container).run({
|
|
62
|
-
input: {
|
|
63
|
-
return_id: returnId,
|
|
64
|
-
order_id: orderId,
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
console.log(`[return-received] ✓ COD refund processed successfully for return ${returnId}:`, {
|
|
68
|
-
refund_id: result.refund_id,
|
|
69
|
-
amount: result.amount,
|
|
70
|
-
currency_code: result.currency_code,
|
|
71
|
-
order_id: result.order_id,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
// Log error but don't throw - subscriber errors shouldn't break the main flow
|
|
76
|
-
// The workflow will handle validation (e.g., if order is not COD, it will throw)
|
|
77
|
-
// We catch here to prevent breaking the return update flow
|
|
78
|
-
if (error instanceof Error) {
|
|
79
|
-
// Check if error is because order is not COD (expected case)
|
|
80
|
-
if (error.message.includes("COD") ||
|
|
81
|
-
error.message.includes("not COD") ||
|
|
82
|
-
error.message.includes("payment_type")) {
|
|
83
|
-
console.log(`[return-received] Order ${orderId} is not COD. Skipping refund processing:`, error.message);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
// Other errors should be logged
|
|
87
|
-
console.error(`[return-received] ✗ Error processing COD refund for return ${returnId}, order ${orderId}:`, error.message);
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
console.error(`[return-received] ✗ Unknown error processing COD refund for return ${returnId}, order ${orderId}:`, error);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Subscriber configuration
|
|
96
|
-
*
|
|
97
|
-
* Listens to Medusa's built-in return.updated event
|
|
98
|
-
* This event is triggered when a return status is updated.
|
|
99
|
-
*/
|
|
100
|
-
exports.config = {
|
|
101
|
-
event: "return.updated",
|
|
102
|
-
};
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0dXJuLXJlY2VpdmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL3JldHVybi1yZWNlaXZlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFnQ0Esd0NBNEdDO0FBeElELHFEQUFxRTtBQUNyRSwyR0FBK0U7QUFDL0UsNkRBQXdFO0FBYXhFOzs7Ozs7Ozs7Ozs7R0FZRztBQUNZLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxFQUNsRCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFDZixTQUFTLEdBQzhCO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUE7SUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQzFCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUE7SUFFM0MsT0FBTyxDQUFDLEdBQUcsQ0FDVCxnREFBZ0QsUUFBUSxZQUFZLE9BQU8sYUFBYSxNQUFNLEVBQUUsQ0FDakcsQ0FBQTtJQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQTtRQUM3RCxPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtRQUM1RCxPQUFNO0lBQ1IsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxJQUFJLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsR0FBRyxDQUNULDRCQUE0QixRQUFRLGVBQWUsTUFBTSxvREFBb0QsQ0FDOUcsQ0FBQTtRQUNELE9BQU07SUFDUixDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLElBQUksY0FBYyxLQUFLLFVBQVUsRUFBRSxDQUFD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
|
|
@@ -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,99 +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
|
-
let paymentError;
|
|
40
|
-
if (has_payment_details && payment_details) {
|
|
41
|
-
// Step 5: Validate payment method is supported for currency
|
|
42
|
-
const { selected_method, payment_details: validatedPaymentDetails } = (0, select_payment_method_step_1.selectPaymentMethodStep)({
|
|
43
|
-
currency_code: refundCurrency,
|
|
44
|
-
payment_details,
|
|
45
|
-
});
|
|
46
|
-
// Step 6: Validate payment details format
|
|
47
|
-
const { payment_details: finalPaymentDetails } = (0, validate_payment_details_step_1.validatePaymentDetailsStep)({
|
|
48
|
-
payment_details: validatedPaymentDetails,
|
|
49
|
-
payment_method: selected_method,
|
|
50
|
-
currency_code: refundCurrency,
|
|
51
|
-
});
|
|
52
|
-
// Step 7: Process actual refund via payment gateway
|
|
53
|
-
// Provider selection happens here based on configured providers
|
|
54
|
-
const { refund_result, transaction_id: gatewayTransactionId } = (0, process_refund_payment_step_1.processRefundPaymentStep)({
|
|
55
|
-
amount,
|
|
56
|
-
currency_code: refundCurrency,
|
|
57
|
-
payment_details: finalPaymentDetails,
|
|
58
|
-
payment_method: selected_method,
|
|
59
|
-
return_id: input.return_id,
|
|
60
|
-
order_id: input.order_id,
|
|
61
|
-
});
|
|
62
|
-
// Check if payment processing failed
|
|
63
|
-
if (!refund_result.success) {
|
|
64
|
-
paymentError = {
|
|
65
|
-
error_message: refund_result.error_message,
|
|
66
|
-
error_code: refund_result.error_code,
|
|
67
|
-
};
|
|
68
|
-
// Don't set transaction_id on failure
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
transaction_id = gatewayTransactionId;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// Step 8: Create refund record with transaction ID or error details
|
|
75
|
-
// Always create refund record, even on failure, so we can track failures
|
|
76
|
-
const { refund_id, amount: refundAmount, currency_code: refundCurrencyCode } = (0, create_refund_record_step_1.createRefundRecordStep)({
|
|
77
|
-
payment_collection_id: payment_collection.id,
|
|
78
|
-
amount,
|
|
79
|
-
currency_code: refundCurrency,
|
|
80
|
-
order_id: input.order_id,
|
|
81
|
-
return_id: input.return_id,
|
|
82
|
-
transaction_id, // Include gateway transaction ID (if successful)
|
|
83
|
-
payment_error: paymentError, // Include error details (if failed)
|
|
84
|
-
});
|
|
85
|
-
// Step 9: Update payment status
|
|
86
|
-
(0, update_payment_status_step_1.updatePaymentStatusStep)({
|
|
87
|
-
payment_collection_id: payment_collection.id,
|
|
88
|
-
refund_id,
|
|
89
|
-
refund_amount: refundAmount,
|
|
90
|
-
});
|
|
91
|
-
return new workflows_sdk_1.WorkflowResponse({
|
|
92
|
-
refund_id,
|
|
93
|
-
amount: refundAmount,
|
|
94
|
-
currency_code: refundCurrencyCode,
|
|
95
|
-
order_id: input.order_id,
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
exports.default = exports.processCodRefundWorkflow;
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1jb2QtcmVmdW5kLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9wcm9jZXNzLWNvZC1yZWZ1bmQtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBRzBDO0FBQzFDLHlFQUVzQztBQUN0Qyw2RkFFZ0Q7QUFDaEQsdUZBRTZDO0FBQzdDLHVHQUVxRDtBQUNyRCxtRkFFMkM7QUFDM0MseUZBRThDO0FBQzlDLHFGQUU0QztBQUM1QyxpRkFFMEM7QUFDMUMsbUZBRTJDO0FBTTlCLFFBQUEsd0JBQXdCLEdBQUcsSUFBQSw4QkFBYyxFQUNwRCxvQkFBb0IsRUFDcEIsQ0FDRSxLQUFvQyxFQUNjLEVBQUU7SUFDcEQsOEJBQThCO0lBQzlCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLDBDQUFrQixFQUFDO1FBQ3BDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtLQUN6QixDQUFDLENBQUE7SUFFRiwyRUFBMkU7SUFDM0Usd0RBQXdEO0lBRXhELG1EQUFtRDtJQUNuRCxNQUFNLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxHQUNoRCxJQUFBLDZEQUEyQixFQUFDO1FBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtLQUN6QixDQUFDLENBQUE7SUFFSixrQ0FBa0M7SUFDbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQzdDLElBQUEsd0RBQXlCLEVBQUM7UUFDeEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtRQUN4QixhQUFhO0tBQ2QsQ0FBQyxDQUFBO0lBRUosK0NBQStDO0lBQy9DLE1BQU0sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsR0FDNUMsSUFBQSx1RUFBZ0MsRUFBQztRQUMvQixTQUFTLEVBQUUsS0FBSyxDQUFD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
|
|
@@ -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
|