@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.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/admin/api/returns-client.d.ts +69 -0
- package/dist/admin/api/returns-client.d.ts.map +1 -0
- package/dist/admin/api/returns-client.js +36 -0
- package/dist/admin/api/returns-client.js.map +1 -0
- package/dist/admin/index.d.ts +37 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +57 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/ReturnDeliveryMethodsPage.d.ts +5 -0
- package/dist/admin/pages/ReturnDeliveryMethodsPage.d.ts.map +1 -0
- package/dist/admin/pages/ReturnDeliveryMethodsPage.js +44 -0
- package/dist/admin/pages/ReturnDeliveryMethodsPage.js.map +1 -0
- package/dist/admin/pages/ReturnDetail.d.ts +5 -0
- package/dist/admin/pages/ReturnDetail.d.ts.map +1 -0
- package/dist/admin/pages/ReturnDetail.js +115 -0
- package/dist/admin/pages/ReturnDetail.js.map +1 -0
- package/dist/admin/pages/ReturnReasonsPage.d.ts +5 -0
- package/dist/admin/pages/ReturnReasonsPage.d.ts.map +1 -0
- package/dist/admin/pages/ReturnReasonsPage.js +44 -0
- package/dist/admin/pages/ReturnReasonsPage.js.map +1 -0
- package/dist/admin/pages/ReturnStatusesConfigPage.d.ts +5 -0
- package/dist/admin/pages/ReturnStatusesConfigPage.d.ts.map +1 -0
- package/dist/admin/pages/ReturnStatusesConfigPage.js +71 -0
- package/dist/admin/pages/ReturnStatusesConfigPage.js.map +1 -0
- package/dist/admin/pages/ReturnsList.d.ts +5 -0
- package/dist/admin/pages/ReturnsList.d.ts.map +1 -0
- package/dist/admin/pages/ReturnsList.js +189 -0
- package/dist/admin/pages/ReturnsList.js.map +1 -0
- package/dist/backend/domain/default-reasons.d.ts +14 -0
- package/dist/backend/domain/default-reasons.d.ts.map +1 -0
- package/dist/backend/domain/default-reasons.js +9 -0
- package/dist/backend/domain/default-reasons.js.map +1 -0
- package/dist/backend/domain/free-return-window.d.ts +2 -0
- package/dist/backend/domain/free-return-window.d.ts.map +1 -0
- package/dist/backend/domain/free-return-window.js +19 -0
- package/dist/backend/domain/free-return-window.js.map +1 -0
- package/dist/backend/domain/refund-math.d.ts +19 -0
- package/dist/backend/domain/refund-math.d.ts.map +1 -0
- package/dist/backend/domain/refund-math.js +27 -0
- package/dist/backend/domain/refund-math.js.map +1 -0
- package/dist/backend/domain/return-status-graph.d.ts +91 -0
- package/dist/backend/domain/return-status-graph.d.ts.map +1 -0
- package/dist/backend/domain/return-status-graph.js +143 -0
- package/dist/backend/domain/return-status-graph.js.map +1 -0
- package/dist/backend/email-templates/return-authorized.d.ts +11 -0
- package/dist/backend/email-templates/return-authorized.d.ts.map +1 -0
- package/dist/backend/email-templates/return-authorized.js +18 -0
- package/dist/backend/email-templates/return-authorized.js.map +1 -0
- package/dist/backend/email-templates/return-rejected.d.ts +11 -0
- package/dist/backend/email-templates/return-rejected.d.ts.map +1 -0
- package/dist/backend/email-templates/return-rejected.js +20 -0
- package/dist/backend/email-templates/return-rejected.js.map +1 -0
- package/dist/backend/email-templates/transactional-defaults.d.ts +11 -0
- package/dist/backend/email-templates/transactional-defaults.d.ts.map +1 -0
- package/dist/backend/email-templates/transactional-defaults.js +64 -0
- package/dist/backend/email-templates/transactional-defaults.js.map +1 -0
- package/dist/backend/entities/refund.entity.d.ts +41 -0
- package/dist/backend/entities/refund.entity.d.ts.map +1 -0
- package/dist/backend/entities/refund.entity.js +122 -0
- package/dist/backend/entities/refund.entity.js.map +1 -0
- package/dist/backend/entities/return-case-attachment.entity.d.ts +16 -0
- package/dist/backend/entities/return-case-attachment.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-case-attachment.entity.js +53 -0
- package/dist/backend/entities/return-case-attachment.entity.js.map +1 -0
- package/dist/backend/entities/return-case-comment.entity.d.ts +20 -0
- package/dist/backend/entities/return-case-comment.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-case-comment.entity.js +70 -0
- package/dist/backend/entities/return-case-comment.entity.js.map +1 -0
- package/dist/backend/entities/return-case-item.entity.d.ts +25 -0
- package/dist/backend/entities/return-case-item.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-case-item.entity.js +87 -0
- package/dist/backend/entities/return-case-item.entity.js.map +1 -0
- package/dist/backend/entities/return-case.entity.d.ts +41 -0
- package/dist/backend/entities/return-case.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-case.entity.js +155 -0
- package/dist/backend/entities/return-case.entity.js.map +1 -0
- package/dist/backend/entities/return-delivery-method.entity.d.ts +18 -0
- package/dist/backend/entities/return-delivery-method.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-delivery-method.entity.js +63 -0
- package/dist/backend/entities/return-delivery-method.entity.js.map +1 -0
- package/dist/backend/entities/return-list-saved-view.entity.d.ts +24 -0
- package/dist/backend/entities/return-list-saved-view.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-list-saved-view.entity.js +74 -0
- package/dist/backend/entities/return-list-saved-view.entity.js.map +1 -0
- package/dist/backend/entities/return-reason.entity.d.ts +21 -0
- package/dist/backend/entities/return-reason.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-reason.entity.js +65 -0
- package/dist/backend/entities/return-reason.entity.js.map +1 -0
- package/dist/backend/entities/return-shipment.entity.d.ts +22 -0
- package/dist/backend/entities/return-shipment.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-shipment.entity.js +71 -0
- package/dist/backend/entities/return-shipment.entity.js.map +1 -0
- package/dist/backend/entities/return-status-transition.entity.d.ts +17 -0
- package/dist/backend/entities/return-status-transition.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-status-transition.entity.js +55 -0
- package/dist/backend/entities/return-status-transition.entity.js.map +1 -0
- package/dist/backend/entities/return-status.entity.d.ts +29 -0
- package/dist/backend/entities/return-status.entity.d.ts.map +1 -0
- package/dist/backend/entities/return-status.entity.js +90 -0
- package/dist/backend/entities/return-status.entity.js.map +1 -0
- package/dist/backend/events/return-status-events.d.ts +44 -0
- package/dist/backend/events/return-status-events.d.ts.map +1 -0
- package/dist/backend/events/return-status-events.js +50 -0
- package/dist/backend/events/return-status-events.js.map +1 -0
- package/dist/backend/index.d.ts +106 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +116 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +33 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +124 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +38 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +181 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.customer.d.ts +22 -0
- package/dist/backend/routes.customer.d.ts.map +1 -0
- package/dist/backend/routes.customer.js +56 -0
- package/dist/backend/routes.customer.js.map +1 -0
- package/dist/backend/services/notification-context.d.ts +47 -0
- package/dist/backend/services/notification-context.d.ts.map +1 -0
- package/dist/backend/services/notification-context.js +49 -0
- package/dist/backend/services/notification-context.js.map +1 -0
- package/dist/backend/services/return-attachment-service.d.ts +20 -0
- package/dist/backend/services/return-attachment-service.d.ts.map +1 -0
- package/dist/backend/services/return-attachment-service.js +48 -0
- package/dist/backend/services/return-attachment-service.js.map +1 -0
- package/dist/backend/services/return-authorization-service.d.ts +53 -0
- package/dist/backend/services/return-authorization-service.d.ts.map +1 -0
- package/dist/backend/services/return-authorization-service.js +72 -0
- package/dist/backend/services/return-authorization-service.js.map +1 -0
- package/dist/backend/services/return-case-service.d.ts +44 -0
- package/dist/backend/services/return-case-service.d.ts.map +1 -0
- package/dist/backend/services/return-case-service.js +260 -0
- package/dist/backend/services/return-case-service.js.map +1 -0
- package/dist/backend/services/return-comment-service.d.ts +43 -0
- package/dist/backend/services/return-comment-service.d.ts.map +1 -0
- package/dist/backend/services/return-comment-service.js +109 -0
- package/dist/backend/services/return-comment-service.js.map +1 -0
- package/dist/backend/services/return-delivery-method-service.d.ts +44 -0
- package/dist/backend/services/return-delivery-method-service.d.ts.map +1 -0
- package/dist/backend/services/return-delivery-method-service.js +114 -0
- package/dist/backend/services/return-delivery-method-service.js.map +1 -0
- package/dist/backend/services/return-email-notifier.d.ts +89 -0
- package/dist/backend/services/return-email-notifier.d.ts.map +1 -0
- package/dist/backend/services/return-email-notifier.js +128 -0
- package/dist/backend/services/return-email-notifier.js.map +1 -0
- package/dist/backend/services/return-export-service.d.ts +16 -0
- package/dist/backend/services/return-export-service.d.ts.map +1 -0
- package/dist/backend/services/return-export-service.js +29 -0
- package/dist/backend/services/return-export-service.js.map +1 -0
- package/dist/backend/services/return-list-service.d.ts +27 -0
- package/dist/backend/services/return-list-service.d.ts.map +1 -0
- package/dist/backend/services/return-list-service.js +114 -0
- package/dist/backend/services/return-list-service.js.map +1 -0
- package/dist/backend/services/return-list-view-service.d.ts +36 -0
- package/dist/backend/services/return-list-view-service.d.ts.map +1 -0
- package/dist/backend/services/return-list-view-service.js +82 -0
- package/dist/backend/services/return-list-view-service.js.map +1 -0
- package/dist/backend/services/return-reason-service.d.ts +33 -0
- package/dist/backend/services/return-reason-service.d.ts.map +1 -0
- package/dist/backend/services/return-reason-service.js +90 -0
- package/dist/backend/services/return-reason-service.js.map +1 -0
- package/dist/backend/services/return-settlement-service.d.ts +67 -0
- package/dist/backend/services/return-settlement-service.d.ts.map +1 -0
- package/dist/backend/services/return-settlement-service.js +295 -0
- package/dist/backend/services/return-settlement-service.js.map +1 -0
- package/dist/backend/services/return-shipment-service.d.ts +40 -0
- package/dist/backend/services/return-shipment-service.d.ts.map +1 -0
- package/dist/backend/services/return-shipment-service.js +113 -0
- package/dist/backend/services/return-shipment-service.js.map +1 -0
- package/dist/backend/services/return-status-graph-service.d.ts +59 -0
- package/dist/backend/services/return-status-graph-service.d.ts.map +1 -0
- package/dist/backend/services/return-status-graph-service.js +197 -0
- package/dist/backend/services/return-status-graph-service.js.map +1 -0
- package/dist/backend/services/return-transition-service.d.ts +48 -0
- package/dist/backend/services/return-transition-service.d.ts.map +1 -0
- package/dist/backend/services/return-transition-service.js +116 -0
- package/dist/backend/services/return-transition-service.js.map +1 -0
- package/dist/backend/services/returns-seeder.d.ts +18 -0
- package/dist/backend/services/returns-seeder.d.ts.map +1 -0
- package/dist/backend/services/returns-seeder.js +63 -0
- package/dist/backend/services/returns-seeder.js.map +1 -0
- package/dist/backend/services/rma-number-generator.d.ts +35 -0
- package/dist/backend/services/rma-number-generator.d.ts.map +1 -0
- package/dist/backend/services/rma-number-generator.js +45 -0
- package/dist/backend/services/rma-number-generator.js.map +1 -0
- package/dist/manifest.d.ts +182 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +216 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260625T144227_returns_init.d.ts +15 -0
- package/dist/migrations/20260625T144227_returns_init.d.ts.map +1 -0
- package/dist/migrations/20260625T144227_returns_init.js +241 -0
- package/dist/migrations/20260625T144227_returns_init.js.map +1 -0
- package/dist/migrations/20260817T203206_returns_refund_corrective_invoice_outcome.d.ts +25 -0
- package/dist/migrations/20260817T203206_returns_refund_corrective_invoice_outcome.d.ts.map +1 -0
- package/dist/migrations/20260817T203206_returns_refund_corrective_invoice_outcome.js +46 -0
- package/dist/migrations/20260817T203206_returns_refund_corrective_invoice_outcome.js.map +1 -0
- package/dist/migrations/index.d.ts +28 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +31 -0
- package/dist/migrations/index.js.map +1 -0
- package/docs/returns.md +103 -0
- package/i18n/en.json +28 -0
- package/i18n/pl.json +28 -0
- package/package.json +101 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|