@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Endora sp. z o.o. and the Endora Commerce contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ <!-- Generated by `pnpm --filter backend run manifests:generate`. Delete this line to take the file over; a README without it is never regenerated. -->
2
+
3
+ # @endora-commerce/mod-returns
4
+
5
+ Return/complaint (RMA) case management, settlement, and refunds.
6
+
7
+ ## What this is
8
+
9
+ An **Endora Commerce module package**. Its module id is `returns` — the identity of record in the platform's registries, in its migrations and in its setting, permission and translation codes.
10
+
11
+ A module is not imported by application code. The platform discovers the extension packages an instance has installed, reads the manifest on the root subpath and composes the module from it, so installing this package and starting the instance is the whole integration.
12
+
13
+ ## Entry points
14
+
15
+ | Import | Contents |
16
+ | --- | --- |
17
+ | `@endora-commerce/mod-returns` | the module manifest — its id, version, dependencies, settings and activation |
18
+ | `@endora-commerce/mod-returns/admin` | the Admin UI contribution: the screens, navigation and palette actions it adds |
19
+ | `@endora-commerce/mod-returns/backend` | the composition root the platform calls, with the entities, services, routes and workers it registers |
20
+ | `@endora-commerce/mod-returns/migrations` | the module’s own schema migrations, in the order the platform runs them |
21
+ | `@endora-commerce/mod-returns/tailwind.css` | the Tailwind source declaration for the admin code above |
22
+
23
+ ## Depends on
24
+
25
+ Everything below is a **peer** dependency, so the application resolves exactly one copy of each — two copies of a host or of React are a runtime failure rather than a type error. An entry marked *optional* is needed only by the layers that use it.
26
+
27
+ **Endora packages**
28
+
29
+ - `@endora-commerce/admin-kit` — *optional*
30
+ - `@endora-commerce/contracts`
31
+ - `@endora-commerce/email-components`
32
+ - `@endora-commerce/platform`
33
+
34
+ **Third-party**
35
+
36
+ - `@mikro-orm/core` ^6
37
+ - `@mikro-orm/migrations` ^6
38
+ - `@mikro-orm/postgresql` ^6
39
+ - `fastify` ^5
40
+ - `lucide-react` ^1 — *optional*
41
+ - `react` ^19 — *optional*
42
+ - `react-router-dom` ^7 — *optional*
43
+ - `zod` ^4
44
+
45
+ ## What the tarball carries
46
+
47
+ - `dist/` — the compiled JavaScript and its type declarations
48
+ - `i18n/` — the translation bundles this package ships (`en`, `pl`), loaded by the platform
49
+ - `docs/` — the package’s own pages in the Endora Commerce documentation site
50
+ - `tailwind.css` — the Tailwind source declaration
51
+
52
+ ## Install
53
+
54
+ ```bash
55
+ pnpm add @endora-commerce/mod-returns
56
+ ```
57
+
58
+ ## Licence
59
+
60
+ MIT — the text is in `LICENSE`, beside this file.
@@ -0,0 +1,69 @@
1
+ import type { AdminReturnsListResponse, BulkTransitionResult, ReturnCaseCommentDto, ReturnCaseDetail, ReturnDeliveryMethodDto, ReturnReasonDto, ReturnStatusGraphResponse, SettlementPrefill, SettlementResult } from '@endora-commerce/contracts';
2
+ /** Typed admin client for the returns module (feature 046). */
3
+ export declare const returnsClient: {
4
+ list: (qs: string) => Promise<AdminReturnsListResponse>;
5
+ get: (id: string) => Promise<ReturnCaseDetail>;
6
+ authorize: (id: string) => Promise<{
7
+ rmaNumber: string;
8
+ statusCode: string;
9
+ }>;
10
+ reject: (id: string, reason: string) => Promise<ReturnCaseDetail>;
11
+ transition: (id: string, to: string, reason?: string) => Promise<ReturnCaseDetail>;
12
+ bulkTransition: (ids: string[], to: string) => Promise<BulkTransitionResult>;
13
+ comments: (id: string) => Promise<ReturnCaseCommentDto[]>;
14
+ addComment: (id: string, body: string, isCustomerVisible: boolean, notifyCustomer: boolean) => Promise<ReturnCaseCommentDto>;
15
+ settlementPrefill: (id: string) => Promise<SettlementPrefill>;
16
+ settle: (id: string, body: {
17
+ resolutionType: string;
18
+ lines: Array<{
19
+ returnCaseItemId: string;
20
+ approvedRefundAmount: number;
21
+ }>;
22
+ refundPaymentMethodId?: string;
23
+ createCorrectiveInvoice?: boolean;
24
+ }) => Promise<SettlementResult>;
25
+ shipments: (id: string) => Promise<Array<{
26
+ id: string;
27
+ direction: string;
28
+ status: string;
29
+ externalReference: string | null;
30
+ }>>;
31
+ createShipment: (id: string, direction: string, externalReference?: string) => Promise<{
32
+ id: string;
33
+ }>;
34
+ receiveShipment: (id: string, shipmentId: string) => Promise<{
35
+ status: string;
36
+ }>;
37
+ statuses: () => Promise<ReturnStatusGraphResponse>;
38
+ createStatus: (body: {
39
+ code: string;
40
+ name: Record<string, string>;
41
+ defaultName: string;
42
+ isTerminal?: boolean;
43
+ weight?: number;
44
+ }) => Promise<ReturnStatusGraphResponse>;
45
+ deleteStatus: (code: string) => Promise<ReturnStatusGraphResponse>;
46
+ setTransitions: (transitions: Array<{
47
+ fromStatusCode: string;
48
+ toStatusCode: string;
49
+ }>) => Promise<ReturnStatusGraphResponse>;
50
+ reasons: () => Promise<ReturnReasonDto[]>;
51
+ createReason: (body: {
52
+ label: Record<string, string>;
53
+ appliesTo: string;
54
+ weight?: number;
55
+ }) => Promise<ReturnReasonDto>;
56
+ updateReason: (id: string, patch: {
57
+ isActive?: boolean;
58
+ weight?: number;
59
+ }) => Promise<ReturnReasonDto>;
60
+ deleteReason: (id: string) => Promise<unknown>;
61
+ deliveryMethods: () => Promise<ReturnDeliveryMethodDto[]>;
62
+ createDeliveryMethod: (body: {
63
+ deliveryMethodId: string;
64
+ returnCost: number;
65
+ currency: string;
66
+ }) => Promise<ReturnDeliveryMethodDto>;
67
+ deleteDeliveryMethod: (id: string) => Promise<unknown>;
68
+ };
69
+ //# sourceMappingURL=returns-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"returns-client.d.ts","sourceRoot":"","sources":["../../../src/admin/api/returns-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { apiClient } from '@endora-commerce/admin-kit/lib';
2
+ const unwrap = (p) => p.then((r) => r.data);
3
+ /** Typed admin client for the returns module (feature 046). */
4
+ export const returnsClient = {
5
+ list: (qs) => unwrap(apiClient.get(`/api/v1/admin/returns${qs}`)),
6
+ get: (id) => unwrap(apiClient.get(`/api/v1/admin/returns/${id}`)),
7
+ authorize: (id) => unwrap(apiClient.post(`/api/v1/admin/returns/${id}/authorize`, {})),
8
+ reject: (id, reason) => unwrap(apiClient.post(`/api/v1/admin/returns/${id}/reject`, { reason })),
9
+ transition: (id, to, reason) => unwrap(apiClient.post(`/api/v1/admin/returns/${id}/transition`, { to, ...(reason ? { reason } : {}) })),
10
+ bulkTransition: (ids, to) => unwrap(apiClient.post('/api/v1/admin/returns/bulk-transition', { ids, to })),
11
+ // Comments
12
+ comments: (id) => unwrap(apiClient.get(`/api/v1/admin/returns/${id}/comments`)),
13
+ addComment: (id, body, isCustomerVisible, notifyCustomer) => unwrap(apiClient.post(`/api/v1/admin/returns/${id}/comments`, { body, isCustomerVisible, notifyCustomer })),
14
+ // Settlement
15
+ settlementPrefill: (id) => unwrap(apiClient.get(`/api/v1/admin/returns/${id}/settlement`)),
16
+ settle: (id, body) => unwrap(apiClient.post(`/api/v1/admin/returns/${id}/settlement`, body)),
17
+ // Shipments
18
+ shipments: (id) => unwrap(apiClient.get(`/api/v1/admin/returns/${id}/shipments`)),
19
+ createShipment: (id, direction, externalReference) => unwrap(apiClient.post(`/api/v1/admin/returns/${id}/shipments`, { direction, ...(externalReference ? { externalReference } : {}) })),
20
+ receiveShipment: (id, shipmentId) => unwrap(apiClient.post(`/api/v1/admin/returns/${id}/shipments/${shipmentId}/receive`, {})),
21
+ // Status graph config
22
+ statuses: () => unwrap(apiClient.get('/api/v1/admin/returns/statuses')),
23
+ createStatus: (body) => unwrap(apiClient.post('/api/v1/admin/returns/statuses', body)),
24
+ deleteStatus: (code) => unwrap(apiClient.delete(`/api/v1/admin/returns/statuses/${code}`)),
25
+ setTransitions: (transitions) => unwrap(apiClient.put('/api/v1/admin/returns/transitions', { transitions })),
26
+ // Reasons
27
+ reasons: () => unwrap(apiClient.get('/api/v1/admin/returns/reasons')),
28
+ createReason: (body) => unwrap(apiClient.post('/api/v1/admin/returns/reasons', body)),
29
+ updateReason: (id, patch) => unwrap(apiClient.patch(`/api/v1/admin/returns/reasons/${id}`, patch)),
30
+ deleteReason: (id) => apiClient.delete(`/api/v1/admin/returns/reasons/${id}`),
31
+ // Return delivery methods
32
+ deliveryMethods: () => unwrap(apiClient.get('/api/v1/admin/returns/delivery-methods')),
33
+ createDeliveryMethod: (body) => unwrap(apiClient.post('/api/v1/admin/returns/delivery-methods', body)),
34
+ deleteDeliveryMethod: (id) => apiClient.delete(`/api/v1/admin/returns/delivery-methods/${id}`),
35
+ };
36
+ //# sourceMappingURL=returns-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"returns-client.js","sourceRoot":"","sources":["../../../src/admin/api/returns-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `returns`' admin surface — five routes and one sidebar entry, declared by the
3
+ * module that owns them (feature 091, Phase 4, batch 8;
4
+ * `specs/091-module-owned-admin-surfaces/contracts/admin-contribution.md`).
5
+ *
6
+ * **Its two drains were both `orders`'**, and both took the same exit:
7
+ * publication into `@endora-commerce/admin-kit`.
8
+ * `backend/scripts/ledgers/cross-module-imports/returns.ts` recorded
9
+ * `orderStatusBadgeStyle` — two pure functions over a hex string that cannot
10
+ * tell an order status from a return one, so it is published as
11
+ * `statusBadgeStyle` — and `StatusTransitionGraph`, which
12
+ * `admin-component-contribution.md` Z1 question 1 classifies as a published
13
+ * component rather than a zone contribution: it takes data in and callbacks out
14
+ * and holds no `orders` vocabulary. The shard is deleted rather than edited.
15
+ *
16
+ * **Five routes and one nav entry, and the four sub-screens deliberately have
17
+ * none.** `/returns/statuses`, `/returns/reasons` and
18
+ * `/returns/delivery-methods` are configuration surfaces reached from the list,
19
+ * and `/returns/:id` is a row's detail; a nav entry is a landing surface, and
20
+ * `registryCrumbs` derives all four trails from this entry's own `to` because
21
+ * it matches anything beneath it.
22
+ *
23
+ * **Route order is load-bearing here and nowhere else in this batch.** The
24
+ * three literal sub-paths are declared before `/returns/:id`, because
25
+ * `react-router` ranks a static segment above a dynamic one but the registry's
26
+ * order is what the generated table preserves, and a `:id` route that matched
27
+ * `statuses` first would render the detail screen over a configuration URL.
28
+ *
29
+ * **Both palette actions are already the manifest's** (`open-returns`,
30
+ * `return-statuses`), so nothing about the ⌘K surface moves here.
31
+ *
32
+ * **This entry exports data and nothing else** (R2); every component is a
33
+ * dynamic-import factory (R6).
34
+ */
35
+ import type { AdminContributions } from '@endora-commerce/admin-kit/contributions';
36
+ export declare const contributions: AdminContributions;
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAanF,eAAO,MAAM,aAAa,EAAE,kBA8C3B,CAAC"}
@@ -0,0 +1,57 @@
1
+ /** The module's landing route: the returns/RMA case list. */
2
+ const LIST_ROUTE = '/returns';
3
+ /**
4
+ * Every `/api/v1/admin/returns/*` `GET` enforces this, the three configuration
5
+ * screens' included — so it is the code that opens all five screens, and the
6
+ * write code gates the mutations they offer. Hiding a screen a read-only
7
+ * operator can legitimately open is issue #232's finding.
8
+ */
9
+ const RETURNS_READ = 'returns:read';
10
+ export const contributions = {
11
+ routes: [
12
+ {
13
+ path: LIST_ROUTE,
14
+ component: () => import('./pages/ReturnsList.js'),
15
+ requiredPermission: RETURNS_READ,
16
+ index: true,
17
+ },
18
+ {
19
+ path: '/returns/statuses',
20
+ component: () => import('./pages/ReturnStatusesConfigPage.js'),
21
+ requiredPermission: RETURNS_READ,
22
+ },
23
+ {
24
+ path: '/returns/reasons',
25
+ component: () => import('./pages/ReturnReasonsPage.js'),
26
+ requiredPermission: RETURNS_READ,
27
+ },
28
+ {
29
+ path: '/returns/delivery-methods',
30
+ component: () => import('./pages/ReturnDeliveryMethodsPage.js'),
31
+ requiredPermission: RETURNS_READ,
32
+ },
33
+ {
34
+ path: '/returns/:id',
35
+ component: () => import('./pages/ReturnDetail.js'),
36
+ requiredPermission: RETURNS_READ,
37
+ },
38
+ ],
39
+ nav: [
40
+ {
41
+ to: LIST_ROUTE,
42
+ // Module-relative (R8), out of `packages/modules/returns/i18n/`. It was
43
+ // `appShell.nav.returns` in the shared `_i18n` bundle.
44
+ labelKey: 'nav.returns.label',
45
+ icon: 'Package',
46
+ section: 'sales',
47
+ // Fourth of seven in the hand-written *Sales* table, after the three
48
+ // `/orders*` rows and before `/quote-requests`. Every other row there is
49
+ // still the host's, so this appends after all of them; the weight is what
50
+ // restores the position once `orders` (batch 12) and `quote_requests`
51
+ // (batch 10) convert.
52
+ weight: 400,
53
+ requiredPermission: RETURNS_READ,
54
+ },
55
+ ],
56
+ };
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAoCA,6DAA6D;AAC7D,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C,MAAM,EAAE;QACN;YACE,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC;YACjD,kBAAkB,EAAE,YAAY;YAChC,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,qCAAqC,CAAC;YAC9D,kBAAkB,EAAE,YAAY;SACjC;QACD;YACE,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC;YACvD,kBAAkB,EAAE,YAAY;SACjC;QACD;YACE,IAAI,EAAE,2BAA2B;YACjC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC;YAC/D,kBAAkB,EAAE,YAAY;SACjC;QACD;YACE,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAAC;YAClD,kBAAkB,EAAE,YAAY;SACjC;KACF;IACD,GAAG,EAAE;QACH;YACE,EAAE,EAAE,UAAU;YACd,wEAAwE;YACxE,uDAAuD;YACvD,QAAQ,EAAE,mBAAmB;YAC7B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,OAAO;YAChB,qEAAqE;YACrE,yEAAyE;YACzE,0EAA0E;YAC1E,sEAAsE;YACtE,sBAAsB;YACtB,MAAM,EAAE,GAAG;YACX,kBAAkB,EAAE,YAAY;SACjC;KACF;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type ReactNode } from 'react';
2
+ /** Allowed return delivery methods + cost (feature 046, US6). */
3
+ export declare function ReturnDeliveryMethodsPage(): ReactNode;
4
+ export default ReturnDeliveryMethodsPage;
5
+ //# sourceMappingURL=ReturnDeliveryMethodsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReturnDeliveryMethodsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/ReturnDeliveryMethodsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASzE,iEAAiE;AACjE,wBAAgB,yBAAyB,IAAI,SAAS,CA0GrD;AACD,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Trash2 } from 'lucide-react';
4
+ import { ApiError } from '@endora-commerce/admin-kit/lib';
5
+ import { Alert, AlertDescription, Badge, Button, Card, CardContent, CardHeader, CardTitle, Label, PageHeader, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@endora-commerce/admin-kit/ui';
6
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
7
+ import { returnsClient } from '../api/returns-client.js';
8
+ /** Allowed return delivery methods + cost (feature 046, US6). */
9
+ export function ReturnDeliveryMethodsPage() {
10
+ const t = useTranslation('core');
11
+ const [rows, setRows] = useState([]);
12
+ const [error, setError] = useState(null);
13
+ const [deliveryMethodId, setDeliveryMethodId] = useState('');
14
+ const [returnCost, setReturnCost] = useState(0);
15
+ const [currency, setCurrency] = useState('PLN');
16
+ const refresh = useCallback(async () => {
17
+ setError(null);
18
+ try {
19
+ setRows(await returnsClient.deliveryMethods());
20
+ }
21
+ catch (err) {
22
+ setError(err instanceof ApiError ? err.envelope.error.message : 'Failed to load.');
23
+ }
24
+ }, []);
25
+ useEffect(() => {
26
+ void refresh();
27
+ }, [refresh]);
28
+ const run = useCallback(async (fn) => {
29
+ setError(null);
30
+ try {
31
+ await fn();
32
+ await refresh();
33
+ }
34
+ catch (err) {
35
+ setError(err instanceof ApiError ? err.envelope.error.message : 'Action failed.');
36
+ }
37
+ }, [refresh]);
38
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(PageHeader, { title: t('returns.methods.title'), description: t('returns.methods.description') }), error && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Methods" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Delivery method id" }), _jsx(TableHead, { children: "Return cost" }), _jsx(TableHead, { children: "Currency" }), _jsx(TableHead, { children: "Active" }), _jsx(TableHead, {})] }) }), _jsx(TableBody, { children: rows.map((r) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-mono text-xs", children: r.deliveryMethodId }), _jsx(TableCell, { children: r.returnCost.toFixed(2) }), _jsx(TableCell, { children: r.currency }), _jsx(TableCell, { children: _jsx(Badge, { variant: r.isActive ? 'default' : 'secondary', children: r.isActive ? 'active' : 'inactive' }) }), _jsx(TableCell, { children: _jsx(Button, { variant: "ghost", size: "sm", onClick: () => void run(() => returnsClient.deleteDeliveryMethod(r.id)), children: _jsx(Trash2, { className: "size-4" }) }) })] }, r.id))) })] }), _jsxs("div", { className: "flex flex-wrap items-end gap-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "dm", children: "Delivery method id" }), _jsx("input", { id: "dm", className: "h-9 w-80 rounded-md border border-input bg-background px-3 text-sm", value: deliveryMethodId, onChange: (e) => setDeliveryMethodId(e.target.value), placeholder: "uuid" })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "cost", children: "Return cost" }), _jsx("input", { id: "cost", type: "number", step: "0.01", className: "h-9 w-28 rounded-md border border-input bg-background px-3 text-sm", value: returnCost, onChange: (e) => setReturnCost(Number(e.target.value)) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "cur", children: "Currency" }), _jsx("input", { id: "cur", className: "h-9 w-20 rounded-md border border-input bg-background px-3 text-sm", value: currency, onChange: (e) => setCurrency(e.target.value) })] }), _jsx(Button, { size: "sm", disabled: !deliveryMethodId.trim(), onClick: () => void run(async () => {
39
+ await returnsClient.createDeliveryMethod({ deliveryMethodId: deliveryMethodId.trim(), returnCost, currency });
40
+ setDeliveryMethodId('');
41
+ }), children: "Add method" })] })] })] })] }));
42
+ }
43
+ export default ReturnDeliveryMethodsPage;
44
+ //# sourceMappingURL=ReturnDeliveryMethodsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReturnDeliveryMethodsPage.js","sourceRoot":"","sources":["../../../src/admin/pages/ReturnDeliveryMethodsPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ReactNode } from 'react';
2
+ /** Returns / RMA case detail (feature 046, US2/US4/US5/US6). */
3
+ export declare function ReturnDetail(): ReactNode;
4
+ export default ReturnDetail;
5
+ //# sourceMappingURL=ReturnDetail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReturnDetail.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/ReturnDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAezE,gEAAgE;AAChE,wBAAgB,YAAY,IAAI,SAAS,CAkcxC;AACD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,115 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Link, useParams } from 'react-router-dom';
4
+ import { ArrowLeft } from 'lucide-react';
5
+ import { ApiError, formatDateTime } from '@endora-commerce/admin-kit/lib';
6
+ import { Alert, AlertDescription, Badge, Button, Card, CardContent, CardHeader, CardTitle, Checkbox, Label, Select, PageHeader, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@endora-commerce/admin-kit/ui';
7
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
8
+ import { returnsClient } from '../api/returns-client.js';
9
+ /** Returns / RMA case detail (feature 046, US2/US4/US5/US6). */
10
+ export function ReturnDetail() {
11
+ const t = useTranslation('core');
12
+ const { id = '' } = useParams();
13
+ const [rc, setRc] = useState(null);
14
+ const [transitions, setTransitions] = useState([]);
15
+ const [shipments, setShipments] = useState([]);
16
+ const [prefill, setPrefill] = useState(null);
17
+ const [error, setError] = useState(null);
18
+ const [info, setInfo] = useState(null);
19
+ const [commentBody, setCommentBody] = useState('');
20
+ const [commentVisible, setCommentVisible] = useState(true);
21
+ const [commentNotify, setCommentNotify] = useState(false);
22
+ const [resolution, setResolution] = useState('refund');
23
+ const [paymentMethodId, setPaymentMethodId] = useState('');
24
+ const [approved, setApproved] = useState({});
25
+ // Issue #150 — a correction is asked for by default, as the screen always
26
+ // did; the control exists because "not requested" is one of the three
27
+ // outcomes below and an operator has to be able to reach it deliberately.
28
+ const [createCorrectiveInvoice, setCreateCorrectiveInvoice] = useState(true);
29
+ const [settlement, setSettlement] = useState(null);
30
+ const refresh = useCallback(async () => {
31
+ setError(null);
32
+ try {
33
+ const [detail, graph, ship] = await Promise.all([
34
+ returnsClient.get(id),
35
+ returnsClient.statuses(),
36
+ returnsClient.shipments(id).catch(() => []),
37
+ ]);
38
+ setRc(detail);
39
+ setTransitions(graph.transitions.filter((t) => t.fromStatusCode === detail.statusCode));
40
+ setShipments(ship);
41
+ if (detail.statusCode === 'received') {
42
+ const pf = await returnsClient.settlementPrefill(id);
43
+ setPrefill(pf);
44
+ setApproved(Object.fromEntries(pf.items.map((it) => [it.returnCaseItemId, it.defaultRefundAmount])));
45
+ }
46
+ else {
47
+ setPrefill(null);
48
+ }
49
+ }
50
+ catch (err) {
51
+ setError(err instanceof ApiError ? err.envelope.error.message : 'Failed to load case.');
52
+ }
53
+ }, [id]);
54
+ useEffect(() => {
55
+ void refresh();
56
+ }, [refresh]);
57
+ const run = useCallback(async (fn, ok) => {
58
+ setError(null);
59
+ setInfo(null);
60
+ try {
61
+ await fn();
62
+ setInfo(ok);
63
+ await refresh();
64
+ }
65
+ catch (err) {
66
+ setError(err instanceof ApiError ? err.envelope.error.message : 'Action failed.');
67
+ }
68
+ }, [refresh]);
69
+ if (!rc) {
70
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(PageHeader, { title: t('returns.detail.title') }), error && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) }))] }));
71
+ }
72
+ const isNew = rc.statusCode === 'new';
73
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(Button, { asChild: true, variant: "ghost", size: "sm", children: _jsxs(Link, { to: "/returns", children: [_jsx(ArrowLeft, { className: "size-4" }), " Back to returns"] }) }), _jsx(PageHeader, { title: _jsxs("span", { className: "flex items-center gap-2", children: [rc.rmaNumber ?? 'Return case', " ", _jsx(Badge, { variant: "secondary", children: rc.statusLabel }), _jsx(Badge, { variant: "outline", children: rc.kind })] }), description: `Order ${rc.orderId}` }), error && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })), info && (_jsx(Alert, { children: _jsx(AlertDescription, { children: info }) })), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Actions" }) }), _jsxs(CardContent, { className: "flex flex-wrap items-center gap-2", children: [isNew && (_jsx(Button, { size: "sm", onClick: () => void run(() => returnsClient.authorize(id), 'Authorized.'), children: "Authorize (assign RMA)" })), _jsx(Button, { variant: "destructive", size: "sm", onClick: () => {
74
+ const reason = window.prompt('Rejection reason');
75
+ if (reason)
76
+ void run(() => returnsClient.reject(id, reason), 'Rejected.');
77
+ }, children: "Reject" }), transitions.map((t) => (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => void run(() => returnsClient.transition(id, t.toStatusCode), `Moved to ${t.toStatusCode}.`), children: ["\u2192 ", t.toStatusCode] }, t.toStatusCode)))] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Returned items" }) }), _jsx(CardContent, { children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Product" }), _jsx(TableHead, { children: "Qty" }), _jsx(TableHead, { children: "Default refund" }), _jsx(TableHead, { children: "Approved" })] }) }), _jsx(TableBody, { children: rc.items.map((it) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: it.productName }), _jsx(TableCell, { children: it.quantity }), _jsx(TableCell, { children: it.defaultRefundAmount.toFixed(2) }), _jsx(TableCell, { children: it.approvedRefundAmount.toFixed(2) })] }, it.id))) })] }) })] }), prefill && (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('returns.detail.settlement.title') }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs("div", { className: "flex flex-wrap items-end gap-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "resolution", children: t('returns.detail.settlement.resolution') }), _jsxs(Select, { id: "resolution", value: resolution, onChange: (e) => setResolution(e.target.value), children: [_jsx("option", { value: "refund", children: t('returns.detail.resolution.refund') }), _jsx("option", { value: "credit", children: t('returns.detail.resolution.credit') }), _jsx("option", { value: "replacement", children: t('returns.detail.resolution.replacement') }), _jsx("option", { value: "repair", children: t('returns.detail.resolution.repair') })] })] }), resolution === 'refund' && (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "pm", children: t('returns.detail.settlement.paymentMethodId') }), _jsx("input", { id: "pm", className: "h-9 rounded-md border border-input bg-background px-3 text-sm", value: paymentMethodId, onChange: (e) => setPaymentMethodId(e.target.value) })] }))] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('returns.detail.col.product') }), _jsx(TableHead, { children: t('returns.detail.settlement.maxPaid') }), _jsx(TableHead, { children: t('returns.detail.col.approved') })] }) }), _jsx(TableBody, { children: prefill.items.map((it) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: it.productName }), _jsx(TableCell, { children: it.defaultRefundAmount.toFixed(2) }), _jsx(TableCell, { children: _jsx("input", { type: "number", step: "0.01", className: "h-8 w-28 rounded-md border border-input bg-background px-2 text-sm", value: approved[it.returnCaseItemId] ?? 0, onChange: (e) => setApproved((prev) => ({ ...prev, [it.returnCaseItemId]: Number(e.target.value) })) }) })] }, it.returnCaseItemId))) })] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", htmlFor: "createCorrectiveInvoice", children: [_jsx(Checkbox, { id: "createCorrectiveInvoice", checked: createCorrectiveInvoice, onChange: (e) => setCreateCorrectiveInvoice(e.target.checked) }), t('returns.detail.settlement.createCorrectiveInvoice')] }), _jsx(Button, { size: "sm", onClick: () => void (async () => {
78
+ setError(null);
79
+ setInfo(null);
80
+ try {
81
+ const settled = await returnsClient.settle(id, {
82
+ resolutionType: resolution,
83
+ lines: prefill.items.map((it) => ({
84
+ returnCaseItemId: it.returnCaseItemId,
85
+ approvedRefundAmount: approved[it.returnCaseItemId] ?? 0,
86
+ })),
87
+ ...(resolution === 'refund' && paymentMethodId
88
+ ? { refundPaymentMethodId: paymentMethodId }
89
+ : {}),
90
+ createCorrectiveInvoice,
91
+ });
92
+ // Issue #150 — kept whatever the gateway said, because the
93
+ // corrective invoice is a separate answer: a settlement can
94
+ // succeed and still, correctly, produce no document.
95
+ setSettlement(settled);
96
+ if (settled.refund?.settlementState === 'failed') {
97
+ setError(settled.refund.failureReason ?? t('returns.detail.settlement.gatewayRejected'));
98
+ }
99
+ else {
100
+ setInfo(t('returns.detail.settlement.done'));
101
+ }
102
+ await refresh();
103
+ }
104
+ catch (err) {
105
+ setError(err instanceof ApiError
106
+ ? err.envelope.error.message
107
+ : t('returns.detail.actionFailed'));
108
+ }
109
+ })(), children: t('returns.detail.settlement.settle') })] })] })), (settlement || rc.correctiveInvoice) && (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t('returns.detail.correctiveInvoice.title') }) }), _jsx(CardContent, { className: "text-sm", children: settlement ? (settlement.correctiveInvoice === undefined ? (_jsx("p", { className: "text-muted-foreground", children: t('returns.detail.correctiveInvoice.notRequested') })) : settlement.correctiveInvoice.issued ? (_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Badge, { variant: "secondary", children: t('returns.detail.correctiveInvoice.issued') }), _jsx(Button, { asChild: true, variant: "outline", size: "sm", children: _jsx(Link, { to: `/invoices/${settlement.correctiveInvoice.invoiceId}`, children: settlement.correctiveInvoice.number }) })] })) : (_jsx("p", { className: "text-muted-foreground", children: t(`returns.detail.correctiveInvoice.notDue.${settlement.correctiveInvoice.reason}`) }))) : rc.correctiveInvoice?.outcome === 'issued' ? (_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Badge, { variant: "secondary", children: t('returns.detail.correctiveInvoice.issued') }), rc.correctiveInvoice.invoiceId && (_jsx(Button, { asChild: true, variant: "outline", size: "sm", children: _jsx(Link, { to: `/invoices/${rc.correctiveInvoice.invoiceId}`, children: t('returns.detail.correctiveInvoice.open') }) }))] })) : rc.correctiveInvoice?.outcome === 'not_due' ? (_jsx("p", { className: "text-muted-foreground", children: t('returns.detail.correctiveInvoice.notDue.order_not_invoiced') })) : (_jsx("p", { className: "text-muted-foreground", children: t('returns.detail.correctiveInvoice.notRequested') })) })] })), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Return shipments" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsx(Button, { variant: "outline", size: "sm", onClick: () => void run(() => returnsClient.createShipment(id, 'inbound'), 'Inbound shipment recorded.'), children: "Record inbound shipment" }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Direction" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { children: "Tracking" }), _jsx(TableHead, {})] }) }), _jsx(TableBody, { children: shipments.map((s) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: s.direction }), _jsx(TableCell, { children: s.status }), _jsx(TableCell, { children: s.externalReference ?? '—' }), _jsx(TableCell, { children: s.status === 'pending' && s.direction === 'inbound' && (_jsx(Button, { variant: "ghost", size: "sm", onClick: () => void run(() => returnsClient.receiveShipment(id, s.id), 'Received.'), children: "Mark received" })) })] }, s.id))) })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Comments" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs("div", { className: "space-y-2", children: [rc.comments.map((c) => (_jsxs("div", { className: "rounded-md border p-2 text-sm", children: [_jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [_jsx("span", { children: c.authorKind }), _jsx("span", { children: formatDateTime(c.createdAt) }), !c.isCustomerVisible && _jsx(Badge, { variant: "outline", children: "internal" })] }), _jsx("div", { children: c.body })] }, c.id))), rc.comments.length === 0 && _jsx("p", { className: "text-sm text-muted-foreground", children: "No comments." })] }), _jsx("textarea", { className: "min-h-[60px] w-full rounded-md border border-input bg-background p-2 text-sm", value: commentBody, onChange: (e) => setCommentBody(e.target.value), placeholder: "Add a comment\u2026" }), _jsxs("div", { className: "flex flex-wrap items-center gap-3 text-sm", children: [_jsxs("label", { className: "flex items-center gap-1", children: [_jsx("input", { type: "checkbox", checked: commentVisible, onChange: (e) => setCommentVisible(e.target.checked) }), "Visible to customer"] }), _jsxs("label", { className: "flex items-center gap-1", children: [_jsx("input", { type: "checkbox", checked: commentNotify, onChange: (e) => setCommentNotify(e.target.checked) }), "Notify customer"] }), _jsx(Button, { size: "sm", disabled: !commentBody.trim(), onClick: () => void run(async () => {
110
+ await returnsClient.addComment(id, commentBody.trim(), commentVisible, commentNotify);
111
+ setCommentBody('');
112
+ }, 'Comment added.'), children: "Add comment" })] })] })] })] }));
113
+ }
114
+ export default ReturnDetail;
115
+ //# sourceMappingURL=ReturnDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReturnDetail.js","sourceRoot":"","sources":["../../../src/admin/pages/ReturnDetail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ReactNode } from 'react';
2
+ /** Managed return/complaint reasons (feature 046, US7). */
3
+ export declare function ReturnReasonsPage(): ReactNode;
4
+ export default ReturnReasonsPage;
5
+ //# sourceMappingURL=ReturnReasonsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReturnReasonsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/ReturnReasonsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASzE,2DAA2D;AAC3D,wBAAgB,iBAAiB,IAAI,SAAS,CAoH7C;AACD,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Trash2 } from 'lucide-react';
4
+ import { ApiError } from '@endora-commerce/admin-kit/lib';
5
+ import { Alert, AlertDescription, Badge, Button, Card, CardContent, CardHeader, CardTitle, Label, Select, PageHeader, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@endora-commerce/admin-kit/ui';
6
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
7
+ import { returnsClient } from '../api/returns-client.js';
8
+ /** Managed return/complaint reasons (feature 046, US7). */
9
+ export function ReturnReasonsPage() {
10
+ const t = useTranslation('core');
11
+ const [rows, setRows] = useState([]);
12
+ const [error, setError] = useState(null);
13
+ const [label, setLabel] = useState('');
14
+ const [appliesTo, setAppliesTo] = useState('both');
15
+ const [weight, setWeight] = useState(100);
16
+ const refresh = useCallback(async () => {
17
+ setError(null);
18
+ try {
19
+ setRows(await returnsClient.reasons());
20
+ }
21
+ catch (err) {
22
+ setError(err instanceof ApiError ? err.envelope.error.message : 'Failed to load.');
23
+ }
24
+ }, []);
25
+ useEffect(() => {
26
+ void refresh();
27
+ }, [refresh]);
28
+ const run = useCallback(async (fn) => {
29
+ setError(null);
30
+ try {
31
+ await fn();
32
+ await refresh();
33
+ }
34
+ catch (err) {
35
+ setError(err instanceof ApiError ? err.envelope.error.message : 'Action failed.');
36
+ }
37
+ }, [refresh]);
38
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(PageHeader, { title: t('returns.reasons.title'), description: t('returns.reasons.description') }), error && (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: "Reasons" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Label" }), _jsx(TableHead, { children: "Applies to" }), _jsx(TableHead, { children: "Weight" }), _jsx(TableHead, { children: "Active" }), _jsx(TableHead, {})] }) }), _jsx(TableBody, { children: rows.map((r) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: r.label['en'] ?? Object.values(r.label)[0] ?? '—' }), _jsx(TableCell, { children: r.appliesTo }), _jsx(TableCell, { children: r.weight }), _jsx(TableCell, { children: _jsx(Button, { variant: "ghost", size: "sm", onClick: () => void run(() => returnsClient.updateReason(r.id, { isActive: !r.isActive })), children: _jsx(Badge, { variant: r.isActive ? 'default' : 'secondary', children: r.isActive ? 'active' : 'inactive' }) }) }), _jsx(TableCell, { children: _jsx(Button, { variant: "ghost", size: "sm", onClick: () => void run(() => returnsClient.deleteReason(r.id)), children: _jsx(Trash2, { className: "size-4" }) }) })] }, r.id))) })] }), _jsxs("div", { className: "flex flex-wrap items-end gap-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "label", children: "Label (EN)" }), _jsx("input", { id: "label", className: "h-9 rounded-md border border-input bg-background px-3 text-sm", value: label, onChange: (e) => setLabel(e.target.value) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "applies", children: "Applies to" }), _jsxs(Select, { id: "applies", value: appliesTo, onChange: (e) => setAppliesTo(e.target.value), children: [_jsx("option", { value: "both", children: "Both" }), _jsx("option", { value: "return", children: "Return" }), _jsx("option", { value: "complaint", children: "Complaint" })] })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "weight", children: "Weight" }), _jsx("input", { id: "weight", type: "number", className: "h-9 w-24 rounded-md border border-input bg-background px-3 text-sm", value: weight, onChange: (e) => setWeight(Number(e.target.value)) })] }), _jsx(Button, { size: "sm", disabled: !label.trim(), onClick: () => void run(async () => {
39
+ await returnsClient.createReason({ label: { en: label.trim() }, appliesTo, weight });
40
+ setLabel('');
41
+ }), children: "Add reason" })] })] })] })] }));
42
+ }
43
+ export default ReturnReasonsPage;
44
+ //# sourceMappingURL=ReturnReasonsPage.js.map