@endora-commerce/mod-returns 0.100.0

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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/admin/api/returns-client.d.ts +69 -0
  4. package/dist/admin/api/returns-client.d.ts.map +1 -0
  5. package/dist/admin/api/returns-client.js +36 -0
  6. package/dist/admin/api/returns-client.js.map +1 -0
  7. package/dist/admin/index.d.ts +37 -0
  8. package/dist/admin/index.d.ts.map +1 -0
  9. package/dist/admin/index.js +57 -0
  10. package/dist/admin/index.js.map +1 -0
  11. package/dist/admin/pages/ReturnDeliveryMethodsPage.d.ts +5 -0
  12. package/dist/admin/pages/ReturnDeliveryMethodsPage.d.ts.map +1 -0
  13. package/dist/admin/pages/ReturnDeliveryMethodsPage.js +44 -0
  14. package/dist/admin/pages/ReturnDeliveryMethodsPage.js.map +1 -0
  15. package/dist/admin/pages/ReturnDetail.d.ts +5 -0
  16. package/dist/admin/pages/ReturnDetail.d.ts.map +1 -0
  17. package/dist/admin/pages/ReturnDetail.js +115 -0
  18. package/dist/admin/pages/ReturnDetail.js.map +1 -0
  19. package/dist/admin/pages/ReturnReasonsPage.d.ts +5 -0
  20. package/dist/admin/pages/ReturnReasonsPage.d.ts.map +1 -0
  21. package/dist/admin/pages/ReturnReasonsPage.js +44 -0
  22. package/dist/admin/pages/ReturnReasonsPage.js.map +1 -0
  23. package/dist/admin/pages/ReturnStatusesConfigPage.d.ts +5 -0
  24. package/dist/admin/pages/ReturnStatusesConfigPage.d.ts.map +1 -0
  25. package/dist/admin/pages/ReturnStatusesConfigPage.js +71 -0
  26. package/dist/admin/pages/ReturnStatusesConfigPage.js.map +1 -0
  27. package/dist/admin/pages/ReturnsList.d.ts +5 -0
  28. package/dist/admin/pages/ReturnsList.d.ts.map +1 -0
  29. package/dist/admin/pages/ReturnsList.js +189 -0
  30. package/dist/admin/pages/ReturnsList.js.map +1 -0
  31. package/dist/backend/domain/default-reasons.d.ts +14 -0
  32. package/dist/backend/domain/default-reasons.d.ts.map +1 -0
  33. package/dist/backend/domain/default-reasons.js +9 -0
  34. package/dist/backend/domain/default-reasons.js.map +1 -0
  35. package/dist/backend/domain/free-return-window.d.ts +2 -0
  36. package/dist/backend/domain/free-return-window.d.ts.map +1 -0
  37. package/dist/backend/domain/free-return-window.js +19 -0
  38. package/dist/backend/domain/free-return-window.js.map +1 -0
  39. package/dist/backend/domain/refund-math.d.ts +19 -0
  40. package/dist/backend/domain/refund-math.d.ts.map +1 -0
  41. package/dist/backend/domain/refund-math.js +27 -0
  42. package/dist/backend/domain/refund-math.js.map +1 -0
  43. package/dist/backend/domain/return-status-graph.d.ts +91 -0
  44. package/dist/backend/domain/return-status-graph.d.ts.map +1 -0
  45. package/dist/backend/domain/return-status-graph.js +143 -0
  46. package/dist/backend/domain/return-status-graph.js.map +1 -0
  47. package/dist/backend/email-templates/return-authorized.d.ts +11 -0
  48. package/dist/backend/email-templates/return-authorized.d.ts.map +1 -0
  49. package/dist/backend/email-templates/return-authorized.js +18 -0
  50. package/dist/backend/email-templates/return-authorized.js.map +1 -0
  51. package/dist/backend/email-templates/return-rejected.d.ts +11 -0
  52. package/dist/backend/email-templates/return-rejected.d.ts.map +1 -0
  53. package/dist/backend/email-templates/return-rejected.js +20 -0
  54. package/dist/backend/email-templates/return-rejected.js.map +1 -0
  55. package/dist/backend/email-templates/transactional-defaults.d.ts +11 -0
  56. package/dist/backend/email-templates/transactional-defaults.d.ts.map +1 -0
  57. package/dist/backend/email-templates/transactional-defaults.js +64 -0
  58. package/dist/backend/email-templates/transactional-defaults.js.map +1 -0
  59. package/dist/backend/entities/refund.entity.d.ts +41 -0
  60. package/dist/backend/entities/refund.entity.d.ts.map +1 -0
  61. package/dist/backend/entities/refund.entity.js +122 -0
  62. package/dist/backend/entities/refund.entity.js.map +1 -0
  63. package/dist/backend/entities/return-case-attachment.entity.d.ts +16 -0
  64. package/dist/backend/entities/return-case-attachment.entity.d.ts.map +1 -0
  65. package/dist/backend/entities/return-case-attachment.entity.js +53 -0
  66. package/dist/backend/entities/return-case-attachment.entity.js.map +1 -0
  67. package/dist/backend/entities/return-case-comment.entity.d.ts +20 -0
  68. package/dist/backend/entities/return-case-comment.entity.d.ts.map +1 -0
  69. package/dist/backend/entities/return-case-comment.entity.js +70 -0
  70. package/dist/backend/entities/return-case-comment.entity.js.map +1 -0
  71. package/dist/backend/entities/return-case-item.entity.d.ts +25 -0
  72. package/dist/backend/entities/return-case-item.entity.d.ts.map +1 -0
  73. package/dist/backend/entities/return-case-item.entity.js +87 -0
  74. package/dist/backend/entities/return-case-item.entity.js.map +1 -0
  75. package/dist/backend/entities/return-case.entity.d.ts +41 -0
  76. package/dist/backend/entities/return-case.entity.d.ts.map +1 -0
  77. package/dist/backend/entities/return-case.entity.js +155 -0
  78. package/dist/backend/entities/return-case.entity.js.map +1 -0
  79. package/dist/backend/entities/return-delivery-method.entity.d.ts +18 -0
  80. package/dist/backend/entities/return-delivery-method.entity.d.ts.map +1 -0
  81. package/dist/backend/entities/return-delivery-method.entity.js +63 -0
  82. package/dist/backend/entities/return-delivery-method.entity.js.map +1 -0
  83. package/dist/backend/entities/return-list-saved-view.entity.d.ts +24 -0
  84. package/dist/backend/entities/return-list-saved-view.entity.d.ts.map +1 -0
  85. package/dist/backend/entities/return-list-saved-view.entity.js +74 -0
  86. package/dist/backend/entities/return-list-saved-view.entity.js.map +1 -0
  87. package/dist/backend/entities/return-reason.entity.d.ts +21 -0
  88. package/dist/backend/entities/return-reason.entity.d.ts.map +1 -0
  89. package/dist/backend/entities/return-reason.entity.js +65 -0
  90. package/dist/backend/entities/return-reason.entity.js.map +1 -0
  91. package/dist/backend/entities/return-shipment.entity.d.ts +22 -0
  92. package/dist/backend/entities/return-shipment.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/return-shipment.entity.js +71 -0
  94. package/dist/backend/entities/return-shipment.entity.js.map +1 -0
  95. package/dist/backend/entities/return-status-transition.entity.d.ts +17 -0
  96. package/dist/backend/entities/return-status-transition.entity.d.ts.map +1 -0
  97. package/dist/backend/entities/return-status-transition.entity.js +55 -0
  98. package/dist/backend/entities/return-status-transition.entity.js.map +1 -0
  99. package/dist/backend/entities/return-status.entity.d.ts +29 -0
  100. package/dist/backend/entities/return-status.entity.d.ts.map +1 -0
  101. package/dist/backend/entities/return-status.entity.js +90 -0
  102. package/dist/backend/entities/return-status.entity.js.map +1 -0
  103. package/dist/backend/events/return-status-events.d.ts +44 -0
  104. package/dist/backend/events/return-status-events.d.ts.map +1 -0
  105. package/dist/backend/events/return-status-events.js +50 -0
  106. package/dist/backend/events/return-status-events.js.map +1 -0
  107. package/dist/backend/index.d.ts +106 -0
  108. package/dist/backend/index.d.ts.map +1 -0
  109. package/dist/backend/index.js +116 -0
  110. package/dist/backend/index.js.map +1 -0
  111. package/dist/backend/plugin.d.ts +33 -0
  112. package/dist/backend/plugin.d.ts.map +1 -0
  113. package/dist/backend/plugin.js +124 -0
  114. package/dist/backend/plugin.js.map +1 -0
  115. package/dist/backend/routes.admin.d.ts +38 -0
  116. package/dist/backend/routes.admin.d.ts.map +1 -0
  117. package/dist/backend/routes.admin.js +181 -0
  118. package/dist/backend/routes.admin.js.map +1 -0
  119. package/dist/backend/routes.customer.d.ts +22 -0
  120. package/dist/backend/routes.customer.d.ts.map +1 -0
  121. package/dist/backend/routes.customer.js +56 -0
  122. package/dist/backend/routes.customer.js.map +1 -0
  123. package/dist/backend/services/notification-context.d.ts +47 -0
  124. package/dist/backend/services/notification-context.d.ts.map +1 -0
  125. package/dist/backend/services/notification-context.js +49 -0
  126. package/dist/backend/services/notification-context.js.map +1 -0
  127. package/dist/backend/services/return-attachment-service.d.ts +20 -0
  128. package/dist/backend/services/return-attachment-service.d.ts.map +1 -0
  129. package/dist/backend/services/return-attachment-service.js +48 -0
  130. package/dist/backend/services/return-attachment-service.js.map +1 -0
  131. package/dist/backend/services/return-authorization-service.d.ts +53 -0
  132. package/dist/backend/services/return-authorization-service.d.ts.map +1 -0
  133. package/dist/backend/services/return-authorization-service.js +72 -0
  134. package/dist/backend/services/return-authorization-service.js.map +1 -0
  135. package/dist/backend/services/return-case-service.d.ts +44 -0
  136. package/dist/backend/services/return-case-service.d.ts.map +1 -0
  137. package/dist/backend/services/return-case-service.js +260 -0
  138. package/dist/backend/services/return-case-service.js.map +1 -0
  139. package/dist/backend/services/return-comment-service.d.ts +43 -0
  140. package/dist/backend/services/return-comment-service.d.ts.map +1 -0
  141. package/dist/backend/services/return-comment-service.js +109 -0
  142. package/dist/backend/services/return-comment-service.js.map +1 -0
  143. package/dist/backend/services/return-delivery-method-service.d.ts +44 -0
  144. package/dist/backend/services/return-delivery-method-service.d.ts.map +1 -0
  145. package/dist/backend/services/return-delivery-method-service.js +114 -0
  146. package/dist/backend/services/return-delivery-method-service.js.map +1 -0
  147. package/dist/backend/services/return-email-notifier.d.ts +89 -0
  148. package/dist/backend/services/return-email-notifier.d.ts.map +1 -0
  149. package/dist/backend/services/return-email-notifier.js +128 -0
  150. package/dist/backend/services/return-email-notifier.js.map +1 -0
  151. package/dist/backend/services/return-export-service.d.ts +16 -0
  152. package/dist/backend/services/return-export-service.d.ts.map +1 -0
  153. package/dist/backend/services/return-export-service.js +29 -0
  154. package/dist/backend/services/return-export-service.js.map +1 -0
  155. package/dist/backend/services/return-list-service.d.ts +27 -0
  156. package/dist/backend/services/return-list-service.d.ts.map +1 -0
  157. package/dist/backend/services/return-list-service.js +114 -0
  158. package/dist/backend/services/return-list-service.js.map +1 -0
  159. package/dist/backend/services/return-list-view-service.d.ts +36 -0
  160. package/dist/backend/services/return-list-view-service.d.ts.map +1 -0
  161. package/dist/backend/services/return-list-view-service.js +82 -0
  162. package/dist/backend/services/return-list-view-service.js.map +1 -0
  163. package/dist/backend/services/return-reason-service.d.ts +33 -0
  164. package/dist/backend/services/return-reason-service.d.ts.map +1 -0
  165. package/dist/backend/services/return-reason-service.js +90 -0
  166. package/dist/backend/services/return-reason-service.js.map +1 -0
  167. package/dist/backend/services/return-settlement-service.d.ts +67 -0
  168. package/dist/backend/services/return-settlement-service.d.ts.map +1 -0
  169. package/dist/backend/services/return-settlement-service.js +295 -0
  170. package/dist/backend/services/return-settlement-service.js.map +1 -0
  171. package/dist/backend/services/return-shipment-service.d.ts +40 -0
  172. package/dist/backend/services/return-shipment-service.d.ts.map +1 -0
  173. package/dist/backend/services/return-shipment-service.js +113 -0
  174. package/dist/backend/services/return-shipment-service.js.map +1 -0
  175. package/dist/backend/services/return-status-graph-service.d.ts +59 -0
  176. package/dist/backend/services/return-status-graph-service.d.ts.map +1 -0
  177. package/dist/backend/services/return-status-graph-service.js +197 -0
  178. package/dist/backend/services/return-status-graph-service.js.map +1 -0
  179. package/dist/backend/services/return-transition-service.d.ts +48 -0
  180. package/dist/backend/services/return-transition-service.d.ts.map +1 -0
  181. package/dist/backend/services/return-transition-service.js +116 -0
  182. package/dist/backend/services/return-transition-service.js.map +1 -0
  183. package/dist/backend/services/returns-seeder.d.ts +18 -0
  184. package/dist/backend/services/returns-seeder.d.ts.map +1 -0
  185. package/dist/backend/services/returns-seeder.js +63 -0
  186. package/dist/backend/services/returns-seeder.js.map +1 -0
  187. package/dist/backend/services/rma-number-generator.d.ts +35 -0
  188. package/dist/backend/services/rma-number-generator.d.ts.map +1 -0
  189. package/dist/backend/services/rma-number-generator.js +45 -0
  190. package/dist/backend/services/rma-number-generator.js.map +1 -0
  191. package/dist/manifest.d.ts +182 -0
  192. package/dist/manifest.d.ts.map +1 -0
  193. package/dist/manifest.js +216 -0
  194. package/dist/manifest.js.map +1 -0
  195. package/dist/migrations/20260625T144227_returns_init.d.ts +15 -0
  196. package/dist/migrations/20260625T144227_returns_init.d.ts.map +1 -0
  197. package/dist/migrations/20260625T144227_returns_init.js +241 -0
  198. package/dist/migrations/20260625T144227_returns_init.js.map +1 -0
  199. package/dist/migrations/20260817T203206_returns_refund_corrective_invoice_outcome.d.ts +25 -0
  200. package/dist/migrations/20260817T203206_returns_refund_corrective_invoice_outcome.d.ts.map +1 -0
  201. package/dist/migrations/20260817T203206_returns_refund_corrective_invoice_outcome.js +46 -0
  202. package/dist/migrations/20260817T203206_returns_refund_corrective_invoice_outcome.js.map +1 -0
  203. package/dist/migrations/index.d.ts +28 -0
  204. package/dist/migrations/index.d.ts.map +1 -0
  205. package/dist/migrations/index.js +31 -0
  206. package/dist/migrations/index.js.map +1 -0
  207. package/docs/returns.md +103 -0
  208. package/i18n/en.json +28 -0
  209. package/i18n/pl.json +28 -0
  210. package/package.json +101 -0
  211. package/tailwind.css +14 -0
@@ -0,0 +1,116 @@
1
+ import { lazyPort } from '@endora-commerce/platform/kernel';
2
+ import { returnsModule } from './plugin.js';
3
+ import { ReturnEmailNotifier } from './services/return-email-notifier.js';
4
+ import { createChannelLanguageResolver, createCustomerEmailResolver, } from './services/notification-context.js';
5
+ import { RETURN_AUTHORIZED_DEFAULT, RETURN_REJECTED_DEFAULT } from './email-templates/transactional-defaults.js';
6
+ import { Refund } from './entities/refund.entity.js';
7
+ import { ReturnCaseAttachment } from './entities/return-case-attachment.entity.js';
8
+ import { ReturnCaseComment } from './entities/return-case-comment.entity.js';
9
+ import { ReturnCaseItem } from './entities/return-case-item.entity.js';
10
+ import { ReturnCase } from './entities/return-case.entity.js';
11
+ import { ReturnDeliveryMethod } from './entities/return-delivery-method.entity.js';
12
+ import { ReturnListSavedView } from './entities/return-list-saved-view.entity.js';
13
+ import { ReturnReason } from './entities/return-reason.entity.js';
14
+ import { ReturnShipment } from './entities/return-shipment.entity.js';
15
+ import { ReturnStatusTransition } from './entities/return-status-transition.entity.js';
16
+ import { ReturnStatus } from './entities/return-status.entity.js';
17
+ export function registerModule(ctx) {
18
+ ctx.di.register({
19
+ returns: ctx
20
+ .asFunction(({ emFactory, eventBus, auditLogService }) => {
21
+ const cradle = () => ctx.cradle();
22
+ /**
23
+ * The customer notification, built here rather than handed in (T143c).
24
+ *
25
+ * It is this module's own class, and a root that constructs its own
26
+ * class builds it slightly differently in each root — which is what
27
+ * happened: the two spellings differed in the mailer they passed and in
28
+ * nothing that made the difference visible. The mailer is resolved per
29
+ * send, so a composition that contributes one later (the harness does)
30
+ * is not a race, and the sender accessor stays late-bound because
31
+ * `transactional_emails` announces it after this module composes.
32
+ *
33
+ * T118c — its two remaining inputs are this module's own now. The
34
+ * address comes from `customer_accounts`' published record and the
35
+ * language from the case's channel; both were `returnsBridge` closures a
36
+ * root wrote twice, and both live in `services/notification-context.ts`
37
+ * so the mapping and its fallbacks are testable with nothing composed.
38
+ */
39
+ const notifier = new ReturnEmailNotifier(lazyPort(ctx, 'emailMailer'), createCustomerEmailResolver(lazyPort(ctx, 'customerAccountReadPort')), {
40
+ getTransactionalEmailSender: () => cradle().transactionalEmailSenderAccessor(),
41
+ resolveLanguage: createChannelLanguageResolver(emFactory),
42
+ });
43
+ return returnsModule({
44
+ emFactory,
45
+ eventBus,
46
+ auditLog: auditLogService,
47
+ settingsService: lazyPort(ctx, 'settingsReadPort'),
48
+ requireAdmin: (permission) => async (req, reply) => cradle().requireAdmin(permission)(req, reply),
49
+ requireCustomer: (req, reply) => cradle().requireCustomer(req, reply),
50
+ resolveCustomerAccountId: (req) => cradle().customerAccountIdResolver(req),
51
+ resolveAdminUserId: (req) => cradle().adminContextResolver(req).adminUserId,
52
+ // The four settlement adapters, resolved here since T118c. Each was a
53
+ // forwarder a composition root built onto the owning module's port and
54
+ // handed over as a `returnsBridge` member, which meant the edge into
55
+ // `payments`, `invoices` and `credit_limits` appeared in no manifest:
56
+ // a root's resolution is nobody's declared dependency, so an operator
57
+ // switching one of the three off was told nothing about what stops.
58
+ // The `lazyPort` proxy resolves per call, so the gate still answers at
59
+ // the settlement it is about rather than at composition.
60
+ orderContext: lazyPort(ctx, 'orderReturnContextPort'),
61
+ paymentRefund: lazyPort(ctx, 'paymentRefundPort'),
62
+ correctiveInvoice: lazyPort(ctx, 'correctiveInvoicePort'),
63
+ creditTopup: lazyPort(ctx, 'creditTopupPort'),
64
+ notifier,
65
+ });
66
+ })
67
+ .singleton(),
68
+ });
69
+ ctx.routes(async (app) => {
70
+ await ctx.cradle().returns(app);
71
+ });
72
+ /**
73
+ * The default subject and content for the 2 transactional emails this
74
+ * module declares in its manifest (T143a).
75
+ *
76
+ * These were fourteen `emailDefaultsRegistry.register(...)` calls in
77
+ * `composition.ts`, each importing a template constant out of the module that
78
+ * owns it — a root reaching into seven modules to hand their own content to
79
+ * an eighth. Each module registers its own now.
80
+ *
81
+ * `ctx.onBoot` rather than a registration: the registry is *read* once, by
82
+ * `transactional_emails`' boot reconciler inside its plugin body. Boot hooks
83
+ * run during composition and plugin bodies only when the Fastify app is
84
+ * built, so this always lands first — by construction, not by ordering luck.
85
+ */
86
+ ctx.onBoot(async () => {
87
+ const defaults = lazyPort(ctx, 'emailDefaultsPort');
88
+ defaults.register('return_authorized', RETURN_AUTHORIZED_DEFAULT, 'returns');
89
+ defaults.register('return_rejected', RETURN_REJECTED_DEFAULT, 'returns');
90
+ });
91
+ }
92
+ /**
93
+ * The module's persisted entity classes, on the `./backend` subpath, as one
94
+ * array and **no named class export** (D-168).
95
+ *
96
+ * This is the shape the platform reads when the package is *installed*: the
97
+ * boot-time loader (`src/packages/package-runtime.ts`, `exported['entities']`)
98
+ * and the static declaration reader (`scripts/lib/package-declarations.ts`),
99
+ * which is the third source of `check:module-boundary`'s `table→owner` map and
100
+ * the package pass of `check-entity-tenant-classification`. A missing array is
101
+ * answered with `[]` — zero entities registered, no error anywhere.
102
+ */
103
+ export const entities = [
104
+ Refund,
105
+ ReturnCaseAttachment,
106
+ ReturnCaseComment,
107
+ ReturnCaseItem,
108
+ ReturnCase,
109
+ ReturnDeliveryMethod,
110
+ ReturnListSavedView,
111
+ ReturnReason,
112
+ ReturnShipment,
113
+ ReturnStatusTransition,
114
+ ReturnStatus,
115
+ ];
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAE5D,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACjH,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AA2ElE,MAAM,UAAU,cAAc,CAAC,GAAkB;IAC/C,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC;QACd,OAAO,EAAE,GAAG;aACT,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAiB,EAAE,EAAE;YACtE,MAAM,MAAM,GAAG,GAAkB,EAAE,CAAC,GAAG,CAAC,MAAM,EAAiB,CAAC;YAChE;;;;;;;;;;;;;;;;eAgBG;YACH,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CACtC,QAAQ,CAAkB,GAAG,EAAE,aAAa,CAAC,EAC7C,2BAA2B,CACzB,QAAQ,CAA0B,GAAG,EAAE,yBAAyB,CAAC,CAClE,EACD;gBACE,2BAA2B,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,gCAAgC,EAAE;gBAC9E,eAAe,EAAE,6BAA6B,CAAC,SAAS,CAAC;aAC1D,CACF,CAAC;YACF,OAAO,aAAa,CAAC;gBACnB,SAAS;gBACT,QAAQ;gBACR,QAAQ,EAAE,eAAe;gBACzB,eAAe,EAAE,QAAQ,CACvB,GAAG,EACH,kBAAkB,CACnB;gBACD,YAAY,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CACjD,MAAM,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC;gBAC/C,eAAe,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC;gBACrE,wBAAwB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAC;gBAC1E,kBAAkB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,WAAW;gBAC3E,sEAAsE;gBACtE,uEAAuE;gBACvE,qEAAqE;gBACrE,sEAAsE;gBACtE,sEAAsE;gBACtE,oEAAoE;gBACpE,uEAAuE;gBACvE,yDAAyD;gBACzD,YAAY,EAAE,QAAQ,CAAyB,GAAG,EAAE,wBAAwB,CAAC;gBAC7E,aAAa,EAAE,QAAQ,CAAoB,GAAG,EAAE,mBAAmB,CAAC;gBACpE,iBAAiB,EAAE,QAAQ,CAAwB,GAAG,EAAE,uBAAuB,CAAC;gBAChF,WAAW,EAAE,QAAQ,CAAkB,GAAG,EAAE,iBAAiB,CAAC;gBAC9D,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC;aACD,SAAS,EAAE;KACf,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACvB,MAAM,GAAG,CAAC,MAAM,EAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH;;;;;;;;;;;;;OAaG;IACH,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,QAAQ,GAAG,QAAQ,CAA4B,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAC/E,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,EAAE,yBAAyB,EAAE,SAAS,CAAC,CAAC;QAC7E,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,uBAAuB,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AAEL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM;IACN,oBAAoB;IACpB,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,mBAAmB;IACnB,YAAY;IACZ,cAAc;IACd,sBAAsB;IACtB,YAAY;CACb,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';
2
+ import type { EntityManager } from '@mikro-orm/postgresql';
3
+ import type { CorrectiveInvoicePort, CreditTopupPort, OrderReturnContextPort, PaymentRefundPort } from '@endora-commerce/contracts';
4
+ import type { EventBus } from '@endora-commerce/platform/events';
5
+ import type { SettingsReadPort } from '@endora-commerce/platform/kernel';
6
+ import type { AuditPort } from '@endora-commerce/platform/kernel';
7
+ import { type ReturnNotifier } from './services/return-authorization-service.js';
8
+ export interface ReturnsModuleOptions {
9
+ emFactory: () => EntityManager;
10
+ eventBus: EventBus;
11
+ settingsService: SettingsReadPort;
12
+ requireCustomer: (req: FastifyRequest, reply: unknown) => Promise<void>;
13
+ requireAdmin: (permission?: string) => (req: FastifyRequest, reply: FastifyReply) => Promise<void>;
14
+ resolveCustomerAccountId: (req: FastifyRequest) => string;
15
+ resolveAdminUserId: (req: FastifyRequest) => string;
16
+ orderContext: OrderReturnContextPort;
17
+ /** Settlement ports (US5). Money refunds, corrective invoices, credit top-up. */
18
+ paymentRefund: PaymentRefundPort;
19
+ correctiveInvoice: CorrectiveInvoicePort;
20
+ creditTopup: CreditTopupPort;
21
+ /** Audit-log writer (FR-041); status changes + settlement are recorded. */
22
+ auditLog: AuditPort;
23
+ /** Best-effort customer notifications on authorize/reject. */
24
+ notifier?: ReturnNotifier;
25
+ }
26
+ /**
27
+ * Composition root for the returns module (feature 046). Builds the workflow
28
+ * engine, RMA numbering, and the case + authorization services, then registers
29
+ * the customer (US1) and admin (US2/US3) routes. Returns a Fastify plugin in
30
+ * the `module(options) => async (app) => {}` shape used across the codebase.
31
+ */
32
+ export declare function returnsModule(options: ReturnsModuleOptions): (app: FastifyInstance) => Promise<void>;
33
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/backend/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EACV,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAelE,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,4CAA4C,CAAC;AAQpD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,aAAa,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,gBAAgB,CAAC;IAClC,eAAe,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,YAAY,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnG,wBAAwB,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC;IAC1D,kBAAkB,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC;IACpD,YAAY,EAAE,sBAAsB,CAAC;IACrC,iFAAiF;IACjF,aAAa,EAAE,iBAAiB,CAAC;IACjC,iBAAiB,EAAE,qBAAqB,CAAC;IACzC,WAAW,EAAE,eAAe,CAAC;IAC7B,2EAA2E;IAC3E,QAAQ,EAAE,SAAS,CAAC;IACpB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,oBAAoB,GAC5B,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAqHzC"}
@@ -0,0 +1,124 @@
1
+ import { z } from 'zod';
2
+ import { RETURNS_SETTING_CODES } from '../manifest.js';
3
+ import { ReturnStatusGraphService } from './services/return-status-graph-service.js';
4
+ import { ReturnTransitionService } from './services/return-transition-service.js';
5
+ import { ReturnCaseService } from './services/return-case-service.js';
6
+ import { ReturnCommentService } from './services/return-comment-service.js';
7
+ import { ReturnSettlementService } from './services/return-settlement-service.js';
8
+ import { ReturnDeliveryMethodService } from './services/return-delivery-method-service.js';
9
+ import { ReturnShipmentService } from './services/return-shipment-service.js';
10
+ import { ReturnReasonService } from './services/return-reason-service.js';
11
+ import { ReturnAttachmentService } from './services/return-attachment-service.js';
12
+ import { ReturnsSeeder } from './services/returns-seeder.js';
13
+ import { ReturnListService } from './services/return-list-service.js';
14
+ import { ReturnListViewService } from './services/return-list-view-service.js';
15
+ import { ReturnExportService } from './services/return-export-service.js';
16
+ import { ReturnAuthorizationService, } from './services/return-authorization-service.js';
17
+ import { createRmaNumberGenerator } from './services/rma-number-generator.js';
18
+ import { registerReturnsCustomerRoutes } from './routes.customer.js';
19
+ import { registerReturnsAdminRoutes } from './routes.admin.js';
20
+ /** Default free-return window when the setting cannot be resolved (manifest default). */
21
+ const DEFAULT_FREE_RETURN_DAYS = 14;
22
+ /**
23
+ * Composition root for the returns module (feature 046). Builds the workflow
24
+ * engine, RMA numbering, and the case + authorization services, then registers
25
+ * the customer (US1) and admin (US2/US3) routes. Returns a Fastify plugin in
26
+ * the `module(options) => async (app) => {}` shape used across the codebase.
27
+ */
28
+ export function returnsModule(options) {
29
+ return async (app) => {
30
+ const { emFactory, eventBus, settingsService, orderContext } = options;
31
+ // Self-healing default seed (no-op when the migration already seeded).
32
+ await new ReturnsSeeder(emFactory).ensureDefaults();
33
+ const graphService = new ReturnStatusGraphService(emFactory, options.auditLog);
34
+ const transitions = new ReturnTransitionService(emFactory, eventBus, graphService, options.auditLog);
35
+ const rmaGenerator = createRmaNumberGenerator({
36
+ resolvePrefix: (sc) => settingsService.get(RETURNS_SETTING_CODES.RMA_NUMBER_PREFIX, sc, z.string()),
37
+ resolveSuffix: (sc) => settingsService.get(RETURNS_SETTING_CODES.RMA_NUMBER_SUFFIX, sc, z.string()),
38
+ });
39
+ const resolveFreeReturnDays = async (salesChannelId) => {
40
+ try {
41
+ return await settingsService.get(RETURNS_SETTING_CODES.FREE_RETURN_DAYS, salesChannelId, z.number());
42
+ }
43
+ catch {
44
+ return DEFAULT_FREE_RETURN_DAYS;
45
+ }
46
+ };
47
+ const resolveDefaultCostBearer = async (salesChannelId) => {
48
+ try {
49
+ const value = await settingsService.get(RETURNS_SETTING_CODES.DEFAULT_COST_BEARER_OUTSIDE_WINDOW, salesChannelId, z.enum(['customer', 'shop']));
50
+ return value;
51
+ }
52
+ catch {
53
+ return 'customer';
54
+ }
55
+ };
56
+ const caseService = new ReturnCaseService({
57
+ emFactory,
58
+ graphService,
59
+ transitions,
60
+ orderContext,
61
+ resolveFreeReturnDays,
62
+ ...(options.auditLog ? { auditLog: options.auditLog } : {}),
63
+ });
64
+ const deliveryMethodService = new ReturnDeliveryMethodService({
65
+ emFactory,
66
+ graphService,
67
+ resolveDefaultCostBearer,
68
+ ...(options.auditLog ? { auditLog: options.auditLog } : {}),
69
+ });
70
+ const shipmentService = new ReturnShipmentService({
71
+ emFactory,
72
+ transitions,
73
+ ...(options.auditLog ? { auditLog: options.auditLog } : {}),
74
+ });
75
+ const reasonService = new ReturnReasonService(emFactory, options.auditLog);
76
+ const attachmentService = new ReturnAttachmentService(emFactory);
77
+ const listService = new ReturnListService({ emFactory, graphService, transitions });
78
+ const listViewService = new ReturnListViewService(emFactory);
79
+ const exportService = new ReturnExportService(listService);
80
+ const authorizationService = new ReturnAuthorizationService({
81
+ emFactory,
82
+ transitions,
83
+ rmaGenerator,
84
+ ...(options.notifier ? { notifier: options.notifier } : {}),
85
+ });
86
+ const commentService = new ReturnCommentService({ emFactory, graphService });
87
+ const settlementService = new ReturnSettlementService({
88
+ emFactory,
89
+ events: eventBus,
90
+ transitions,
91
+ graphService,
92
+ paymentRefund: options.paymentRefund,
93
+ correctiveInvoice: options.correctiveInvoice,
94
+ creditTopup: options.creditTopup,
95
+ ...(options.auditLog ? { auditLog: options.auditLog } : {}),
96
+ });
97
+ await registerReturnsCustomerRoutes(app, {
98
+ caseService,
99
+ commentService,
100
+ deliveryMethodService,
101
+ reasonService,
102
+ attachmentService,
103
+ requireCustomer: options.requireCustomer,
104
+ resolveCustomerAccountId: options.resolveCustomerAccountId,
105
+ });
106
+ await registerReturnsAdminRoutes(app, {
107
+ caseService,
108
+ authorizationService,
109
+ commentService,
110
+ settlementService,
111
+ deliveryMethodService,
112
+ shipmentService,
113
+ reasonService,
114
+ listService,
115
+ listViewService,
116
+ exportService,
117
+ transitions,
118
+ graphService,
119
+ requireAdmin: options.requireAdmin,
120
+ resolveAdminUserId: options.resolveAdminUserId,
121
+ });
122
+ };
123
+ }
124
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/backend/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EACL,0BAA0B,GAE3B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/D,yFAAyF;AACzF,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAqBpC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA6B;IAE7B,OAAO,KAAK,EAAE,GAAoB,EAAiB,EAAE;QACrD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QAEvE,uEAAuE;QACvE,MAAM,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;QAEpD,MAAM,YAAY,GAAG,IAAI,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/E,MAAM,WAAW,GAAG,IAAI,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAErG,MAAM,YAAY,GAAG,wBAAwB,CAAC;YAC5C,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CACpB,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;YAC9E,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CACpB,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;SAC/E,CAAC,CAAC;QAEH,MAAM,qBAAqB,GAAG,KAAK,EAAE,cAAsB,EAAmB,EAAE;YAC9E,IAAI,CAAC;gBACH,OAAO,MAAM,eAAe,CAAC,GAAG,CAC9B,qBAAqB,CAAC,gBAAgB,EACtC,cAAc,EACd,CAAC,CAAC,MAAM,EAAE,CACX,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,wBAAwB,CAAC;YAClC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,wBAAwB,GAAG,KAAK,EAAE,cAAsB,EAAgC,EAAE;YAC9F,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,GAAG,CACrC,qBAAqB,CAAC,kCAAkC,EACxD,cAAc,EACd,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAC7B,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,iBAAiB,CAAC;YACxC,SAAS;YACT,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,qBAAqB;YACrB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CAAC;QAEH,MAAM,qBAAqB,GAAG,IAAI,2BAA2B,CAAC;YAC5D,SAAS;YACT,YAAY;YACZ,wBAAwB;YACxB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAI,qBAAqB,CAAC;YAChD,SAAS;YACT,WAAW;YACX,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,iBAAiB,GAAG,IAAI,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,IAAI,iBAAiB,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QACpF,MAAM,eAAe,GAAG,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAE3D,MAAM,oBAAoB,GAAG,IAAI,0BAA0B,CAAC;YAC1D,SAAS;YACT,WAAW;YACX,YAAY;YACZ,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,oBAAoB,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAE7E,MAAM,iBAAiB,GAAG,IAAI,uBAAuB,CAAC;YACpD,SAAS;YACT,MAAM,EAAE,QAAQ;YAChB,WAAW;YACX,YAAY;YACZ,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CAAC;QAGH,MAAM,6BAA6B,CAAC,GAAG,EAAE;YACvC,WAAW;YACX,cAAc;YACd,qBAAqB;YACrB,aAAa;YACb,iBAAiB;YACjB,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;SAC3D,CAAC,CAAC;QAEH,MAAM,0BAA0B,CAAC,GAAG,EAAE;YACpC,WAAW;YACX,oBAAoB;YACpB,cAAc;YACd,iBAAiB;YACjB,qBAAqB;YACrB,eAAe;YACf,aAAa;YACb,WAAW;YACX,eAAe;YACf,aAAa;YACb,WAAW;YACX,YAAY;YACZ,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;SAC/C,CAAC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';
2
+ import type { ReturnCaseService } from './services/return-case-service.js';
3
+ import type { ReturnAuthorizationService } from './services/return-authorization-service.js';
4
+ import type { ReturnCommentService } from './services/return-comment-service.js';
5
+ import type { ReturnSettlementService } from './services/return-settlement-service.js';
6
+ import type { ReturnDeliveryMethodService } from './services/return-delivery-method-service.js';
7
+ import type { ReturnShipmentService } from './services/return-shipment-service.js';
8
+ import type { ReturnReasonService } from './services/return-reason-service.js';
9
+ import type { ReturnListService } from './services/return-list-service.js';
10
+ import type { ReturnListViewService } from './services/return-list-view-service.js';
11
+ import type { ReturnExportService } from './services/return-export-service.js';
12
+ import type { ReturnTransitionService } from './services/return-transition-service.js';
13
+ import type { ReturnStatusGraphService } from './services/return-status-graph-service.js';
14
+ type RequireAdmin = (permission?: string) => (req: FastifyRequest, reply: FastifyReply) => Promise<void>;
15
+ /**
16
+ * Returns admin routes — feature 046 (US2 case authorization/rejection +
17
+ * transitions; US3 configurable workflow). Read gates on `returns:read`,
18
+ * mutations on `returns:write`.
19
+ */
20
+ export interface ReturnsAdminRoutesDeps {
21
+ caseService: ReturnCaseService;
22
+ authorizationService: ReturnAuthorizationService;
23
+ commentService: ReturnCommentService;
24
+ settlementService: ReturnSettlementService;
25
+ deliveryMethodService: ReturnDeliveryMethodService;
26
+ shipmentService: ReturnShipmentService;
27
+ reasonService: ReturnReasonService;
28
+ listService: ReturnListService;
29
+ listViewService: ReturnListViewService;
30
+ exportService: ReturnExportService;
31
+ transitions: ReturnTransitionService;
32
+ graphService: ReturnStatusGraphService;
33
+ requireAdmin: RequireAdmin;
34
+ resolveAdminUserId: (req: FastifyRequest) => string;
35
+ }
36
+ export declare function registerReturnsAdminRoutes(app: FastifyInstance, deps: ReturnsAdminRoutesDeps): Promise<void>;
37
+ export {};
38
+ //# sourceMappingURL=routes.admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.admin.d.ts","sourceRoot":"","sources":["../../src/backend/routes.admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAmB7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AACvF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAChG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AACvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAE1F,KAAK,YAAY,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzG;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,oBAAoB,EAAE,0BAA0B,CAAC;IACjD,cAAc,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,EAAE,uBAAuB,CAAC;IAC3C,qBAAqB,EAAE,2BAA2B,CAAC;IACnD,eAAe,EAAE,qBAAqB,CAAC;IACvC,aAAa,EAAE,mBAAmB,CAAC;IACnC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,eAAe,EAAE,qBAAqB,CAAC;IACvC,aAAa,EAAE,mBAAmB,CAAC;IACnC,WAAW,EAAE,uBAAuB,CAAC;IACrC,YAAY,EAAE,wBAAwB,CAAC;IACvC,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC;CACrD;AAED,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAiVf"}
@@ -0,0 +1,181 @@
1
+ import { adminAddCommentRequestSchema, adminRejectRequestSchema, adminTransitionRequestSchema, adminReturnsListQuerySchema, bulkTransitionRequestSchema, createReturnShipmentRequestSchema, returnDeliveryMethodCreateSchema, returnDeliveryMethodUpdateSchema, returnReasonCreateSchema, returnReasonUpdateSchema, returnSavedViewCreateSchema, returnSavedViewUpdateSchema, returnStatusCreateSchema, returnStatusUpdateSchema, returnTransitionsSetSchema, settlementRequestSchema, } from '@endora-commerce/contracts';
2
+ export async function registerReturnsAdminRoutes(app, deps) {
3
+ const { caseService, authorizationService, commentService, settlementService, deliveryMethodService, shipmentService, reasonService, listService, listViewService, exportService, transitions, graphService, requireAdmin, resolveAdminUserId, } = deps;
4
+ // --- List, bulk actions, saved views, export (US8) ----------------------
5
+ app.get('/api/v1/admin/returns', { preHandler: requireAdmin('returns:read'), schema: { querystring: adminReturnsListQuerySchema } }, async (request) => {
6
+ const query = adminReturnsListQuerySchema.parse(request.query);
7
+ return { data: await listService.list(query) };
8
+ });
9
+ app.get('/api/v1/admin/returns/export', {
10
+ preHandler: requireAdmin('returns:read'),
11
+ schema: { querystring: adminReturnsListQuerySchema },
12
+ config: { streamingResponse: true },
13
+ }, async (request, reply) => {
14
+ const query = adminReturnsListQuerySchema.parse(request.query);
15
+ const { csv, rowCount, truncated } = await exportService.exportCsv(query);
16
+ reply.header('content-type', 'text/csv; charset=utf-8');
17
+ reply.header('x-export-row-count', String(rowCount));
18
+ reply.header('x-export-truncated', String(truncated));
19
+ return csv;
20
+ });
21
+ app.post('/api/v1/admin/returns/bulk-transition', { preHandler: requireAdmin('returns:write'), schema: { body: bulkTransitionRequestSchema } }, async (request) => {
22
+ const adminUserId = resolveAdminUserId(request);
23
+ const body = bulkTransitionRequestSchema.parse(request.body);
24
+ const data = await listService.bulkTransition(body.ids, body.to, adminUserId, body.reason);
25
+ return { data };
26
+ });
27
+ app.get('/api/v1/admin/returns/list-views', { preHandler: requireAdmin('returns:read') }, async (request) => {
28
+ const adminUserId = resolveAdminUserId(request);
29
+ return { data: await listViewService.listFor(adminUserId) };
30
+ });
31
+ app.post('/api/v1/admin/returns/list-views', { preHandler: requireAdmin('returns:read'), schema: { body: returnSavedViewCreateSchema } }, async (request, reply) => {
32
+ const adminUserId = resolveAdminUserId(request);
33
+ const body = returnSavedViewCreateSchema.parse(request.body);
34
+ const data = await listViewService.create(adminUserId, body);
35
+ reply.status(201);
36
+ return { data };
37
+ });
38
+ app.patch('/api/v1/admin/returns/list-views/:id', { preHandler: requireAdmin('returns:read'), schema: { body: returnSavedViewUpdateSchema } }, async (request) => {
39
+ const adminUserId = resolveAdminUserId(request);
40
+ const body = returnSavedViewUpdateSchema.parse(request.body);
41
+ const data = await listViewService.update(request.params.id, adminUserId, body);
42
+ return { data };
43
+ });
44
+ app.delete('/api/v1/admin/returns/list-views/:id', { preHandler: requireAdmin('returns:read') }, async (request) => {
45
+ const adminUserId = resolveAdminUserId(request);
46
+ await listViewService.remove(request.params.id, adminUserId);
47
+ return { data: { ok: true } };
48
+ });
49
+ // --- Workflow configuration (US3) ---------------------------------------
50
+ // Registered before `/:id` so the static `statuses` segment is unambiguous.
51
+ app.get('/api/v1/admin/returns/statuses', { preHandler: requireAdmin('returns:read') }, async () => {
52
+ const data = await graphService.listGraph();
53
+ return { data };
54
+ });
55
+ app.post('/api/v1/admin/returns/statuses', { preHandler: requireAdmin('returns:write'), schema: { body: returnStatusCreateSchema } }, async (request, reply) => {
56
+ const body = returnStatusCreateSchema.parse(request.body);
57
+ await graphService.createStatus({
58
+ code: body.code,
59
+ name: body.name,
60
+ defaultName: body.defaultName,
61
+ isTerminal: body.isTerminal,
62
+ weight: body.weight,
63
+ color: body.color,
64
+ });
65
+ reply.status(201);
66
+ return { data: await graphService.listGraph() };
67
+ });
68
+ app.patch('/api/v1/admin/returns/statuses/:code', { preHandler: requireAdmin('returns:write'), schema: { body: returnStatusUpdateSchema } }, async (request) => {
69
+ const body = returnStatusUpdateSchema.parse(request.body);
70
+ await graphService.updateStatus(request.params.code, body);
71
+ return { data: await graphService.listGraph() };
72
+ });
73
+ app.delete('/api/v1/admin/returns/statuses/:code', { preHandler: requireAdmin('returns:write') }, async (request) => {
74
+ await graphService.deleteStatus(request.params.code);
75
+ return { data: await graphService.listGraph() };
76
+ });
77
+ app.put('/api/v1/admin/returns/transitions', { preHandler: requireAdmin('returns:write'), schema: { body: returnTransitionsSetSchema } }, async (request) => {
78
+ const body = returnTransitionsSetSchema.parse(request.body);
79
+ await graphService.replaceTransitions(body.transitions);
80
+ return { data: await graphService.listGraph() };
81
+ });
82
+ // --- Return delivery methods (US6) --------------------------------------
83
+ app.get('/api/v1/admin/returns/delivery-methods', { preHandler: requireAdmin('returns:read') }, async () => {
84
+ return { data: await deliveryMethodService.list() };
85
+ });
86
+ app.post('/api/v1/admin/returns/delivery-methods', { preHandler: requireAdmin('returns:write'), schema: { body: returnDeliveryMethodCreateSchema } }, async (request, reply) => {
87
+ const body = returnDeliveryMethodCreateSchema.parse(request.body);
88
+ const data = await deliveryMethodService.create(body);
89
+ reply.status(201);
90
+ return { data };
91
+ });
92
+ app.patch('/api/v1/admin/returns/delivery-methods/:id', { preHandler: requireAdmin('returns:write'), schema: { body: returnDeliveryMethodUpdateSchema } }, async (request) => {
93
+ const body = returnDeliveryMethodUpdateSchema.parse(request.body);
94
+ const data = await deliveryMethodService.update(request.params.id, body);
95
+ return { data };
96
+ });
97
+ app.delete('/api/v1/admin/returns/delivery-methods/:id', { preHandler: requireAdmin('returns:write') }, async (request) => {
98
+ await deliveryMethodService.remove(request.params.id);
99
+ return { data: { ok: true } };
100
+ });
101
+ // --- Case detail + transitions (US2) ------------------------------------
102
+ app.get('/api/v1/admin/returns/:id', { preHandler: requireAdmin('returns:read') }, async (request) => {
103
+ const data = await caseService.getByIdForAdmin(request.params.id);
104
+ return { data };
105
+ });
106
+ app.post('/api/v1/admin/returns/:id/authorize', { preHandler: requireAdmin('returns:write') }, async (request) => {
107
+ const adminUserId = resolveAdminUserId(request);
108
+ const data = await authorizationService.authorize(request.params.id, adminUserId);
109
+ return { data };
110
+ });
111
+ app.post('/api/v1/admin/returns/:id/reject', { preHandler: requireAdmin('returns:write'), schema: { body: adminRejectRequestSchema } }, async (request) => {
112
+ const adminUserId = resolveAdminUserId(request);
113
+ const body = adminRejectRequestSchema.parse(request.body);
114
+ await authorizationService.reject(request.params.id, adminUserId, body.reason);
115
+ return { data: await caseService.getByIdForAdmin(request.params.id) };
116
+ });
117
+ app.post('/api/v1/admin/returns/:id/transition', { preHandler: requireAdmin('returns:write'), schema: { body: adminTransitionRequestSchema } }, async (request) => {
118
+ const adminUserId = resolveAdminUserId(request);
119
+ const body = adminTransitionRequestSchema.parse(request.body);
120
+ await transitions.apply(request.params.id, body.to, { kind: 'admin', adminUserId }, body.reason !== undefined ? { reason: body.reason } : undefined);
121
+ return { data: await caseService.getByIdForAdmin(request.params.id) };
122
+ });
123
+ // --- Settlement (US5) ----------------------------------------------------
124
+ app.get('/api/v1/admin/returns/:id/settlement', { preHandler: requireAdmin('returns:read') }, async (request) => {
125
+ const data = await settlementService.getPrefill(request.params.id);
126
+ return { data };
127
+ });
128
+ app.post('/api/v1/admin/returns/:id/settlement', { preHandler: requireAdmin('returns:write'), schema: { body: settlementRequestSchema } }, async (request) => {
129
+ const adminUserId = resolveAdminUserId(request);
130
+ const body = settlementRequestSchema.parse(request.body);
131
+ const data = await settlementService.settle(request.params.id, adminUserId, body);
132
+ return { data };
133
+ });
134
+ // --- Reasons (US7) -------------------------------------------------------
135
+ app.get('/api/v1/admin/returns/reasons', { preHandler: requireAdmin('returns:read') }, async () => {
136
+ return { data: await reasonService.listAll() };
137
+ });
138
+ app.post('/api/v1/admin/returns/reasons', { preHandler: requireAdmin('returns:write'), schema: { body: returnReasonCreateSchema } }, async (request, reply) => {
139
+ const body = returnReasonCreateSchema.parse(request.body);
140
+ const data = await reasonService.create(body);
141
+ reply.status(201);
142
+ return { data };
143
+ });
144
+ app.patch('/api/v1/admin/returns/reasons/:id', { preHandler: requireAdmin('returns:write'), schema: { body: returnReasonUpdateSchema } }, async (request) => {
145
+ const body = returnReasonUpdateSchema.parse(request.body);
146
+ const data = await reasonService.update(request.params.id, body);
147
+ return { data };
148
+ });
149
+ app.delete('/api/v1/admin/returns/reasons/:id', { preHandler: requireAdmin('returns:write') }, async (request) => {
150
+ await reasonService.remove(request.params.id);
151
+ return { data: { ok: true } };
152
+ });
153
+ // --- Return shipments (US6) ---------------------------------------------
154
+ app.get('/api/v1/admin/returns/:id/shipments', { preHandler: requireAdmin('returns:read') }, async (request) => {
155
+ return { data: await shipmentService.listForCase(request.params.id) };
156
+ });
157
+ app.post('/api/v1/admin/returns/:id/shipments', { preHandler: requireAdmin('returns:write'), schema: { body: createReturnShipmentRequestSchema } }, async (request, reply) => {
158
+ const body = createReturnShipmentRequestSchema.parse(request.body);
159
+ const data = await shipmentService.create(request.params.id, body);
160
+ reply.status(201);
161
+ return { data };
162
+ });
163
+ app.post('/api/v1/admin/returns/:id/shipments/:shipmentId/receive', { preHandler: requireAdmin('returns:write') }, async (request) => {
164
+ const adminUserId = resolveAdminUserId(request);
165
+ const data = await shipmentService.receive(request.params.id, request.params.shipmentId, adminUserId);
166
+ return { data };
167
+ });
168
+ // --- Comments (US4) ------------------------------------------------------
169
+ app.get('/api/v1/admin/returns/:id/comments', { preHandler: requireAdmin('returns:read') }, async (request) => {
170
+ const data = await commentService.listForAdmin(request.params.id);
171
+ return { data };
172
+ });
173
+ app.post('/api/v1/admin/returns/:id/comments', { preHandler: requireAdmin('returns:write'), schema: { body: adminAddCommentRequestSchema } }, async (request, reply) => {
174
+ const adminUserId = resolveAdminUserId(request);
175
+ const body = adminAddCommentRequestSchema.parse(request.body);
176
+ const data = await commentService.addByAdmin(request.params.id, adminUserId, body);
177
+ reply.status(201);
178
+ return { data };
179
+ });
180
+ }
181
+ //# sourceMappingURL=routes.admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.admin.js","sourceRoot":"","sources":["../../src/backend/routes.admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { FastifyInstance, FastifyRequest } from 'fastify';
2
+ import type { ReturnCaseService } from './services/return-case-service.js';
3
+ import type { ReturnCommentService } from './services/return-comment-service.js';
4
+ import type { ReturnDeliveryMethodService } from './services/return-delivery-method-service.js';
5
+ import type { ReturnReasonService } from './services/return-reason-service.js';
6
+ import type { ReturnAttachmentService } from './services/return-attachment-service.js';
7
+ /**
8
+ * Returns customer (storefront) routes — feature 046 (US1, US4, US6). All
9
+ * endpoints require an authenticated customer; ownership is enforced in the
10
+ * service against `customer_account_id`.
11
+ */
12
+ export interface ReturnsCustomerRoutesDeps {
13
+ caseService: ReturnCaseService;
14
+ commentService: ReturnCommentService;
15
+ deliveryMethodService: ReturnDeliveryMethodService;
16
+ reasonService: ReturnReasonService;
17
+ attachmentService: ReturnAttachmentService;
18
+ requireCustomer: (req: FastifyRequest, reply: unknown) => Promise<void>;
19
+ resolveCustomerAccountId: (req: FastifyRequest) => string;
20
+ }
21
+ export declare function registerReturnsCustomerRoutes(app: FastifyInstance, deps: ReturnsCustomerRoutesDeps): Promise<void>;
22
+ //# sourceMappingURL=routes.customer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.customer.d.ts","sourceRoot":"","sources":["../../src/backend/routes.customer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAChG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAEvF;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,cAAc,EAAE,oBAAoB,CAAC;IACrC,qBAAqB,EAAE,2BAA2B,CAAC;IACnD,aAAa,EAAE,mBAAmB,CAAC;IACnC,iBAAiB,EAAE,uBAAuB,CAAC;IAC3C,eAAe,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,wBAAwB,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC;CAC3D;AAED,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA0Gf"}