order-management 0.0.92 → 0.0.94

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 (32) hide show
  1. package/.medusa/server/src/admin/index.js +587 -569
  2. package/.medusa/server/src/admin/index.mjs +588 -570
  3. package/.medusa/server/src/api/admin/orders/[order_id]/refund-context/route.js +134 -4
  4. package/.medusa/server/src/api/admin/payment-transactions/validators.js +2 -2
  5. package/.medusa/server/src/api/admin/refund-payment-mapping/validators.js +2 -2
  6. package/.medusa/server/src/api/admin/refunds/validators.js +2 -2
  7. package/.medusa/server/src/api/admin/return/[id]/reject/route.js +3 -3
  8. package/.medusa/server/src/api/admin/return/[id]/route.js +10 -5
  9. package/.medusa/server/src/api/admin/return/route.js +4 -10
  10. package/.medusa/server/src/api/admin/return/validators.js +2 -2
  11. package/.medusa/server/src/api/admin/swaps/validators.js +3 -3
  12. package/.medusa/server/src/api/store/guest-orders/[id]/cancel/route.js +15 -26
  13. package/.medusa/server/src/api/store/guest-orders/[id]/payment-details/route.js +161 -0
  14. package/.medusa/server/src/api/store/guest-orders/[id]/returns/[return_id]/refund-payment/route.js +132 -0
  15. package/.medusa/server/src/api/store/guest-orders/[id]/returns/route.js +132 -12
  16. package/.medusa/server/src/api/store/guest-orders/[id]/swaps/route.js +2 -2
  17. package/.medusa/server/src/api/store/orders/[order_id]/refund-payment-mappings/route.js +9 -4
  18. package/.medusa/server/src/api/store/orders/cancel/[order_id]/route.js +11 -17
  19. package/.medusa/server/src/api/store/payment-details/validators.js +63 -31
  20. package/.medusa/server/src/api/store/returns/[id]/route.js +16 -9
  21. package/.medusa/server/src/api/store/returns/route.js +39 -15
  22. package/.medusa/server/src/api/store/returns/validators.js +15 -3
  23. package/.medusa/server/src/api/store/swaps/route.js +2 -2
  24. package/.medusa/server/src/api/store/validators/cancel-order.js +2 -2
  25. package/.medusa/server/src/config.js +6 -1
  26. package/.medusa/server/src/helpers/resolve-return-refund-payment.js +66 -0
  27. package/.medusa/server/src/helpers/returns.js +140 -2
  28. package/.medusa/server/src/utils/fulfilled-quantity.js +52 -0
  29. package/.medusa/server/src/utils/unwrap-workflow-error.js +108 -0
  30. package/.medusa/server/src/workflows/steps/cancel-order-step.js +75 -29
  31. package/README.md +27 -4
  32. package/package.json +17 -17
@@ -1,5 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RETURN_SHIPPING_GRAPH_FIELDS = exports.RETURN_DETAIL_GRAPH_FIELDS = exports.RETURN_LIST_GRAPH_FIELDS = void 0;
4
+ exports.sortReturnsByCreatedAtDesc = sortReturnsByCreatedAtDesc;
5
+ exports.loadReturnsViaQuery = loadReturnsViaQuery;
6
+ exports.loadReturnByIdViaQuery = loadReturnByIdViaQuery;
7
+ exports.attachReturnShippingMethods = attachReturnShippingMethods;
3
8
  exports.checkDeliveryReturnWindow = checkDeliveryReturnWindow;
4
9
  exports.getOrderReturnData = getOrderReturnData;
5
10
  exports.validateReturnWindow = validateReturnWindow;
@@ -12,17 +17,150 @@ exports.enrichStoreReturnWithItemReasons = enrichStoreReturnWithItemReasons;
12
17
  exports.normalizeOrderModuleReturnForDashboard = normalizeOrderModuleReturnForDashboard;
13
18
  const utils_1 = require("@medusajs/framework/utils");
14
19
  const DEFAULT_RETURN_EXCHANGE_WINDOW_DAYS = 7;
20
+ function isRecord(value) {
21
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
22
+ }
23
+ function graphRows(data) {
24
+ const rows = Array.isArray(data) ? data : data != null ? [data] : [];
25
+ return rows.filter(isRecord);
26
+ }
27
+ /**
28
+ * Scalar + item fields only. Do not request `shipping_methods` here:
29
+ * Medusa 2.21 ReturnRepository.loadShippingAdjustments throws
30
+ * `Cannot read properties of undefined (reading 'isInitialized')`
31
+ * when an `order_shipping` row has a missing nested `shipping_method`.
32
+ */
33
+ exports.RETURN_LIST_GRAPH_FIELDS = [
34
+ "id",
35
+ "order_id",
36
+ "status",
37
+ "display_id",
38
+ "created_at",
39
+ "updated_at",
40
+ "canceled_at",
41
+ "requested_at",
42
+ "received_at",
43
+ "refund_amount",
44
+ "created_by",
45
+ "location_id",
46
+ "metadata",
47
+ "exchange_id",
48
+ "items.*",
49
+ "items.item_id",
50
+ "items.quantity",
51
+ "items.reason_id",
52
+ "items.note",
53
+ ];
54
+ exports.RETURN_DETAIL_GRAPH_FIELDS = [
55
+ ...exports.RETURN_LIST_GRAPH_FIELDS,
56
+ "items.reason.*",
57
+ ];
58
+ exports.RETURN_SHIPPING_GRAPH_FIELDS = [
59
+ "id",
60
+ "shipping_methods.*",
61
+ "shipping_methods.amount",
62
+ "shipping_methods.total",
63
+ ];
64
+ const RETURN_QUERY_PAGE_SIZE = 200;
65
+ const RETURN_QUERY_MAX = 5000;
66
+ function sortReturnsByCreatedAtDesc(returns) {
67
+ return [...returns].sort((a, b) => {
68
+ const aTime = new Date(String(a.created_at ?? 0)).getTime();
69
+ const bTime = new Date(String(b.created_at ?? 0)).getTime();
70
+ const aSafe = Number.isNaN(aTime) ? 0 : aTime;
71
+ const bSafe = Number.isNaN(bTime) ? 0 : bTime;
72
+ return bSafe - aSafe;
73
+ });
74
+ }
75
+ /**
76
+ * List returns via Query Graph instead of OrderModule.listAndCountReturns.
77
+ * Avoids the 2.21 shipping-adjustment crash on orphan shipping_method links.
78
+ */
79
+ async function loadReturnsViaQuery(container, filters, fields = exports.RETURN_LIST_GRAPH_FIELDS) {
80
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
81
+ const out = [];
82
+ let skip = 0;
83
+ const graphFilters = filters && Object.keys(filters).length > 0 ? filters : undefined;
84
+ for (;;) {
85
+ const result = await query.graph({
86
+ entity: "return",
87
+ fields: [...fields],
88
+ filters: graphFilters ?? {},
89
+ pagination: { skip, take: RETURN_QUERY_PAGE_SIZE },
90
+ });
91
+ const page = graphRows(result?.data);
92
+ out.push(...page);
93
+ if (page.length < RETURN_QUERY_PAGE_SIZE) {
94
+ break;
95
+ }
96
+ skip += RETURN_QUERY_PAGE_SIZE;
97
+ if (skip >= RETURN_QUERY_MAX) {
98
+ break;
99
+ }
100
+ }
101
+ return sortReturnsByCreatedAtDesc(out);
102
+ }
103
+ async function loadReturnByIdViaQuery(container, id, fields = exports.RETURN_DETAIL_GRAPH_FIELDS) {
104
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
105
+ const result = await query
106
+ .graph({
107
+ entity: "return",
108
+ fields: [...fields],
109
+ filters: { id },
110
+ })
111
+ .catch(() => ({ data: [] }));
112
+ return graphRows(result?.data)[0] ?? null;
113
+ }
114
+ /**
115
+ * Best-effort shipping methods for refund charges. Isolated so a 2.21
116
+ * shipping_method hydrate failure cannot take down the returns list.
117
+ */
118
+ async function attachReturnShippingMethods(container, returns) {
119
+ const ids = returns
120
+ .map((row) => row.id)
121
+ .filter((id) => typeof id === "string" && id.length > 0);
122
+ if (ids.length === 0) {
123
+ return returns;
124
+ }
125
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
126
+ try {
127
+ const result = await query.graph({
128
+ entity: "return",
129
+ fields: [...exports.RETURN_SHIPPING_GRAPH_FIELDS],
130
+ filters: { id: ids },
131
+ });
132
+ const byId = new Map();
133
+ for (const row of graphRows(result?.data)) {
134
+ if (typeof row.id === "string" && Array.isArray(row.shipping_methods)) {
135
+ byId.set(row.id, row.shipping_methods);
136
+ }
137
+ }
138
+ return returns.map((row) => ({
139
+ ...row,
140
+ shipping_methods: typeof row.id === "string" ? (byId.get(row.id) ?? []) : [],
141
+ }));
142
+ }
143
+ catch {
144
+ return returns.map((row) => ({
145
+ ...row,
146
+ shipping_methods: Array.isArray(row.shipping_methods)
147
+ ? row.shipping_methods
148
+ : [],
149
+ }));
150
+ }
151
+ }
15
152
  async function checkDeliveryReturnWindow(orderId, windowDays = DEFAULT_RETURN_EXCHANGE_WINDOW_DAYS, container, requestType = "return") {
16
153
  // Use remote query so `delivered_at` is explicitly fetched —
17
154
  // retrieveOrder with relations does not select it by default.
18
155
  const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
19
- const { data: orders } = await query
156
+ const result = await query
20
157
  .graph({
21
158
  entity: "order",
22
159
  fields: ["id", "fulfillments.id", "fulfillments.delivered_at"],
23
160
  filters: { id: orderId },
24
161
  })
25
162
  .catch(() => ({ data: [] }));
163
+ const orders = graphRows(result?.data);
26
164
  if (!orders.length) {
27
165
  return { allowed: true };
28
166
  }
@@ -239,4 +377,4 @@ function normalizeOrderModuleReturnForDashboard(r) {
239
377
  items,
240
378
  };
241
379
  }
242
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0dXJucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9oZWxwZXJzL3JldHVybnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsOERBNkRDO0FBS0QsZ0RBNENDO0FBS0Qsb0RBU0M7QUFLRCxzREFxQkM7QUFLRCxnREFLQztBQUtELDBDQUVDO0FBUUQsNEVBNkJDO0FBbUJELHNFQUlDO0FBc0NELDRFQW1DQztBQUVELHdGQXNDQztBQTdXRCxxREFBOEU7QUFFOUUsTUFBTSxtQ0FBbUMsR0FBRyxDQUFDLENBQUE7QUF1QnRDLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsT0FBZSxFQUNmLGFBQXFCLG1DQUFtQyxFQUN4RCxTQUF3QixFQUN4QixjQUFxQyxRQUFRO0lBRTdDLDZEQUE2RDtJQUM3RCw4REFBOEQ7SUFDOUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBYSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUU1RSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sS0FBSztTQUNqQyxLQUFLLENBQUM7UUFDTCxNQUFNLEVBQUUsT0FBTztRQUNmLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSwyQkFBMkIsQ0FBQztRQUM5RCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFO0tBQ3pCLENBQUM7U0FDRCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFFOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFHRCxNQUFNLFlBQVksR0FBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBaUMsSUFBSSxFQUFFLENBQUE7SUFFdkUsSUFB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
380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0dXJucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9oZWxwZXJzL3JldHVybnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBK0VBLGdFQVVDO0FBTUQsa0RBOEJDO0FBRUQsd0RBY0M7QUFNRCxrRUFxQ0M7QUFFRCw4REE4REM7QUFLRCxnREE0Q0M7QUFLRCxvREFTQztBQUtELHNEQXFCQztBQUtELGdEQUtDO0FBS0QsMENBRUM7QUFRRCw0RUE2QkM7QUFtQkQsc0VBSUM7QUFzQ0QsNEVBbUNDO0FBRUQsd0ZBc0NDO0FBOWdCRCxxREFBOEU7QUFFOUUsTUFBTSxtQ0FBbUMsR0FBRyxDQUFDLENBQUE7QUF3QjdDLFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUM3RSxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBYTtJQUM5QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNwRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ1UsUUFBQSx3QkFBd0IsR0FBRztJQUN0QyxJQUFJO0lBQ0osVUFBVTtJQUNWLFFBQVE7SUFDUixZQUFZO0lBQ1osWUFBWTtJQUNaLFlBQVk7SUFDWixhQUFhO0lBQ2IsY0FBYztJQUNkLGFBQWE7SUFDYixlQUFlO0lBQ2YsWUFBWTtJQUNaLGFBQWE7SUFDYixVQUFVO0lBQ1YsYUFBYTtJQUNiLFNBQVM7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
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseFulfilledQuantity = parseFulfilledQuantity;
4
+ exports.getItemFulfilledQuantity = getItemFulfilledQuantity;
5
+ /**
6
+ * Parse Medusa BigNumber / detail fulfilled quantity fields into a non-negative integer.
7
+ * Returns 0 when the value is missing or unparsable (never throws).
8
+ */
9
+ function parseFulfilledQuantity(value) {
10
+ if (value == null) {
11
+ return 0;
12
+ }
13
+ if (typeof value === "number") {
14
+ return Number.isFinite(value) && value > 0 ? Math.floor(value) : 0;
15
+ }
16
+ if (typeof value === "string") {
17
+ const trimmed = value.trim();
18
+ if (!trimmed) {
19
+ return 0;
20
+ }
21
+ const parsed = Number(trimmed);
22
+ return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : 0;
23
+ }
24
+ if (typeof value === "object") {
25
+ const record = value;
26
+ if ("value" in record) {
27
+ return parseFulfilledQuantity(record.value);
28
+ }
29
+ if ("numeric" in record) {
30
+ return parseFulfilledQuantity(record.numeric);
31
+ }
32
+ }
33
+ return 0;
34
+ }
35
+ function getItemFulfilledQuantity(item) {
36
+ const detail = item.detail != null && typeof item.detail === "object"
37
+ ? item.detail
38
+ : undefined;
39
+ const candidates = [
40
+ item.fulfilled_quantity,
41
+ detail?.fulfilled_quantity,
42
+ detail?.raw_fulfilled_quantity,
43
+ ];
44
+ for (const candidate of candidates) {
45
+ const qty = parseFulfilledQuantity(candidate);
46
+ if (qty > 0) {
47
+ return qty;
48
+ }
49
+ }
50
+ return 0;
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsZmlsbGVkLXF1YW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL2Z1bGZpbGxlZC1xdWFudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLHdEQTZCQztBQUVELDREQXVCQztBQTFERDs7O0dBR0c7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxLQUFjO0lBQ25ELElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLENBQUE7UUFDVixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzlCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsS0FBZ0MsQ0FBQTtRQUMvQyxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN0QixPQUFPLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3QyxDQUFDO1FBQ0QsSUFBSSxTQUFTLElBQUksTUFBTSxFQUFFLENBQUM7WUFDeEIsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBQTtBQUNWLENBQUM7QUFFRCxTQUFnQix3QkFBd0IsQ0FBQyxJQUd4QztJQUNDLE1BQU0sTUFBTSxHQUNWLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRO1FBQ3BELENBQUMsQ0FBRSxJQUFJLENBQUMsTUFBa0M7UUFDMUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUVmLE1BQU0sVUFBVSxHQUFjO1FBQzVCLElBQUksQ0FBQyxrQkFBa0I7UUFDdkIsTUFBTSxFQUFFLGtCQUFrQjtRQUMxQixNQUFNLEVBQUUsc0JBQXNCO0tBQy9CLENBQUE7SUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzdDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTyxHQUFHLENBQUE7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQyJ9
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.unwrapWorkflowError = unwrapWorkflowError;
4
+ exports.statusCodeForMedusaErrorType = statusCodeForMedusaErrorType;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ function isRecord(value) {
7
+ return typeof value === "object" && value !== null;
8
+ }
9
+ function readString(value) {
10
+ return typeof value === "string" && value.trim() !== "" ? value.trim() : undefined;
11
+ }
12
+ /**
13
+ * Medusa workflow `.run()` often wraps the real failure in nested objects
14
+ * (`error`, `cause`, `errors[]`) that are not `instanceof Error` / `MedusaError`.
15
+ * Dig until we find a usable message and Medusa-like type.
16
+ */
17
+ function unwrapWorkflowError(error) {
18
+ const visited = new Set();
19
+ const queue = [error];
20
+ let bestMessage;
21
+ let bestType;
22
+ let sawMedusa = false;
23
+ while (queue.length > 0) {
24
+ const current = queue.shift();
25
+ if (current == null || visited.has(current)) {
26
+ continue;
27
+ }
28
+ visited.add(current);
29
+ if (typeof current === "string") {
30
+ if (!bestMessage) {
31
+ bestMessage = current;
32
+ }
33
+ continue;
34
+ }
35
+ if (current instanceof utils_1.MedusaError) {
36
+ sawMedusa = true;
37
+ bestMessage = current.message || bestMessage;
38
+ bestType = current.type || bestType;
39
+ continue;
40
+ }
41
+ if (current instanceof Error) {
42
+ // Prefer nested Error messages (often the real provider failure).
43
+ if (current.message) {
44
+ bestMessage = current.message;
45
+ }
46
+ const maybeType = current.type;
47
+ if (typeof maybeType === "string") {
48
+ bestType = maybeType;
49
+ }
50
+ if (current.__isMedusaError === true) {
51
+ sawMedusa = true;
52
+ }
53
+ const cause = current.cause;
54
+ if (cause != null) {
55
+ queue.push(cause);
56
+ }
57
+ continue;
58
+ }
59
+ if (!isRecord(current)) {
60
+ continue;
61
+ }
62
+ const like = current;
63
+ if (like.__isMedusaError === true || like.name === "MedusaError") {
64
+ sawMedusa = true;
65
+ }
66
+ const message = readString(like.message) ||
67
+ readString(current["msg"]) ||
68
+ readString(current["detail"]);
69
+ if (message && !bestMessage) {
70
+ bestMessage = message;
71
+ }
72
+ if (typeof like.type === "string" && !bestType) {
73
+ bestType = like.type;
74
+ }
75
+ if (like.error != null) {
76
+ queue.push(like.error);
77
+ }
78
+ if (like.cause != null) {
79
+ queue.push(like.cause);
80
+ }
81
+ if (Array.isArray(like.errors)) {
82
+ for (const nested of like.errors) {
83
+ queue.push(nested);
84
+ }
85
+ }
86
+ }
87
+ return {
88
+ message: bestMessage || "An error occurred",
89
+ type: bestType,
90
+ isMedusaError: sawMedusa || Boolean(bestType),
91
+ };
92
+ }
93
+ function statusCodeForMedusaErrorType(type) {
94
+ switch (type) {
95
+ case utils_1.MedusaError.Types.NOT_FOUND:
96
+ return 404;
97
+ case utils_1.MedusaError.Types.NOT_ALLOWED:
98
+ return 403;
99
+ case utils_1.MedusaError.Types.UNAUTHORIZED:
100
+ return 401;
101
+ case utils_1.MedusaError.Types.INVALID_DATA:
102
+ case utils_1.MedusaError.Types.INVALID_ARGUMENT:
103
+ return 400;
104
+ default:
105
+ return 400;
106
+ }
107
+ }
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW53cmFwLXdvcmtmbG93LWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Vud3JhcC13b3JrZmxvdy1lcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdDQSxrREFzRkM7QUFFRCxvRUFjQztBQXRJRCxxREFBdUQ7QUFtQnZELFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQTtBQUNwRCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYztJQUNoQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtBQUNwRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEtBQWM7SUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVcsQ0FBQTtJQUNsQyxNQUFNLEtBQUssR0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWhDLElBQUksV0FBK0IsQ0FBQTtJQUNuQyxJQUFJLFFBQTRCLENBQUE7SUFDaEMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFBO0lBRXJCLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDN0IsSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxTQUFRO1FBQ1YsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFcEIsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUs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
@@ -1,59 +1,105 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cancelOrderStep = void 0;
4
+ exports.cancelOpenUnshippedFulfillments = cancelOpenUnshippedFulfillments;
5
+ exports.executeCancelOrder = executeCancelOrder;
4
6
  const utils_1 = require("@medusajs/framework/utils");
5
7
  const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
8
  const core_flows_1 = require("@medusajs/medusa/core-flows");
7
- exports.cancelOrderStep = (0, workflows_sdk_1.createStep)("cancel-order-step", async (input, { container }) => {
9
+ const fulfilled_quantity_1 = require("../../utils/fulfilled-quantity");
10
+ const unwrap_workflow_error_1 = require("../../utils/unwrap-workflow-error");
11
+ /**
12
+ * Cancel unshipped open fulfillments so Medusa core cancelOrderWorkflow can proceed.
13
+ * Shipped fulfillments cannot be canceled — those block order cancel intentionally.
14
+ */
15
+ async function cancelOpenUnshippedFulfillments(container, orderId, cancelFulfillment) {
16
+ let query;
17
+ try {
18
+ query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
19
+ }
20
+ catch {
21
+ return;
22
+ }
23
+ const { data } = await query.graph({
24
+ entity: "order",
25
+ fields: ["id", "fulfillments.id", "fulfillments.canceled_at", "fulfillments.shipped_at"],
26
+ filters: { id: orderId },
27
+ });
28
+ const orderRow = data?.[0];
29
+ const fulfillments = (orderRow?.fulfillments ?? []);
30
+ const open = fulfillments.filter((f) => f?.id && !f.canceled_at);
31
+ if (open.length === 0) {
32
+ return;
33
+ }
34
+ const shipped = open.filter((f) => Boolean(f.shipped_at));
35
+ if (shipped.length > 0) {
36
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Cannot cancel order: Some items have already been fulfilled or shipped");
37
+ }
38
+ for (const fulfillment of open) {
39
+ await cancelFulfillment({
40
+ order_id: orderId,
41
+ fulfillment_id: fulfillment.id,
42
+ });
43
+ }
44
+ }
45
+ async function executeCancelOrder(input, container, deps) {
8
46
  const { order } = input;
9
47
  if (!order || !order.id) {
10
48
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order is required to cancel");
11
49
  }
12
- // Check if order has fulfilled items
13
- // Check order items' fulfilled_quantity directly from the order data
14
50
  const orderItems = order.items || [];
15
- const hasFulfilledItems = orderItems.some((item) => {
16
- // Access detail field safely using the [key: string]: unknown type
17
- const detail = item.detail;
18
- const fulfilledQuantity = item.fulfilled_quantity;
19
- // Check fulfilled_quantity from detail.raw_fulfilled_quantity or direct field
20
- const fulfilledQty = detail?.raw_fulfilled_quantity?.value
21
- ? parseInt(detail.raw_fulfilled_quantity.value, 10)
22
- : fulfilledQuantity || 0;
23
- return fulfilledQty > 0;
24
- });
51
+ const hasFulfilledItems = orderItems.some((item) => (0, fulfilled_quantity_1.getItemFulfilledQuantity)({
52
+ fulfilled_quantity: item.fulfilled_quantity,
53
+ detail: item.detail,
54
+ }) > 0);
25
55
  if (hasFulfilledItems) {
26
56
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Cannot cancel order: Some items have already been fulfilled");
27
57
  }
28
- try {
29
- // Use Medusa's built-in cancel order workflow
30
- const { result } = await (0, core_flows_1.cancelOrderWorkflow)(container).run({
31
- input: {
32
- order_id: order.id,
33
- },
58
+ const cancelFulfillment = deps?.cancelFulfillment ??
59
+ (async (fulfillmentInput) => {
60
+ await (0, core_flows_1.cancelOrderFulfillmentWorkflow)(container).run({
61
+ input: fulfillmentInput,
62
+ });
63
+ });
64
+ const cancelOrder = deps?.cancelOrder ??
65
+ (async (cancelInput) => {
66
+ const { result } = await (0, core_flows_1.cancelOrderWorkflow)(container).run({
67
+ input: cancelInput,
68
+ });
69
+ return result;
34
70
  });
35
- // The workflow result structure may vary, handle it safely
71
+ try {
72
+ await cancelOpenUnshippedFulfillments(container, order.id, cancelFulfillment);
73
+ const result = await cancelOrder({ order_id: order.id });
36
74
  const workflowResult = result;
37
- // Extract order ID and status from result (may be nested or direct)
38
75
  const canceledOrderId = workflowResult?.order?.id || workflowResult?.id || order.id;
39
76
  const canceledStatus = workflowResult?.order?.status || workflowResult?.status || "canceled";
40
- return new workflows_sdk_1.StepResponse({
77
+ return {
41
78
  order_id: canceledOrderId,
42
79
  status: canceledStatus,
43
80
  message: "Order canceled successfully",
44
- });
81
+ };
45
82
  }
46
83
  catch (error) {
47
- // Handle cancellation errors
48
84
  if (error instanceof utils_1.MedusaError) {
49
85
  throw error;
50
86
  }
51
- const errorMessage = error instanceof Error ? error.message : "Failed to cancel order";
52
- // Check for common error scenarios
53
- if (errorMessage.includes("fulfilled") || errorMessage.includes("shipped")) {
87
+ const unwrapped = (0, unwrap_workflow_error_1.unwrapWorkflowError)(error);
88
+ const errorMessage = unwrapped.message;
89
+ if (errorMessage.includes("fulfilled") ||
90
+ errorMessage.includes("shipped") ||
91
+ errorMessage.includes("fulfillment")) {
54
92
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Cannot cancel order: Some items have already been fulfilled or shipped");
55
93
  }
56
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to cancel order: ${errorMessage}`);
94
+ const knownTypes = new Set(Object.values(utils_1.MedusaError.Types));
95
+ const errorType = unwrapped.type && knownTypes.has(unwrapped.type)
96
+ ? unwrapped.type
97
+ : utils_1.MedusaError.Types.UNEXPECTED_STATE;
98
+ throw new utils_1.MedusaError(errorType, `Failed to cancel order: ${errorMessage}`);
57
99
  }
100
+ }
101
+ exports.cancelOrderStep = (0, workflows_sdk_1.createStep)("cancel-order-step", async (input, { container }) => {
102
+ const output = await executeCancelOrder(input, container);
103
+ return new workflows_sdk_1.StepResponse(output);
58
104
  });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLW9yZGVyLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2NhbmNlbC1vcmRlci1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUErRztBQUMvRyxxRUFBNEU7QUFDNUUsNERBQWlFO0FBY3BELFFBQUEsZUFBZSxHQUFHLElBQUEsMEJBQVUsRUFDdkMsbUJBQW1CLEVBQ25CLEtBQUssRUFDSCxLQUEyQixFQUMzQixFQUFFLFNBQVMsRUFBRSxFQUNpQyxFQUFFO0lBQ2hELE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qiw2QkFBNkIsQ0FDOUIsQ0FBQTtJQUNILENBQUM7SUFFRCxxQ0FBcUM7SUFDckMscUVBQXFFO0lBQ3JFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO0lBQ3BDLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2pELG1FQUFtRTtRQUNuRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBcUUsQ0FBQTtRQUN6RixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBd0MsQ0FBQTtRQUV2RSw4RUFBOEU7UUFDOUUsTUFBTSxZQUFZLEdBQUcsTUFBTSxFQUFFLHNCQUFzQixFQUFFLEtBQUs7WUFDeEQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNuRCxDQUFDLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFBO1FBRTFCLE9BQU8sWUFBWSxHQUFHLENBQUMsQ0FBQTtJQUN6QixDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUM3Qiw2REFBNkQsQ0FDOUQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCw4Q0FBOEM7UUFDOUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSxnQ0FBbUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDMUQsS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRTthQUNuQjtTQUNGLENBQUMsQ0FBQTtRQUVGLDJEQUEyRDtRQUMzRCxNQUFNLGNBQWMsR0FBRyxNQUl0QixDQUFBO1FBRUQsb0VBQW9FO1FBQ3BFLE1BQU0sZUFBZSxHQUFHLGNBQWMsRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLGNBQWMsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQTtRQUNuRixNQUFNLGNBQWMsR0FBRyxjQUFjLEVBQUUsS0FBSyxFQUFFLE1BQU0sSUFBSSxjQUFjLEVBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQTtRQUU1RixPQUFPLElBQUksNEJBQVksQ0FBd0I7WUFDN0MsUUFBUSxFQUFFLGVBQWU7WUFDekIsTUFBTSxFQUFFLGNBQWM7WUFDdEIsT0FBTyxFQUFFLDZCQUE2QjtTQUN2QyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDZCQUE2QjtRQUM3QixJQUFJLEtBQUssWUFBWSxtQkFBVyxFQUFFLENBQUM7WUFDakMsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQ2hCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFBO1FBRW5FLG1DQUFtQztRQUNuQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzNFLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzdCLHdFQUF3RSxDQUN6RSxDQUFBO1FBQ0gsQ0FBQztRQUVELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsMkJBQTJCLFlBQVksRUFBRSxDQUMxQyxDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUMsQ0FDRixDQUFBIn0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLW9yZGVyLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2NhbmNlbC1vcmRlci1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNEQSwwRUF3Q0M7QUFFRCxnREEwR0M7QUExTUQscURBR2tDO0FBQ2xDLHFFQUE0RTtBQUM1RSw0REFHb0M7QUFHcEMsdUVBQXlFO0FBQ3pFLDZFQUF1RTtBQXNDdkU7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLCtCQUErQixDQUNuRCxTQUFtQyxFQUNuQyxPQUFlLEVBQ2YsaUJBQXVEO0lBRXZELElBQUksS0FBbUIsQ0FBQTtJQUN2QixJQUFJLENBQUM7UUFDSCxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBZSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxPQUFPO1FBQ2YsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixDQUFDO1FBQ3hGLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7S0FDekIsQ0FBQyxDQUFBO0lBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxRQUFRLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBeUIsQ0FBQTtJQUMzRSxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRWhFLElBQUks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
package/README.md CHANGED
@@ -150,7 +150,9 @@ Most production values are expected to be supplied via plugin options in `medusa
150
150
  | GET | `/store/guest-orders/:id` | Guest JWT | Get guest order. |
151
151
  | POST | `/store/guest-orders/:id/cancel` | Guest JWT | Cancel guest order. |
152
152
  | POST | `/store/guest-orders/:id/reorder` | Guest JWT | Reorder guest order. |
153
- | POST | `/store/guest-orders/:id/returns` | Guest JWT | Create guest return. |
153
+ | POST | `/store/guest-orders/:id/returns` | Guest JWT | Create guest return (optional `refund_payment` / `refund_payment_id`). |
154
+ | GET/POST | `/store/guest-orders/:id/payment-details` | Guest JWT | List / create guest refund destinations. |
155
+ | PUT | `/store/guest-orders/:id/returns/:return_id/refund-payment` | Guest JWT | Link payment_detail to return mapping. |
154
156
  | GET | `/store/guest-orders/:id/swaps` | Guest JWT | List guest exchange requests. |
155
157
  | POST | `/store/guest-orders/:id/swaps` | Guest JWT | Create guest exchange request. |
156
158
  | GET | `/store/guest-orders/:id/swaps/:swap_id` | Guest JWT | Get guest exchange request. |
@@ -268,9 +270,11 @@ curl "http://localhost:9000/admin/orders/order_123/refund-context" \
268
270
  |---|---|---|
269
271
  | OTP request fails with template/config message | Missing `email.otpTemplate` or unresolved plugin options | Configure plugin options in `medusa-config.ts`; verify template path exists. |
270
272
  | Guest JWT endpoints return unauthorized | Invalid/expired token or `jwtSecret` mismatch | Re-run OTP verify and ensure same `jwtSecret` is used in runtime config. |
273
+ | Store cancel returns generic `An error occurred` | Workflow failure was wrapped and not unwrapped by the cancel route | Upgrade this plugin. Nested Medusa/workflow errors are now unwrapped into a real `message`. Check payment refund/void logs if cancel still fails. |
274
+ | Cancel blocked by open fulfillments on a “not fulfilled” order | Core cancel requires all fulfillments to have `canceled_at` | Upgrade this plugin. Unshipped open fulfillments are canceled automatically before core cancel. |
271
275
  | Return/exchange blocked with `RETURN_WINDOW_EXPIRED` | Delivery date outside configured window | Increase `returnValidInDays`/`exchangeValidInDays` or update storefront UX for expiry handling. |
272
276
  | Refund mapping routes fail | `refund-payment-mapping` module not registered/migrated | Register module and run migrations. |
273
- | Guest return shows no payment method in Admin | Guest orders have no saved `payment_detail`; older plugin versions only resolved customer payment details | Upgrade this plugin. Admin now reads checkout `provider_id` via `order_payment`. |
277
+ | Guest return shows no payment method in Admin | Guest COD returns previously stored `payment_id=null` and guests could not create/link payment details | Upgrade this plugin. Pass `refund_payment` / `refund_payment_id` on guest return create, or use `POST /store/guest-orders/:id/payment-details` + `PUT .../returns/:return_id/refund-payment`. |
274
278
  | Cannot set default payment via create/update | API intentionally blocks `is_default` in request body | Use `POST /store/payment-details/:id/make-default`. |
275
279
  | No development stack traces in API errors | `NODE_ENV` not `development` | Set `NODE_ENV=development` locally when debugging. |
276
280
 
@@ -316,6 +320,8 @@ This plugin is compatible with Medusa v2 (e.g. `@medusajs/framework` and `@medus
316
320
  ## Features
317
321
 
318
322
  - **Order Management**: Cancel and reorder for both authenticated customers and guest orders
323
+ - **Cancel error surfacing**: Customer/guest cancel routes unwrap nested Medusa workflow errors so the storefront shows the real failure (not a bare `An error occurred`)
324
+ - **Cancel pre-clears unshipped fulfillments**: Before calling Medusa core cancel, open unshipped fulfillments are canceled so pending orders are not blocked by fulfillment rows
319
325
  - **Authenticated Customer APIs**: Store endpoints for logged-in customers to cancel orders (`/store/orders/cancel/:order_id`), reorder (`/store/orders/reorder/:order_id`), manage returns (`/store/returns`), and manage exchanges (`/store/swaps`)
320
326
  - **Guest Order Portal**: OTP-based look-up for guest users with full order management (view orders, initiate returns, cancel, reorder)
321
327
  - **Guest Order Actions**: Secure JWT-protected endpoints for guest users to view orders, initiate returns (via Medusa workflow), cancel orders, reorder (all under `/store/guest-orders/:id/...`)
@@ -681,9 +687,11 @@ The plugin provides the following store API endpoints for the Guest Order Portal
681
687
 
682
688
  #### Guest Order Actions
683
689
  - `GET /store/guest-orders/:id` - Get full details for a specific guest order (requires guest JWT).
684
- - `POST /store/guest-orders/:id/returns` - Initiate a return request for a guest order.
690
+ - `POST /store/guest-orders/:id/returns` - Initiate a return request for a guest order. Optional body fields: `refund_payment_id`, or inline `refund_payment: { type, detail_json }` (e.g. UPI). COD guest returns require a refund destination.
691
+ - `GET/POST /store/guest-orders/:id/payment-details` - List / create refund destinations (UPI/bank/card) for the guest order's customer.
692
+ - `PUT /store/guest-orders/:id/returns/:return_id/refund-payment` - Link a `payment_id` to the return's refund mapping.
685
693
 
686
- Guest returns typically have no saved `payment_detail`. Admin still shows the **order payment method** used at checkout (`GET /admin/orders/:order_id/refund-context` → `order_payment`, and `GET /admin/return/:id` → `order.order_payment`). Prepaid refunds default to that original method; COD shows Cash on Delivery.
694
+ Guest prepaid refunds still default to the original checkout method when no destination is specified. Guest COD refunds store the provided UPI/bank/card on `refund_payment_mapping` so Admin Refund Payment can display it.
687
695
  - `POST /store/guest-orders/:id/cancel` - Cancel a guest order.
688
696
  - `POST /store/guest-orders/:id/reorder` - Reorder a guest order (creates a new cart with the same items).
689
697
  - `GET /store/guest-orders/:id/swaps` - List exchange requests for the guest order.
@@ -1568,6 +1576,21 @@ Returns store rich metadata for audit trails:
1568
1576
 
1569
1577
  ## Known Issues & Fixes
1570
1578
 
1579
+ ### Issue: Admin/store return lists crash with `isInitialized` on Medusa 2.21
1580
+
1581
+ **Problem:**
1582
+ `GET /admin/return` (and store return list/detail) threw `Cannot read properties of undefined (reading 'isInitialized')` from `@medusajs/order` `ReturnRepository.loadShippingAdjustments`. The Admin Returns page returned HTTP 500.
1583
+
1584
+ **Root Cause:**
1585
+ Medusa 2.21 `listAndCountReturns` / `retrieveReturn` with `shipping_methods` hydrates the parent order's `order_shipping` rows and reads `shipping_method.adjustments.isInitialized`. Orphan join rows (missing nested `shipping_method`) crash the whole list.
1586
+
1587
+ **Solution:**
1588
+ Return list/detail routes load returns through Query Graph (`loadReturnsViaQuery` / `loadReturnByIdViaQuery`) without `shipping_methods`. Shipping methods for refund charges are attached in a separate try/catch (`attachReturnShippingMethods`) so a hydrate failure cannot take down the list.
1589
+
1590
+ **Prevention:**
1591
+ - Do not call `OrderModule.listAndCountReturns` / `retrieveReturn` with `shipping_methods` on Medusa 2.21
1592
+ - Keep list Graph fields free of `shipping_methods*`
1593
+
1571
1594
  ### Issue: Storefront return tracking can show items as received after a premature refund
1572
1595
 
1573
1596
  **Problem:**