order-management 0.0.78 → 0.0.80

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 (44) hide show
  1. package/.medusa/server/src/admin/index.js +619 -619
  2. package/.medusa/server/src/admin/index.mjs +620 -620
  3. package/.medusa/server/src/api/admin/orders/[order_id]/cancel-reason-mapping/route.js +1 -2
  4. package/.medusa/server/src/api/admin/orders/[order_id]/refund-context/route.js +1 -2
  5. package/.medusa/server/src/api/admin/payment-transactions/[id]/route.js +1 -2
  6. package/.medusa/server/src/api/admin/payment-transactions/route.js +1 -2
  7. package/.medusa/server/src/api/admin/refund-payment-mapping/[return_id]/mark-refunded/route.js +1 -2
  8. package/.medusa/server/src/api/admin/refund-payment-mapping/[return_id]/route.js +1 -2
  9. package/.medusa/server/src/api/admin/refunds/[id]/route.js +1 -2
  10. package/.medusa/server/src/api/admin/refunds/route.js +1 -2
  11. package/.medusa/server/src/api/admin/return/[id]/route.js +1 -2
  12. package/.medusa/server/src/api/admin/return/route.js +1 -2
  13. package/.medusa/server/src/api/admin/swaps/[id]/cancel/route.js +1 -2
  14. package/.medusa/server/src/api/store/guest-orders/[id]/cancel/route.js +1 -4
  15. package/.medusa/server/src/api/store/guest-orders/[id]/cancel-reason-mapping/route.js +1 -3
  16. package/.medusa/server/src/api/store/guest-orders/[id]/reorder/route.js +1 -13
  17. package/.medusa/server/src/api/store/guest-orders/[id]/returns/route.js +2 -3
  18. package/.medusa/server/src/api/store/guest-orders/[id]/route.js +1 -2
  19. package/.medusa/server/src/api/store/guest-orders/[id]/swaps/[swap_id]/cancel/route.js +1 -2
  20. package/.medusa/server/src/api/store/guest-orders/[id]/swaps/[swap_id]/route.js +1 -2
  21. package/.medusa/server/src/api/store/guest-orders/[id]/swaps/route.js +2 -5
  22. package/.medusa/server/src/api/store/guest-orders/route.js +1 -2
  23. package/.medusa/server/src/api/store/orders/[order_id]/cancel-reason-mapping/route.js +1 -2
  24. package/.medusa/server/src/api/store/orders/[order_id]/refund-payment-mappings/route.js +1 -2
  25. package/.medusa/server/src/api/store/orders/cancel/[order_id]/route.js +1 -19
  26. package/.medusa/server/src/api/store/otp/request/route.js +6 -15
  27. package/.medusa/server/src/api/store/otp/verify/route.js +1 -2
  28. package/.medusa/server/src/api/store/payment-details/[id]/make-default/route.js +1 -2
  29. package/.medusa/server/src/api/store/payment-details/[id]/route.js +1 -2
  30. package/.medusa/server/src/api/store/payment-details/route.js +1 -3
  31. package/.medusa/server/src/api/store/refund-payment-mapping/[return_id]/route.js +1 -3
  32. package/.medusa/server/src/api/store/returns/[id]/cancel/route.js +1 -2
  33. package/.medusa/server/src/api/store/returns/[id]/route.js +1 -2
  34. package/.medusa/server/src/api/store/returns/route.js +4 -8
  35. package/.medusa/server/src/api/store/swaps/[id]/cancel/route.js +1 -2
  36. package/.medusa/server/src/api/store/swaps/[id]/route.js +1 -2
  37. package/.medusa/server/src/api/store/swaps/route.js +2 -5
  38. package/.medusa/server/src/helpers/order-exchange-data.js +5 -20
  39. package/.medusa/server/src/subscribers/order-status-change.js +1 -3
  40. package/.medusa/server/src/subscribers/send-order-email.js +4 -7
  41. package/.medusa/server/src/utils/email-branding.js +8 -0
  42. package/.medusa/server/src/utils/notification-handler.js +6 -15
  43. package/README.md +276 -0
  44. package/package.json +5 -3
@@ -5,6 +5,7 @@ const utils_1 = require("@medusajs/framework/utils");
5
5
  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
+ const email_branding_1 = require("./email-branding");
8
9
  /** Max length for FCM notification body to avoid "Android message is too big" (payload limit ~4KB). */
9
10
  const PUSH_BODY_MAX_LENGTH = 200;
10
11
  /**
@@ -119,7 +120,6 @@ async function sendChannelNotification(to, message, channel, templateData, conta
119
120
  else {
120
121
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Notification service does not support sending notifications.");
121
122
  }
122
- console.log(`[${channel.toUpperCase()} Notification] Sent successfully to ${to}`);
123
123
  }
124
124
  catch (error) {
125
125
  console.error(`[${channel.toUpperCase()} Notification] Error sending: ${error instanceof Error ? error.message : String(error)}`);
@@ -193,7 +193,6 @@ const smsChannelHandler = async (recipient, message, templateData, container) =>
193
193
  else {
194
194
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Notification service does not support sending notifications.");
195
195
  }
196
- console.log(`[SMS Notification] Sent successfully to ${recipient}`);
197
196
  }
198
197
  catch (error) {
199
198
  console.error(`[SMS Notification] Error sending: ${error instanceof Error ? error.message : String(error)}`);
@@ -216,12 +215,10 @@ const pushChannelHandler = async (recipient, message, templateData, container) =
216
215
  // Module not registered (e.g. medusa-notification-token-management not installed)
217
216
  }
218
217
  if (!tokenService?.getCustomerTokens) {
219
- console.warn(`[Notification Handler] Push channel requires notification_tokens module (e.g. medusa-notification-token-management). Skipping push.`);
220
218
  return;
221
219
  }
222
220
  const tokens = await tokenService.getCustomerTokens(recipient);
223
221
  if (!tokens?.length) {
224
- console.warn(`[Notification Handler] No active notification tokens for customer ${recipient}. Skipping push.`);
225
222
  return;
226
223
  }
227
224
  for (const record of tokens) {
@@ -320,13 +317,11 @@ async function handleOrderStatusNotifications(orderId, newStatus, container) {
320
317
  const config = (0, config_1.resolveOrderManagementOptions)(configModule);
321
318
  // Check if notifications are enabled
322
319
  if (!config.notifications.enabled) {
323
- console.log(`[Notification Handler] Notifications are disabled`);
324
320
  return;
325
321
  }
326
322
  // Get notification configurations for the current status
327
323
  const notificationConfigs = config.notifications.statusConfig[newStatus];
328
324
  if (!notificationConfigs || notificationConfigs.length === 0) {
329
- console.log(`[Notification Handler] No notifications configured for status ${newStatus}`);
330
325
  return;
331
326
  }
332
327
  // Query order details
@@ -376,7 +371,7 @@ async function handleOrderStatusNotifications(orderId, newStatus, container) {
376
371
  const currency_code = typeof currencyRaw === "string" && currencyRaw.trim().length > 0
377
372
  ? currencyRaw.trim().toLowerCase()
378
373
  : undefined;
379
- const templateData = {
374
+ const templateData = await (0, email_branding_1.withEmailBranding)(container, {
380
375
  order_id: order.id || "N/A",
381
376
  display_id: (0, template_1.normalizeOrderDisplayId)(order.display_id),
382
377
  order_status: order.status || newStatus,
@@ -391,7 +386,7 @@ async function handleOrderStatusNotifications(orderId, newStatus, container) {
391
386
  claim_link: isRegistered ? claimLink : undefined,
392
387
  storefront_url: config.storefrontUrl,
393
388
  storefrontUrl: config.storefrontUrl,
394
- };
389
+ }, { storefrontUrl: config.storefrontUrl });
395
390
  const results = [];
396
391
  const notificationPromises = notificationConfigs.map(async (notificationConfig) => {
397
392
  const channel = notificationConfig.channel;
@@ -400,12 +395,10 @@ async function handleOrderStatusNotifications(orderId, newStatus, container) {
400
395
  ? notificationConfig.getRecipient(order, templateData)
401
396
  : getRecipientResolver(notificationConfig.channel)(order, templateData);
402
397
  if (!recipient) {
403
- console.warn(`[Notification Handler] ${channel.toUpperCase()} notification configured but no recipient found for order ${orderId}`);
404
398
  results.push({ channel, result: "skipped", error: "no recipient" });
405
399
  return;
406
400
  }
407
401
  await sendSingleNotification(notificationConfig, recipient, templateData, container);
408
- console.log(`[Notification Handler] ${channel.toUpperCase()} notification sent for status ${newStatus}`);
409
402
  results.push({ channel, result: "sent" });
410
403
  }
411
404
  catch (error) {
@@ -418,11 +411,9 @@ async function handleOrderStatusNotifications(orderId, newStatus, container) {
418
411
  const sent = results.filter((r) => r.result === "sent").length;
419
412
  const failed = results.filter((r) => r.result === "failed").length;
420
413
  const skipped = results.filter((r) => r.result === "skipped").length;
421
- console.log(`[Notification Handler] Status "${newStatus}" order ${orderId}: configured=${notificationConfigs.length} (${notificationConfigs.map((c) => c.channel).join(", ")}), sent=${sent}, failed=${failed}, skipped=${skipped}`);
422
414
  if (failed > 0) {
423
- results.filter((r) => r.result === "failed").forEach((r) => {
424
- console.warn(`[Notification Handler] - ${r.channel}: ${r.error}`);
425
- });
415
+ void sent;
416
+ void skipped;
426
417
  }
427
418
  }
428
419
  catch (error) {
@@ -430,4 +421,4 @@ async function handleOrderStatusNotifications(orderId, newStatus, container) {
430
421
  // Don't throw - notification errors shouldn't break order flow
431
422
  }
432
423
  }
433
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvbm90aWZpY2F0aW9uLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErYkEsd0VBZ0pDO0FBOWtCRCxxREFBMkY7QUFDM0YseUNBS21CO0FBQ25CLHNGQUE0RTtBQUM1RSxzQ0FBaUY7QUFzQmpGLHVHQUF1RztBQUN2RyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQTtBQUVoQzs7R0FFRztBQUNILFNBQVMsbUJBQW1CLENBQUMsS0FBOEI7SUFDekQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQTtJQUM3QixJQUFJLFdBQW9CLENBQUE7SUFDeEIsSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDM0MsTUFBTSxDQUFDLEdBQUcsT0FBa0MsQ0FBQTtRQUM1QyxXQUFXLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQTtJQUMzRCxDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQTtJQUMzRCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUNELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUNELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDcEIsQ0FBQztJQUNELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFD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
424
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvbm90aWZpY2F0aW9uLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0YkEsd0VBZ0pDO0FBM2tCRCxxREFBMkY7QUFDM0YseUNBS21CO0FBQ25CLHNGQUE0RTtBQUM1RSxzQ0FBaUY7QUFFakYscURBQW9EO0FBcUJwRCx1R0FBdUc7QUFDdkcsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUE7QUFFaEM7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQThCO0lBQ3pELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUE7SUFDN0IsSUFBSSxXQUFvQixDQUFBO0lBQ3hCLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxHQUFHLE9BQWtDLENBQUE7UUFDNUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUE7SUFDM0QsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUE7SUFDM0QsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN2RCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3BCLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEs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
package/README.md CHANGED
@@ -1,3 +1,279 @@
1
+ # order-management
2
+ > Order lifecycle management plugin for Medusa v2 with customer/guest cancel + reorder, returns, exchanges, payment detail capture, and refund mapping workflows.
3
+
4
+ ## Plugin Overview
5
+
6
+ `order-management` extends Medusa order operations with:
7
+ - customer and guest order actions (`cancel`, `reorder`, returns, swaps),
8
+ - OTP-based guest portal JWT flow,
9
+ - payment detail storage (`upi`, `bank`, `card`) and default payment rules,
10
+ - refund payment mapping and admin refund context tooling,
11
+ - order status email/notification subscribers,
12
+ - admin UI routes/widgets for returns, swaps, payments, refunds.
13
+
14
+ It solves common gaps where storefronts need secure post-purchase self-service (especially for guest orders), richer refund operations, and operational admin screens without implementing all workflows manually.
15
+
16
+ Built for **Medusa v2** (`@medusajs/framework`/`@medusajs/medusa` `2.11.2` in `package.json`).
17
+
18
+ ## Installation & Setup
19
+
20
+ ```bash
21
+ npm install order-management
22
+ # or
23
+ yarn add order-management
24
+ ```
25
+
26
+ Register plugin in `medusa-config.ts`:
27
+
28
+ ```ts
29
+ import { defineConfig } from "@medusajs/framework/utils"
30
+ import orderManagement from "order-management"
31
+
32
+ export default defineConfig({
33
+ plugins: [
34
+ {
35
+ resolve: "order-management",
36
+ options: {
37
+ storefrontUrl: "https://store.example.com",
38
+ jwtSecret: "replace-with-strong-secret",
39
+ email: {
40
+ otpTemplate: "src/templates/emails/otp.html",
41
+ orderConfirmTemplate: "src/templates/emails/order-confirmation.html",
42
+ },
43
+ },
44
+ },
45
+ ],
46
+ modules: [
47
+ orderManagement.modules["payment-detail"],
48
+ orderManagement.modules["refund-payment-mapping"],
49
+ orderManagement.modules["cancel-order-reason"],
50
+ ],
51
+ })
52
+ ```
53
+
54
+ Run migrations:
55
+
56
+ ```bash
57
+ npx medusa db:migrate
58
+ ```
59
+
60
+ > ⚠️ Note: the plugin contains module migrations under `src/modules/*/migrations`; ensure those modules are registered in `modules` before runtime.
61
+
62
+ ## Configuration
63
+
64
+ Source: `src/types/order-management-options.ts`, normalized by `src/config.ts`.
65
+
66
+ | Option | Type | Required | Default | Description |
67
+ |---|---|---|---|---|
68
+ | `storefrontUrl` | `string` | Yes | - | Base storefront URL (used in email claim links). |
69
+ | `jwtSecret` | `string` | Yes | - | Secret used to sign/verify guest OTP JWTs. |
70
+ | `email.orderConfirmTemplate` | `string \| null` | No | `null` | Template path for order confirmation subscriber emails. |
71
+ | `email.otpTemplate` | `string \| null` | No* | `null` | Template used by `/store/otp/request`; required for OTP flow. |
72
+ | `smtp.enabled` | `boolean` | No | `false` | Optional SMTP toggle for notification sending path. |
73
+ | `smtp.host` | `string` | No | `undefined` | SMTP host. |
74
+ | `smtp.port` | `number` | No | `undefined` | SMTP port. |
75
+ | `smtp.secure` | `boolean` | No | `true` | SMTP secure mode. |
76
+ | `smtp.auth.user` | `string` | No | `undefined` | SMTP username. |
77
+ | `smtp.auth.pass` | `string` | No | `undefined` | SMTP password. |
78
+ | `smtp.from` | `string` | No | `undefined` | Sender override. |
79
+ | `notifications.enabled` | `boolean` | No | `false` | Enables status-based notification subscriber handling. |
80
+ | `notifications.statusConfig` | `Record<string, NotificationConfig[]>` | No | `{}` | Map of order status to template/channel rules. |
81
+ | `capture_payment_on_delivered` | `boolean` | No | `true` | Auto-capture remaining authorized amount on delivery events. |
82
+ | `returnValidInDays` | `number` | No | `7` | Return request window in days from `delivered_at`. |
83
+ | `exchangeValidInDays` | `number` | No | `7` | Exchange request window in days from `delivered_at`. |
84
+
85
+ Example:
86
+
87
+ ```ts
88
+ {
89
+ resolve: "order-management",
90
+ options: {
91
+ storefrontUrl: "https://store.example.com",
92
+ jwtSecret: "super-secret",
93
+ email: {
94
+ otpTemplate: "src/templates/emails/otp.html",
95
+ orderConfirmTemplate: "src/templates/emails/order-confirmation.html",
96
+ },
97
+ notifications: {
98
+ enabled: true,
99
+ statusConfig: {
100
+ shipped: [{ template: "src/templates/emails/shipped.html", channel: "email" }],
101
+ },
102
+ },
103
+ returnValidInDays: 7,
104
+ exchangeValidInDays: 7,
105
+ capture_payment_on_delivered: true,
106
+ },
107
+ }
108
+ ```
109
+
110
+ ## Environment Variables
111
+
112
+ Direct `process.env.*` usage in plugin source:
113
+
114
+ | Variable | Required | Used In | Purpose |
115
+ |---|---|---|---|
116
+ | `NODE_ENV` | No | API handlers | Includes stack trace in development error responses. |
117
+
118
+ Most production values are expected to be supplied via plugin options in `medusa-config.ts` (for example `jwtSecret`, `storefrontUrl`, SMTP settings).
119
+
120
+ ## REST APIs / Routes
121
+
122
+ ### Store Routes
123
+
124
+ | Method | Endpoint | Auth | Description |
125
+ |---|---|---|---|
126
+ | GET | `/store/plugin` | Public | Health endpoint. |
127
+ | POST | `/store/otp/request` | Public | Sends OTP to email/phone using configured OTP template. |
128
+ | POST | `/store/otp/verify` | Public | Verifies OTP and returns guest JWT. |
129
+ | POST | `/store/orders/cancel/:order_id` | Customer JWT | Cancel customer order; requires `reason_id`. |
130
+ | POST | `/store/orders/reorder/:order_id` | Customer JWT | Reorder into new cart (`force_reorder` query optional). |
131
+ | GET | `/store/orders/:order_id/cancel-reason-mapping` | Customer JWT | Get cancel reason label mapping for order. |
132
+ | GET | `/store/orders/:order_id/refund-payment-mappings` | Customer JWT | Get all refund mappings for order returns. |
133
+ | POST | `/store/returns` | Customer JWT | Create return (`StoreCreateReturnSchema`). |
134
+ | GET | `/store/returns` | Customer JWT | List customer returns (`order_id`, `limit`, `offset`). |
135
+ | GET | `/store/returns/:id` | Customer JWT | Get return details. |
136
+ | POST | `/store/returns/:id/cancel` | Customer JWT | Cancel return. |
137
+ | POST | `/store/swaps` | Customer JWT | Create exchange request. |
138
+ | GET | `/store/swaps` | Customer JWT | List exchange requests. |
139
+ | GET | `/store/swaps/:id` | Customer JWT | Get exchange request. |
140
+ | POST | `/store/swaps/:id/cancel` | Customer JWT | Cancel exchange request. |
141
+ | GET | `/store/payment-details` | Customer JWT | List payment details. |
142
+ | POST | `/store/payment-details` | Customer JWT | Create payment detail (`type`, `detail_json`). |
143
+ | GET | `/store/payment-details/:id` | Customer JWT | Retrieve payment detail. |
144
+ | PUT | `/store/payment-details/:id` | Customer JWT | Update payment detail. |
145
+ | DELETE | `/store/payment-details/:id` | Customer JWT | Delete payment detail. |
146
+ | POST | `/store/payment-details/:id/make-default` | Customer JWT | Set default payment detail. |
147
+ | GET | `/store/refund-payment-mapping/:return_id` | Customer JWT | Get refund mapping for owned return. |
148
+ | PUT | `/store/refund-payment-mapping/:return_id` | Customer JWT | Update `payment_id` only (customer-safe fields). |
149
+ | GET | `/store/guest-orders` | Guest JWT | List guest orders. |
150
+ | GET | `/store/guest-orders/:id` | Guest JWT | Get guest order. |
151
+ | POST | `/store/guest-orders/:id/cancel` | Guest JWT | Cancel guest order. |
152
+ | POST | `/store/guest-orders/:id/reorder` | Guest JWT | Reorder guest order. |
153
+ | POST | `/store/guest-orders/:id/returns` | Guest JWT | Create guest return. |
154
+ | GET | `/store/guest-orders/:id/swaps` | Guest JWT | List guest exchange requests. |
155
+ | POST | `/store/guest-orders/:id/swaps` | Guest JWT | Create guest exchange request. |
156
+ | GET | `/store/guest-orders/:id/swaps/:swap_id` | Guest JWT | Get guest exchange request. |
157
+ | POST | `/store/guest-orders/:id/swaps/:swap_id/cancel` | Guest JWT | Cancel guest exchange request. |
158
+ | GET | `/store/guest-orders/:id/cancel-reason-mapping` | Guest JWT | Get cancel reason mapping for guest order. |
159
+
160
+ ### Admin Routes
161
+
162
+ | Method | Endpoint | Auth | Description |
163
+ |---|---|---|---|
164
+ | GET | `/admin/plugin` | Admin JWT | Health endpoint. |
165
+ | GET | `/admin/return` | Admin JWT | List returns (filters/paging). |
166
+ | GET | `/admin/return/:id` | Admin JWT | Return details. |
167
+ | POST | `/admin/return/:id/reject` | Admin JWT | Reject/cancel return. |
168
+ | GET | `/admin/swaps` | Admin JWT | List exchanges (filters/paging). |
169
+ | GET | `/admin/swaps/:id` | Admin JWT | Exchange details. |
170
+ | POST | `/admin/swaps/:id/reject` | Admin JWT | Reject exchange. |
171
+ | POST | `/admin/swaps/:id/cancel` | Admin JWT | Cancel exchange. |
172
+ | GET | `/admin/payment-transactions` | Admin JWT | List payment sessions/transactions. |
173
+ | GET | `/admin/payment-transactions/:id` | Admin JWT | Payment session details. |
174
+ | GET | `/admin/refunds` | Admin JWT | List refunds. |
175
+ | GET | `/admin/refunds/:id` | Admin JWT | Refund detail + computed summary. |
176
+ | GET | `/admin/orders/:order_id/refund-context` | Admin JWT | Aggregated order refund context. |
177
+ | GET | `/admin/orders/:order_id/cancel-reason-mapping` | Admin JWT | Cancel reason mapping for order. |
178
+ | PUT | `/admin/refund-payment-mapping/:return_id` | Admin JWT | Update `refund_mode`, `images`, `details`. |
179
+ | POST | `/admin/refund-payment-mapping/:return_id/mark-refunded` | Admin JWT | Set `is_refunded=true`. |
180
+
181
+ Important endpoint examples:
182
+
183
+ ```bash
184
+ curl -X POST "http://localhost:9000/store/otp/request" \
185
+ -H "content-type: application/json" \
186
+ -d '{"email":"guest@example.com"}'
187
+ ```
188
+
189
+ ```bash
190
+ curl -X POST "http://localhost:9000/store/orders/cancel/order_123" \
191
+ -H "authorization: Bearer <customer_token>" \
192
+ -H "content-type: application/json" \
193
+ -d '{"reason_id":"rr_123"}'
194
+ ```
195
+
196
+ ```bash
197
+ curl "http://localhost:9000/admin/orders/order_123/refund-context" \
198
+ -H "authorization: Bearer <admin_token>"
199
+ ```
200
+
201
+ ## Services
202
+
203
+ | Service | Responsibility | Key Methods |
204
+ |---|---|---|
205
+ | `OtpService` | OTP generation/verification and guest JWT minting | `generate`, `verify`, `generateToken` |
206
+ | `PaymentDetailModuleService` | Payment detail CRUD and default constraints | `createPaymentDetail`, `updatePaymentDetail`, `deletePaymentDetail`, `makeDefault`, `hasDefaultPayment`, `listPaymentDetailsByCustomer` |
207
+ | `RefundPaymentMappingModuleService` | Return-to-payment mapping management | `createMapping`, `getByReturnId`, `updatePaymentId`, `markRefunded`, `updateAdminFields` |
208
+ | `CancelOrderReasonModuleService` | Stores cancel reason used for an order | `assertReasonExists`, `recordOrderCancelReason`, `getMappingWithReasonLabel` |
209
+
210
+ ## Workflows & Steps (Medusa v2)
211
+
212
+ ### Workflows
213
+
214
+ | Workflow | Input | Output | Description |
215
+ |---|---|---|---|
216
+ | `reorder` | `{ order_id, customer_id, force_reorder? }` | `{ cart_id }` | Rebuilds cart from prior order with inventory checks. |
217
+ | `order-management-cancel-order` | `{ order_id, customer_id }` | `{ order_id, status, message }` | Validates ownership and cancels order through Medusa flow. |
218
+
219
+ ### Steps
220
+
221
+ | Step | Description |
222
+ |---|---|
223
+ | `retrieve-order` | Retrieves order and validates customer ownership. |
224
+ | `transform-order-to-cart` | Converts order lines to cart lines, validates inventory and force behavior. |
225
+ | `create-cart-from-order` | Creates cart via Medusa `createCartWorkflow`. |
226
+ | `cancel-order-step` | Checks fulfillment state and runs Medusa cancel order workflow. |
227
+ | `validate-no-active-order-change` | Blocks duplicate active order changes. |
228
+ | `send-notification-step` | Notification helper used by OTP/subscribers. |
229
+
230
+ ## Subscribers / Event Hooks
231
+
232
+ | Subscriber | Event(s) | Action |
233
+ |---|---|---|
234
+ | `send-order-email` | `order.placed` | Loads order data, renders configured template, sends order confirmation email. |
235
+ | `order-status-change` | `order.updated`, `order.placed`, `order.shipment_created`, `order.fulfillment_created`, `order.completed`, `order.canceled`, `delivery.created` | Triggers status-based notifications from plugin config. |
236
+ | `order-fulfilled` | `delivery.created`, `shipment.delivered`, `shipment.deliver`, `order.shipment_delivered`, `fulfillment.shipment_delivered` | Completes delivered order; optionally captures remaining authorized payment. |
237
+
238
+ ## Admin UI / Widgets
239
+
240
+ | Extension | Placement | UI | Interactions/Data |
241
+ |---|---|---|---|
242
+ | Returns routes | `/returns`, `/returns/:id` | Return listing/detail pages | Search, filters, reject return; uses `/admin/return*`. |
243
+ | Swaps routes | `/swaps`, `/swaps/:id` | Exchange listing/detail pages | Search, filters, reject/cancel exchange; uses `/admin/swaps*`. |
244
+ | Payments routes | `/payments`, `/payments/:id` | Transaction list + detail pages | Filter transactions and inspect gateway payload. |
245
+ | Refunds routes | `/refunds`, `/refunds/:id` | Refund list + detail pages | Filter by status/provider/date/amount; view computed refund context. |
246
+ | `order-refund-context-widget` | `order.details.after` | Refund context panel | Edit refund mode/details/images, upload images, mark refunded. |
247
+ | `order-gift-items-widget` | `order.details.side.after` | Gift item widget | Reads gift metadata and downloads generated gift card image. |
248
+
249
+ ## Models & Entities
250
+
251
+ | Entity | Fields | Relationship Notes |
252
+ |---|---|---|
253
+ | `payment_detail` | `id`, `customer_id`, `type`, `detail_json`, `is_default` | Linked logically to Medusa customer via `customer_id`. |
254
+ | `refund_payment_mapping` | `id`, `return_id` (unique), `payment_id?`, `is_refunded`, `refund_mode?`, `images`, `details?` | Links a return to refund destination and admin reconciliation metadata. |
255
+ | `cancel_order_reason_mapping` | `id`, `order_id`, `reason_id` | Migration defines FK to `return_reason(id)`. |
256
+
257
+ ## Use Cases & Examples
258
+
259
+ 1. **Guest self-service after checkout without account:** OTP authenticate and allow secure cancel/reorder/return/exchange flows.
260
+ 2. **Customer reorder with inventory-safe behavior:** create cart from previous order, optionally partial with `force_reorder`.
261
+ 3. **COD return refund handling:** enforce default payment details and track refund destination via mapping module.
262
+ 4. **Operations refund control:** admin edits refund mode/details/images and marks refunded with visibility in order detail widget.
263
+ 5. **Automated post-delivery capture and communications:** delivery events drive capture flow and status notifications.
264
+
265
+ ## Troubleshooting
266
+
267
+ | Issue | Likely Cause | Resolution |
268
+ |---|---|---|
269
+ | 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
+ | Guest JWT endpoints return unauthorized | Invalid/expired token or `jwtSecret` mismatch | Re-run OTP verify and ensure same `jwtSecret` is used in runtime config. |
271
+ | Return/exchange blocked with `RETURN_WINDOW_EXPIRED` | Delivery date outside configured window | Increase `returnValidInDays`/`exchangeValidInDays` or update storefront UX for expiry handling. |
272
+ | Refund mapping routes fail | `refund-payment-mapping` module not registered/migrated | Register module and run migrations. |
273
+ | Cannot set default payment via create/update | API intentionally blocks `is_default` in request body | Use `POST /store/payment-details/:id/make-default`. |
274
+ | No development stack traces in API errors | `NODE_ENV` not `development` | Set `NODE_ENV=development` locally when debugging. |
275
+
276
+
1
277
  <p align="center">
2
278
  <a href="https://www.medusajs.com">
3
279
  <picture>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "order-management",
3
- "version": "0.0.78",
3
+ "version": "0.0.80",
4
4
  "description": "A starter for Medusa plugins.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",
@@ -46,6 +46,7 @@
46
46
  "@types/react": "^18.3.2",
47
47
  "@types/react-dom": "^18.2.25",
48
48
  "jsonwebtoken": "^9.0.3",
49
+ "medusa-plugin-dynamic-config": "^0.0.34",
49
50
  "prop-types": "^15.8.1",
50
51
  "react": "^18.2.0",
51
52
  "react-dom": "^18.2.0",
@@ -62,9 +63,10 @@
62
63
  "@medusajs/icons": "2.11.2",
63
64
  "@medusajs/medusa": "2.11.2",
64
65
  "@medusajs/test-utils": "2.11.2",
65
- "@medusajs/ui": "4.0.25"
66
+ "@medusajs/ui": "4.0.25",
67
+ "medusa-plugin-dynamic-config": ">=0.0.34"
66
68
  },
67
69
  "engines": {
68
70
  "node": ">=20"
69
71
  }
70
- }
72
+ }