order-management 0.0.82 → 0.0.84

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 (26) hide show
  1. package/.medusa/server/src/admin/index.js +668 -668
  2. package/.medusa/server/src/admin/index.mjs +669 -669
  3. package/.medusa/server/src/api/admin/return/[id]/reject/route.js +6 -2
  4. package/.medusa/server/src/api/admin/swaps/[id]/cancel/route.js +5 -1
  5. package/.medusa/server/src/api/admin/swaps/[id]/reject/route.js +5 -1
  6. package/.medusa/server/src/api/store/guest-orders/[id]/returns/route.js +56 -41
  7. package/.medusa/server/src/api/store/guest-orders/[id]/swaps/[swap_id]/cancel/route.js +3 -1
  8. package/.medusa/server/src/api/store/guest-orders/[id]/swaps/route.js +25 -15
  9. package/.medusa/server/src/api/store/returns/[id]/cancel/route.js +3 -1
  10. package/.medusa/server/src/api/store/returns/route.js +24 -19
  11. package/.medusa/server/src/api/store/swaps/[id]/cancel/route.js +5 -1
  12. package/.medusa/server/src/api/store/swaps/route.js +26 -15
  13. package/.medusa/server/src/helpers/index.js +2 -1
  14. package/.medusa/server/src/helpers/return-exchange-guard.js +129 -0
  15. package/.medusa/server/src/modules/order-rma-gate/constants.js +21 -0
  16. package/.medusa/server/src/modules/order-rma-gate/index.js +20 -0
  17. package/.medusa/server/src/modules/order-rma-gate/migrations/Migration20260724100000.js +34 -0
  18. package/.medusa/server/src/modules/order-rma-gate/models/order-rma-gate.js +11 -0
  19. package/.medusa/server/src/modules/order-rma-gate/service.js +202 -0
  20. package/.medusa/server/src/modules/order-rma-gate/stale-reclaim.js +18 -0
  21. package/.medusa/server/src/modules/order-rma-gate/types.js +3 -0
  22. package/.medusa/server/src/subscribers/order-return-received.js +45 -0
  23. package/.medusa/server/src/utils/notification-handler.js +13 -5
  24. package/.medusa/server/src/utils/phone-e164.js +66 -0
  25. package/README.md +13 -4
  26. package/package.json +4 -2
@@ -0,0 +1,202 @@
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
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const crypto_1 = require("crypto");
8
+ const order_rma_gate_1 = __importDefault(require("./models/order-rma-gate"));
9
+ const constants_1 = require("./constants");
10
+ const stale_reclaim_1 = require("./stale-reclaim");
11
+ function isUniqueViolation(error) {
12
+ if (!error || typeof error !== "object") {
13
+ return false;
14
+ }
15
+ const e = error;
16
+ if (e.code === "23505") {
17
+ return true;
18
+ }
19
+ const msg = `${e.message ?? ""} ${e.name ?? ""}`.toLowerCase();
20
+ return msg.includes("unique") || msg.includes("duplicate");
21
+ }
22
+ function newGateId() {
23
+ return `orgate_${(0, crypto_1.randomUUID)().replace(/-/g, "")}`;
24
+ }
25
+ class OrderRmaGateModuleService extends (0, utils_1.MedusaService)({
26
+ OrderRmaGate: order_rma_gate_1.default,
27
+ }) {
28
+ constructor(container) {
29
+ super(container);
30
+ this.manager_ = container.manager;
31
+ }
32
+ get moduleKey() {
33
+ return constants_1.ORDER_RMA_GATE_MODULE;
34
+ }
35
+ normalize(raw) {
36
+ if (!raw || typeof raw !== "object" || !("id" in raw) || !("order_id" in raw)) {
37
+ throw new Error("Invalid order_rma_gate data");
38
+ }
39
+ const row = raw;
40
+ const kind = row.kind === "exchange" ? "exchange" : "return";
41
+ return {
42
+ id: row.id,
43
+ order_id: row.order_id,
44
+ kind,
45
+ reference_id: row.reference_id ?? null,
46
+ created_at: new Date(row.created_at ?? new Date()),
47
+ updated_at: new Date(row.updated_at ?? new Date()),
48
+ deleted_at: row.deleted_at ? new Date(row.deleted_at) : null,
49
+ };
50
+ }
51
+ getKnex() {
52
+ const manager = this.manager_;
53
+ if (typeof manager.getKnex !== "function") {
54
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "EntityManager.getKnex is unavailable for order_rma_gate");
55
+ }
56
+ return manager.getKnex();
57
+ }
58
+ async getActiveByOrderId(orderId) {
59
+ const knex = this.getKnex();
60
+ const row = await knex("order_rma_gate")
61
+ .where({ order_id: orderId })
62
+ .whereNull("deleted_at")
63
+ .first();
64
+ return row ? this.normalize(row) : null;
65
+ }
66
+ /**
67
+ * Insert a gate for the order. On unique conflict, attempt atomic stale reclaim
68
+ * via SELECT … FOR UPDATE in a single transaction.
69
+ */
70
+ async acquire(orderId, kind, hasActiveMedusaRma, now = new Date()) {
71
+ const knex = this.getKnex();
72
+ const id = newGateId();
73
+ const stamp = now;
74
+ try {
75
+ await knex("order_rma_gate").insert({
76
+ id,
77
+ order_id: orderId,
78
+ kind,
79
+ reference_id: null,
80
+ created_at: stamp,
81
+ updated_at: stamp,
82
+ deleted_at: null,
83
+ });
84
+ const gate = await this.getActiveByOrderId(orderId);
85
+ if (!gate) {
86
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Gate insert succeeded but row not found");
87
+ }
88
+ return { ok: true, gate };
89
+ }
90
+ catch (error) {
91
+ if (!isUniqueViolation(error)) {
92
+ throw error;
93
+ }
94
+ return this.reclaimStaleOrConflict(orderId, kind, hasActiveMedusaRma, now);
95
+ }
96
+ }
97
+ /**
98
+ * Atomic reclaim: lock existing live gate, evaluate staleness, soft-delete + insert
99
+ * in the same transaction so concurrent reclaimers cannot both win.
100
+ */
101
+ async reclaimStaleOrConflict(orderId, kind, hasActiveMedusaRma, now) {
102
+ const knex = this.getKnex();
103
+ const conflictMessage = "This order already has an active return or exchange in progress. Cancel or complete the existing one before creating a new request.";
104
+ return knex.transaction(async (trx) => {
105
+ const locked = await trx("order_rma_gate")
106
+ .where({ order_id: orderId })
107
+ .whereNull("deleted_at")
108
+ .forUpdate()
109
+ .first();
110
+ if (!locked) {
111
+ // Previous holder released between unique violation and lock — insert fresh
112
+ const id = newGateId();
113
+ await trx("order_rma_gate").insert({
114
+ id,
115
+ order_id: orderId,
116
+ kind,
117
+ reference_id: null,
118
+ created_at: now,
119
+ updated_at: now,
120
+ deleted_at: null,
121
+ });
122
+ return {
123
+ ok: true,
124
+ gate: this.normalize({
125
+ id,
126
+ order_id: orderId,
127
+ kind,
128
+ reference_id: null,
129
+ created_at: now,
130
+ updated_at: now,
131
+ deleted_at: null,
132
+ }),
133
+ };
134
+ }
135
+ const existing = this.normalize(locked);
136
+ const medusaActive = await hasActiveMedusaRma();
137
+ const decision = (0, stale_reclaim_1.evaluateStaleGateReclaim)({
138
+ gateCreatedAt: existing.created_at,
139
+ referenceId: existing.reference_id,
140
+ hasActiveMedusaRma: medusaActive,
141
+ now,
142
+ staleTtlMs: constants_1.STALE_GATE_TTL_MS,
143
+ });
144
+ if (decision !== "reclaim") {
145
+ return { ok: false, message: conflictMessage, type: "NOT_ALLOWED" };
146
+ }
147
+ await trx("order_rma_gate")
148
+ .where({ id: existing.id })
149
+ .update({
150
+ deleted_at: now,
151
+ updated_at: now,
152
+ });
153
+ const newId = newGateId();
154
+ await trx("order_rma_gate").insert({
155
+ id: newId,
156
+ order_id: orderId,
157
+ kind,
158
+ reference_id: null,
159
+ created_at: now,
160
+ updated_at: now,
161
+ deleted_at: null,
162
+ });
163
+ return {
164
+ ok: true,
165
+ gate: this.normalize({
166
+ id: newId,
167
+ order_id: orderId,
168
+ kind,
169
+ reference_id: null,
170
+ created_at: now,
171
+ updated_at: now,
172
+ deleted_at: null,
173
+ }),
174
+ };
175
+ });
176
+ }
177
+ async release(orderId) {
178
+ const knex = this.getKnex();
179
+ const now = new Date();
180
+ await knex("order_rma_gate")
181
+ .where({ order_id: orderId })
182
+ .whereNull("deleted_at")
183
+ .update({
184
+ deleted_at: now,
185
+ updated_at: now,
186
+ });
187
+ }
188
+ async setReference(orderId, referenceId) {
189
+ const knex = this.getKnex();
190
+ const now = new Date();
191
+ await knex("order_rma_gate")
192
+ .where({ order_id: orderId })
193
+ .whereNull("deleted_at")
194
+ .update({
195
+ reference_id: referenceId,
196
+ updated_at: now,
197
+ });
198
+ return this.getActiveByOrderId(orderId);
199
+ }
200
+ }
201
+ exports.default = OrderRmaGateModuleService;
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL29yZGVyLXJtYS1nYXRlL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBc0U7QUFFdEUsbUNBQW1DO0FBQ25DLDZFQUFrRDtBQUNsRCwyQ0FJb0I7QUFFcEIsbURBR3dCO0FBd0J4QixTQUFTLGlCQUFpQixDQUFDLEtBQWM7SUFDdkMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxLQUEyRCxDQUFBO0lBQ3JFLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDOUQsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDNUQsQ0FBQztBQUVELFNBQVMsU0FBUztJQUNoQixPQUFPLFVBQVUsSUFBQSxtQkFBVSxHQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFBO0FBQ25ELENBQUM7QUFFRCxNQUFxQix5QkFBMEIsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDbkUsWUFBWSxFQUFaLHdCQUFZO0NBQ2IsQ0FBQztJQUdBLFlBQVksU0FBK0I7UUFDekMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtJQUNu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
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateStaleGateReclaim = evaluateStaleGateReclaim;
4
+ function evaluateStaleGateReclaim(input) {
5
+ if (input.hasActiveMedusaRma) {
6
+ return "conflict";
7
+ }
8
+ const ageMs = input.now.getTime() - input.gateCreatedAt.getTime();
9
+ if (input.referenceId == null || input.referenceId === "") {
10
+ if (ageMs >= input.staleTtlMs) {
11
+ return "reclaim";
12
+ }
13
+ return "conflict";
14
+ }
15
+ // reference_id set but Medusa reports no active RMA → orphan / terminal entity
16
+ return "reclaim";
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbGUtcmVjbGFpbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL29yZGVyLXJtYS1nYXRlL3N0YWxlLXJlY2xhaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFhQSw0REFrQkM7QUFsQkQsU0FBZ0Isd0JBQXdCLENBQ3RDLEtBQW9DO0lBRXBDLElBQUksS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDN0IsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUVqRSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDMUQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUMifQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9vcmRlci1ybWEtZ2F0ZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = orderReturnReceivedHandler;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const return_exchange_guard_1 = require("../helpers/return-exchange-guard");
7
+ /**
8
+ * Unlock the order RMA gate when a return is actually received.
9
+ *
10
+ * Note: older Medusa `createAndCompleteReturnOrderWorkflow` may emit
11
+ * `order.return_received` even when `receive_now` is false. We only release
12
+ * when the return entity status is `received`.
13
+ */
14
+ async function orderReturnReceivedHandler({ event, container, }) {
15
+ const data = event.data ?? {};
16
+ const returnId = data.return_id ?? data.id;
17
+ try {
18
+ const orderModule = container.resolve(utils_1.Modules.ORDER);
19
+ let orderId = data.order_id;
20
+ let status;
21
+ if (returnId) {
22
+ const ret = await orderModule.retrieveReturn(returnId).catch(() => null);
23
+ if (!ret) {
24
+ return;
25
+ }
26
+ orderId = orderId ?? ret.order_id;
27
+ status = ret.status;
28
+ }
29
+ if (!orderId) {
30
+ return;
31
+ }
32
+ // Only unlock on true received status (not spurious REQUESTED-time emits)
33
+ if (status !== "received") {
34
+ return;
35
+ }
36
+ await (0, return_exchange_guard_1.releaseOrderRmaGate)(orderId, container);
37
+ }
38
+ catch (error) {
39
+ console.error(`[order.return_received] Failed to release RMA gate:`, error);
40
+ }
41
+ }
42
+ exports.config = {
43
+ event: "order.return_received",
44
+ };
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcmV0dXJuLXJlY2VpdmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLXJldHVybi1yZWNlaXZlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrQkEsNkNBcUNDO0FBdERELHFEQUFtRDtBQUVuRCw0RUFBc0U7QUFRdEU7Ozs7OztHQU1HO0FBQ1ksS0FBSyxVQUFVLDBCQUEwQixDQUFDLEVBQ3ZELEtBQUssRUFDTCxTQUFTLEdBQytCO0lBQ3hDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO0lBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUUxQyxJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFzQixlQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDekUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUMzQixJQUFJLE1BQTBCLENBQUE7UUFFOUIsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE1BQU0sR0FBRyxHQUFHLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDeEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNULE9BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxHQUFHLE9BQU8sSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFBO1lBQ2pDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO1FBQ3JCLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFNO1FBQ1IsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxJQUFJLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMxQixPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sSUFBQSwyQ0FBbUIsRUFBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUNYLHFEQUFxRCxFQUNyRCxLQUFLLENBQ04sQ0FBQTtJQUNILENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSx1QkFBdUI7Q0FDL0IsQ0FBQSJ9
@@ -6,6 +6,7 @@ const template_1 = require("./template");
6
6
  const send_notification_step_1 = require("../workflows/steps/send-notification-step");
7
7
  const config_1 = require("../config");
8
8
  const email_branding_1 = require("./email-branding");
9
+ const phone_e164_1 = require("./phone-e164");
9
10
  /** Max length for FCM notification body to avoid "Android message is too big" (payload limit ~4KB). */
10
11
  const PUSH_BODY_MAX_LENGTH = 200;
11
12
  /**
@@ -174,6 +175,10 @@ function buildSmsPayload(to, text) {
174
175
  * Sends payload with text in every possible field (text, body, content, data.text) so the Twilio adapter receives it.
175
176
  */
176
177
  const smsChannelHandler = async (recipient, message, templateData, container) => {
178
+ const e164 = (0, phone_e164_1.normalizeToE164)(recipient);
179
+ if (!e164) {
180
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `SMS recipient is not a valid phone number (need E.164). Got: ${String(recipient).slice(0, 16)}`);
181
+ }
177
182
  const text = ensureSmsText(message, templateData);
178
183
  if (!text || text.length === 0) {
179
184
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "SMS text is empty after fallback; cannot send.");
@@ -182,7 +187,7 @@ const smsChannelHandler = async (recipient, message, templateData, container) =>
182
187
  if (!notificationService) {
183
188
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Notification service is not configured.");
184
189
  }
185
- const payload = buildSmsPayload(recipient, text);
190
+ const payload = buildSmsPayload(e164, text);
186
191
  try {
187
192
  if (typeof notificationService.create === "function") {
188
193
  await notificationService.create(payload);
@@ -258,12 +263,15 @@ const emailRecipientResolver = (order) => {
258
263
  return email && typeof email === "string" && email.includes("@") ? email : undefined;
259
264
  };
260
265
  /**
261
- * SMS recipient resolver
266
+ * SMS recipient resolver — prefer shipping phone, fall back to billing.
267
+ * Normalize to E.164 so Twilio/MSG91 accept local Indian numbers.
262
268
  */
263
269
  const smsRecipientResolver = (order) => {
264
270
  const shippingAddress = order.shipping_address;
265
- const phoneNumber = shippingAddress?.phone;
266
- return phoneNumber;
271
+ const billingAddress = order.billing_address;
272
+ const raw = shippingAddress?.phone ||
273
+ billingAddress?.phone;
274
+ return (0, phone_e164_1.normalizeToE164)(raw) ?? undefined;
267
275
  };
268
276
  /**
269
277
  * Push notification recipient resolver.
@@ -421,4 +429,4 @@ async function handleOrderStatusNotifications(orderId, newStatus, container) {
421
429
  // Don't throw - notification errors shouldn't break order flow
422
430
  }
423
431
  }
424
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvbm90aWZpY2F0aW9uLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0YkEsd0VBZ0pDO0FBM2tCRCxxREFBMkY7QUFDM0YseUNBS21CO0FBQ25CLHNGQUE0RTtBQUM1RSxzQ0FBaUY7QUFFakYscURBQW9EO0FBcUJwRCx1R0FBdUc7QUFDdkcsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUE7QUFFaEM7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQThCO0lBQ3pELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUE7SUFDN0IsSUFBSSxXQUFvQixDQUFBO0lBQ3hCLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxHQUFHLE9BQWtDLENBQUE7UUFDNUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUE7SUFDM0QsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUE7SUFDM0QsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN2RCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3BCLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEs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
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvbm90aWZpY2F0aW9uLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF5Y0Esd0VBZ0pDO0FBeGxCRCxxREFBMkY7QUFDM0YseUNBS21CO0FBQ25CLHNGQUE0RTtBQUM1RSxzQ0FBaUY7QUFFakYscURBQW9EO0FBQ3BELDZDQUE4QztBQXFCOUMsdUdBQXVHO0FBQ3ZHLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFBO0FBRWhDOztHQUVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUE4QjtJQUN6RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO0lBQzdCLElBQUksV0FBb0IsQ0FBQTtJQUN4QixJQUFJLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLENBQUMsR0FBRyxPQUFrQyxDQUFBO1FBQzVDLFdBQVcsR0FBRyxDQUFDLENBQUMsbUJBQW1CLElBQUksQ0FBQyxDQUFDLGdCQUFnQixDQUFBO0lBQzNELENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFBO0lBQzNELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBQ0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkQsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBQ0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBQ0QsSUFBSSxPQUFPLEdB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
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * Normalize phone numbers to E.164 for SMS providers (Twilio, MSG91, WhatsApp).
4
+ * Checkout addresses often store bare local numbers (e.g. 8160356061) without +country.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getDefaultPhoneCountryCode = getDefaultPhoneCountryCode;
8
+ exports.normalizeToE164 = normalizeToE164;
9
+ const E164_REGEX = /^\+[1-9]\d{1,14}$/;
10
+ function digitsOnly(value) {
11
+ return value.replace(/\D/g, "");
12
+ }
13
+ /**
14
+ * Default calling code without leading +. Overridable via DEFAULT_PHONE_COUNTRY_CODE.
15
+ */
16
+ function getDefaultPhoneCountryCode() {
17
+ const raw = (process.env.DEFAULT_PHONE_COUNTRY_CODE || "91").trim();
18
+ return raw.replace(/^\+/, "") || "91";
19
+ }
20
+ /**
21
+ * Convert a stored phone string to E.164 (+…). Returns null if it cannot be normalized.
22
+ */
23
+ function normalizeToE164(phone, defaultCountryCode = getDefaultPhoneCountryCode()) {
24
+ if (!phone || typeof phone !== "string") {
25
+ return null;
26
+ }
27
+ let trimmed = phone.trim();
28
+ if (!trimmed) {
29
+ return null;
30
+ }
31
+ // 00CC… → +CC…
32
+ if (trimmed.startsWith("00")) {
33
+ trimmed = `+${trimmed.slice(2)}`;
34
+ }
35
+ if (trimmed.startsWith("+")) {
36
+ const normalized = `+${digitsOnly(trimmed)}`;
37
+ return E164_REGEX.test(normalized) ? normalized : null;
38
+ }
39
+ let digits = digitsOnly(trimmed);
40
+ if (!digits) {
41
+ return null;
42
+ }
43
+ const cc = digitsOnly(defaultCountryCode) || "91";
44
+ // Leading trunk 0: 09876543210 → 9876543210
45
+ if (digits.startsWith("0") && digits.length === cc.length + 10 + 1) {
46
+ digits = digits.slice(1);
47
+ }
48
+ else if (digits.startsWith("0") && digits.length === 11 && cc === "91") {
49
+ digits = digits.slice(1);
50
+ }
51
+ // Already includes country code without +: 919876543210
52
+ if (digits.startsWith(cc) && digits.length >= cc.length + 8) {
53
+ const candidate = `+${digits}`;
54
+ return E164_REGEX.test(candidate) ? candidate : null;
55
+ }
56
+ // Bare local number — prepend default country code (IN: 10-digit mobiles)
57
+ if (cc === "91" && /^[6-9]\d{9}$/.test(digits)) {
58
+ return `+91${digits}`;
59
+ }
60
+ if (digits.length >= 8 && digits.length <= 12) {
61
+ const candidate = `+${cc}${digits}`;
62
+ return E164_REGEX.test(candidate) ? candidate : null;
63
+ }
64
+ return null;
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZTE2NC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9waG9uZS1lMTY0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7O0FBV0gsZ0VBR0M7QUFLRCwwQ0FzREM7QUF2RUQsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUE7QUFFdEMsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQ2pDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLDBCQUEwQjtJQUN4QyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDbkUsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUE7QUFDdkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixLQUFnQyxFQUNoQyxxQkFBNkIsMEJBQTBCLEVBQUU7SUFFekQsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDMUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsZUFBZTtJQUNmLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQTtRQUM1QyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3hELENBQUM7SUFFRCxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFBO0lBRWpELDRDQUE0QztJQUM1QyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMxQixDQUFDO1NBQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN6RSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMxQixDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQTtRQUM5QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3RELENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMvQyxPQUFPLE1BQU0sTUFBTSxFQUFFLENBQUE7SUFDdkIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQTtRQUNuQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3RELENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMifQ==
package/README.md CHANGED
@@ -321,6 +321,7 @@ This plugin is compatible with Medusa v2 (e.g. `@medusajs/framework` and `@medus
321
321
  - **Order Confirmation Emails**: Optional email notifications when orders are placed (with "Claim Order" support for registered users)
322
322
  - **Status-Based Notifications**: Configurable email, SMS, and push notifications for order status changes (pending, shipped, delivered, canceled, etc.)
323
323
  - **Return / Exchange Delivery Window**: Configurable per-type windows (`returnValidInDays`, `exchangeValidInDays`) that block return or exchange requests submitted after N days from the fulfillment's `delivered_at` timestamp. Defaults to 7 days each if not configured. The window is checked only when the order has been marked as delivered; undelivered orders are unaffected.
324
+ - **Return / Exchange mutual exclusion**: Order-level lock via `order_rma_gate` — an active return blocks creating an exchange (and a second return), and vice versa. Same helper on store and guest create routes. Gate uses a partial unique index on `order_id` and atomic stale reclaim (`SELECT … FOR UPDATE`). Unlock on cancel/reject or when return status is actually `received`.
324
325
  - **Return Orders Admin Panel**: Admin UI and API for return orders (list, filter, search, detail, reject); returns are stored in the Medusa ORDER module and created via `createAndCompleteReturnOrderWorkflow`
325
326
  - **Exchanges Admin Panel**: Admin UI and API for exchanges (list, detail, reject, cancel); exchanges are ORDER module order changes (type `exchange`) created by customers via Medusa core workflows (`beginExchangeOrderWorkflow`, etc.)
326
327
  - **Medusa workflows**: Customer returns use `createAndCompleteReturnOrderWorkflow`; customer exchanges use `beginExchangeOrderWorkflow`, `orderExchangeRequestItemReturnWorkflow`, `orderExchangeAddNewItemWorkflow`, `confirmExchangeRequestWorkflow`, and `cancelBeginOrderExchangeWorkflow`. Admin actions use `confirmReturnReceiveWorkflow`, `cancelReturnWorkflow`, and `cancelBeginOrderExchangeWorkflow`.
@@ -334,8 +335,8 @@ This plugin is compatible with Medusa v2 (e.g. `@medusajs/framework` and `@medus
334
335
  | **Store (authenticated)** | `/store/orders/cancel|reorder/:id`, `/store/returns`, `/store/swaps`, `/store/payment-details`, `/store/refund-payment-mapping/:return_id`, `/store/orders/:order_id/refund-payment-mappings` |
335
336
  | **Store (guest)** | `/store/otp/request|verify`, `/store/guest-orders`, `/store/guest-orders/:id/returns|cancel|reorder|swaps` |
336
337
  | **Admin** | `/admin/returns`, `/admin/swaps`, `/admin/refund-payment-mapping/:return_id`, `/admin/refund-payment-mapping/:return_id/mark-refunded`, `/admin/orders/:order_id/refund-context` |
337
- | **Modules** | `payment_detail`, `refund_payment_mapping`; returns/exchanges use Medusa ORDER module |
338
- | **Subscribers** | Order confirmation email, status notifications, return/swap event sync |
338
+ | **Modules** | `payment_detail`, `refund_payment_mapping`, `order_rma_gate`; returns/exchanges use Medusa ORDER module |
339
+ | **Subscribers** | Order confirmation email, status notifications, return/swap event sync, `order.return_received` RMA gate release |
339
340
 
340
341
  ### Important APIs (quick reference)
341
342
 
@@ -632,7 +633,9 @@ Status updates are tracked in the return's metadata with timestamps and admin us
632
633
 
633
634
  ### One active return or exchange per item (Medusa v2)
634
635
 
635
- Medusa v2 does **not** allow multiple active return/exchange requests for the same order item at the same time. Once an item is part of a return or a swap (exchange), that quantity is reserved until the request is completed or canceled. Duplicate requests for the same quantity will fail validation (prevents double refunds / double fulfillment).
636
+ **Active standalone return** = `status ∈ {open, requested, partially_received}` and no `exchange_id`.
637
+
638
+ Medusa v2 does **not** allow multiple active return/exchange requests for the **same order item** at the same time. Once an item is part of a return or a swap (exchange), that quantity is reserved until the request is completed or canceled. This plugin also enforces **order-level** mutual exclusion via `order_rma_gate` (see Eligibility and Validation).
636
639
 
637
640
  **To allow a new request**, the first one must be closed or canceled:
638
641
 
@@ -1449,7 +1452,13 @@ Returns are validated for:
1449
1452
  - **Default Payment Method**: Customer must have a default payment method before creating a return
1450
1453
  - **Delivery Window**: Return is blocked if more than `returnValidInDays` days have passed since `fulfillment.delivered_at`. If the fulfillment has no `delivered_at` the check is skipped. Configure in plugin options (default: 7 days)
1451
1454
  - **Exchange Window**: Exchange is blocked if more than `exchangeValidInDays` days have passed since `fulfillment.delivered_at` (default: 7 days)
1452
- - **Duplicate Prevention**: Cannot create a new return or exchange while one is already pending or requested for the same order
1455
+ - **Mutual exclusion (order-level)**: While any **active** return or exchange exists on the order, neither a second return nor a cross-type request may be created (intentional: one open RMA per order). Active return statuses are `open` | `requested` | `partially_received` (not `received` / `canceled`). Exchange-linked returns do not count as standalone refund returns. Enforced by:
1456
+ - Medusa entity allowlists (`assertNoActiveConflictingRma`)
1457
+ - `order_rma_gate` row with `UNIQUE (order_id) WHERE deleted_at IS NULL` (race-safe create)
1458
+ - Atomic stale reclaim with `SELECT … FOR UPDATE` when a gate is abandoned (default TTL `STALE_GATE_TTL_MS` = 15 minutes; tune if crash-recovery timing requires it)
1459
+ - Release on store/guest/admin cancel+reject, and on `order.return_received` only when return `status === "received"`
1460
+ - Create workflow failure releases the gate (compensation)
1461
+ - **Retry UX (v1):** a client retry of a successful create may get `400 NOT_ALLOWED` while the gate is held — check the order for an existing return/exchange before escalating support tickets
1453
1462
 
1454
1463
  ### Helper Functions
1455
1464
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "order-management",
3
- "version": "0.0.82",
3
+ "version": "0.0.84",
4
4
  "description": "A starter for Medusa plugins.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",
@@ -30,6 +30,8 @@
30
30
  "scripts": {
31
31
  "build": "medusa plugin:build",
32
32
  "dev": "medusa plugin:develop",
33
+ "test": "vitest run",
34
+ "test:watch": "vitest",
33
35
  "prepublishOnly": "medusa plugin:build"
34
36
  },
35
37
  "devDependencies": {
@@ -46,7 +48,7 @@
46
48
  "@types/react": "^18.3.2",
47
49
  "@types/react-dom": "^18.2.25",
48
50
  "jsonwebtoken": "^9.0.3",
49
- "medusa-plugin-dynamic-config": "^0.0.36",
51
+ "medusa-plugin-dynamic-config": "0.0.36",
50
52
  "prop-types": "^15.8.1",
51
53
  "react": "^18.2.0",
52
54
  "react-dom": "^18.2.0",