@endora-commerce/mod-quote-requests 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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/admin/index.d.ts +26 -0
  4. package/dist/admin/index.d.ts.map +1 -0
  5. package/dist/admin/index.js +56 -0
  6. package/dist/admin/index.js.map +1 -0
  7. package/dist/admin/pages/RfqCreatePage.d.ts +9 -0
  8. package/dist/admin/pages/RfqCreatePage.d.ts.map +1 -0
  9. package/dist/admin/pages/RfqCreatePage.js +163 -0
  10. package/dist/admin/pages/RfqCreatePage.js.map +1 -0
  11. package/dist/admin/pages/RfqDetail.d.ts +9 -0
  12. package/dist/admin/pages/RfqDetail.d.ts.map +1 -0
  13. package/dist/admin/pages/RfqDetail.js +399 -0
  14. package/dist/admin/pages/RfqDetail.js.map +1 -0
  15. package/dist/admin/pages/RfqList.d.ts +9 -0
  16. package/dist/admin/pages/RfqList.d.ts.map +1 -0
  17. package/dist/admin/pages/RfqList.js +214 -0
  18. package/dist/admin/pages/RfqList.js.map +1 -0
  19. package/dist/admin/validity.d.ts +52 -0
  20. package/dist/admin/validity.d.ts.map +1 -0
  21. package/dist/admin/validity.js +61 -0
  22. package/dist/admin/validity.js.map +1 -0
  23. package/dist/backend/entities/quote-request-event.entity.d.ts +24 -0
  24. package/dist/backend/entities/quote-request-event.entity.d.ts.map +1 -0
  25. package/dist/backend/entities/quote-request-event.entity.js +67 -0
  26. package/dist/backend/entities/quote-request-event.entity.js.map +1 -0
  27. package/dist/backend/entities/quote-request-item.entity.d.ts +34 -0
  28. package/dist/backend/entities/quote-request-item.entity.d.ts.map +1 -0
  29. package/dist/backend/entities/quote-request-item.entity.js +119 -0
  30. package/dist/backend/entities/quote-request-item.entity.js.map +1 -0
  31. package/dist/backend/entities/quote-request-notification-event.entity.d.ts +23 -0
  32. package/dist/backend/entities/quote-request-notification-event.entity.d.ts.map +1 -0
  33. package/dist/backend/entities/quote-request-notification-event.entity.js +72 -0
  34. package/dist/backend/entities/quote-request-notification-event.entity.js.map +1 -0
  35. package/dist/backend/entities/quote-request-revision.entity.d.ts +35 -0
  36. package/dist/backend/entities/quote-request-revision.entity.d.ts.map +1 -0
  37. package/dist/backend/entities/quote-request-revision.entity.js +67 -0
  38. package/dist/backend/entities/quote-request-revision.entity.js.map +1 -0
  39. package/dist/backend/entities/quote-request.entity.d.ts +90 -0
  40. package/dist/backend/entities/quote-request.entity.d.ts.map +1 -0
  41. package/dist/backend/entities/quote-request.entity.js +191 -0
  42. package/dist/backend/entities/quote-request.entity.js.map +1 -0
  43. package/dist/backend/index.d.ts +120 -0
  44. package/dist/backend/index.d.ts.map +1 -0
  45. package/dist/backend/index.js +361 -0
  46. package/dist/backend/index.js.map +1 -0
  47. package/dist/backend/plugin.d.ts +95 -0
  48. package/dist/backend/plugin.d.ts.map +1 -0
  49. package/dist/backend/plugin.js +152 -0
  50. package/dist/backend/plugin.js.map +1 -0
  51. package/dist/backend/routes.admin.d.ts +13 -0
  52. package/dist/backend/routes.admin.d.ts.map +1 -0
  53. package/dist/backend/routes.admin.js +82 -0
  54. package/dist/backend/routes.admin.js.map +1 -0
  55. package/dist/backend/routes.customer.d.ts +18 -0
  56. package/dist/backend/routes.customer.d.ts.map +1 -0
  57. package/dist/backend/routes.customer.js +98 -0
  58. package/dist/backend/routes.customer.js.map +1 -0
  59. package/dist/backend/routes.sales-reps.d.ts +12 -0
  60. package/dist/backend/routes.sales-reps.d.ts.map +1 -0
  61. package/dist/backend/routes.sales-reps.js +57 -0
  62. package/dist/backend/routes.sales-reps.js.map +1 -0
  63. package/dist/backend/services/order-completion-reactor.d.ts +32 -0
  64. package/dist/backend/services/order-completion-reactor.d.ts.map +1 -0
  65. package/dist/backend/services/order-completion-reactor.js +57 -0
  66. package/dist/backend/services/order-completion-reactor.js.map +1 -0
  67. package/dist/backend/services/quote-request-business-id-generator.d.ts +46 -0
  68. package/dist/backend/services/quote-request-business-id-generator.d.ts.map +1 -0
  69. package/dist/backend/services/quote-request-business-id-generator.js +69 -0
  70. package/dist/backend/services/quote-request-business-id-generator.js.map +1 -0
  71. package/dist/backend/services/quote-request-read-port.d.ts +36 -0
  72. package/dist/backend/services/quote-request-read-port.d.ts.map +1 -0
  73. package/dist/backend/services/quote-request-read-port.js +96 -0
  74. package/dist/backend/services/quote-request-read-port.js.map +1 -0
  75. package/dist/backend/services/raised-on-channel.d.ts +23 -0
  76. package/dist/backend/services/raised-on-channel.d.ts.map +1 -0
  77. package/dist/backend/services/raised-on-channel.js +26 -0
  78. package/dist/backend/services/raised-on-channel.js.map +1 -0
  79. package/dist/backend/services/rfq-admin-service.d.ts +75 -0
  80. package/dist/backend/services/rfq-admin-service.d.ts.map +1 -0
  81. package/dist/backend/services/rfq-admin-service.js +487 -0
  82. package/dist/backend/services/rfq-admin-service.js.map +1 -0
  83. package/dist/backend/services/rfq-event-service.d.ts +32 -0
  84. package/dist/backend/services/rfq-event-service.d.ts.map +1 -0
  85. package/dist/backend/services/rfq-event-service.js +28 -0
  86. package/dist/backend/services/rfq-event-service.js.map +1 -0
  87. package/dist/backend/services/rfq-expiry-worker.d.ts +50 -0
  88. package/dist/backend/services/rfq-expiry-worker.d.ts.map +1 -0
  89. package/dist/backend/services/rfq-expiry-worker.js +70 -0
  90. package/dist/backend/services/rfq-expiry-worker.js.map +1 -0
  91. package/dist/backend/services/rfq-notification-service.d.ts +36 -0
  92. package/dist/backend/services/rfq-notification-service.d.ts.map +1 -0
  93. package/dist/backend/services/rfq-notification-service.js +52 -0
  94. package/dist/backend/services/rfq-notification-service.js.map +1 -0
  95. package/dist/backend/services/rfq-revision-service.d.ts +70 -0
  96. package/dist/backend/services/rfq-revision-service.d.ts.map +1 -0
  97. package/dist/backend/services/rfq-revision-service.js +120 -0
  98. package/dist/backend/services/rfq-revision-service.js.map +1 -0
  99. package/dist/backend/services/rfq-service.d.ts +140 -0
  100. package/dist/backend/services/rfq-service.d.ts.map +1 -0
  101. package/dist/backend/services/rfq-service.js +786 -0
  102. package/dist/backend/services/rfq-service.js.map +1 -0
  103. package/dist/backend/services/sales-channel-attributions.d.ts +38 -0
  104. package/dist/backend/services/sales-channel-attributions.d.ts.map +1 -0
  105. package/dist/backend/services/sales-channel-attributions.js +48 -0
  106. package/dist/backend/services/sales-channel-attributions.js.map +1 -0
  107. package/dist/manifest.d.ts +203 -0
  108. package/dist/manifest.d.ts.map +1 -0
  109. package/dist/manifest.js +277 -0
  110. package/dist/manifest.js.map +1 -0
  111. package/dist/migrations/20260424T190112_quote_requests_init.d.ts +19 -0
  112. package/dist/migrations/20260424T190112_quote_requests_init.d.ts.map +1 -0
  113. package/dist/migrations/20260424T190112_quote_requests_init.js +65 -0
  114. package/dist/migrations/20260424T190112_quote_requests_init.js.map +1 -0
  115. package/dist/migrations/20260503T141344_quote_requests_workflow.d.ts +37 -0
  116. package/dist/migrations/20260503T141344_quote_requests_workflow.d.ts.map +1 -0
  117. package/dist/migrations/20260503T141344_quote_requests_workflow.js +251 -0
  118. package/dist/migrations/20260503T141344_quote_requests_workflow.js.map +1 -0
  119. package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.d.ts +10 -0
  120. package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.d.ts.map +1 -0
  121. package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.js +16 -0
  122. package/dist/migrations/20260611T140415_quote_requests_qr_item_packaging.js.map +1 -0
  123. package/dist/migrations/20260611T140417_quote_requests_business_id.d.ts +24 -0
  124. package/dist/migrations/20260611T140417_quote_requests_business_id.d.ts.map +1 -0
  125. package/dist/migrations/20260611T140417_quote_requests_business_id.js +34 -0
  126. package/dist/migrations/20260611T140417_quote_requests_business_id.js.map +1 -0
  127. package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.d.ts +21 -0
  128. package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.d.ts.map +1 -0
  129. package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.js +29 -0
  130. package/dist/migrations/20260617T095510_quote_requests_backfill_admin_created_awaiting.js.map +1 -0
  131. package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.d.ts +12 -0
  132. package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.d.ts.map +1 -0
  133. package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.js +16 -0
  134. package/dist/migrations/20260718T200342_quote_requests_quote_request_custom_field_values.js.map +1 -0
  135. package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.d.ts +34 -0
  136. package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.d.ts.map +1 -0
  137. package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.js +57 -0
  138. package/dist/migrations/20260912T125614_quote_requests_quote_request_channel_attribution.js.map +1 -0
  139. package/dist/migrations/index.d.ts +53 -0
  140. package/dist/migrations/index.d.ts.map +1 -0
  141. package/dist/migrations/index.js +61 -0
  142. package/dist/migrations/index.js.map +1 -0
  143. package/dist/migrations/status-mapping.d.ts +18 -0
  144. package/dist/migrations/status-mapping.d.ts.map +1 -0
  145. package/dist/migrations/status-mapping.js +28 -0
  146. package/dist/migrations/status-mapping.js.map +1 -0
  147. package/docs/quote_requests.md +168 -0
  148. package/i18n/en.json +14 -0
  149. package/i18n/pl.json +14 -0
  150. package/package.json +99 -0
  151. package/tailwind.css +14 -0
@@ -0,0 +1,399 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { useParams } from 'react-router-dom';
4
+ import { CalendarClock, CalendarX, Check, ClipboardList, Copy, FileText, History, PencilLine, XCircle, } from 'lucide-react';
5
+ import { apiClient, ApiError, cn, formatDateTime } from '@endora-commerce/admin-kit/lib';
6
+ import { Alert, AlertDescription, Badge, Button, Card, CardContent, Input, Label, PageHeader, Section, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Textarea } from '@endora-commerce/admin-kit/ui';
7
+ import { CustomFieldValuesPanel, ProductPicker } from '@endora-commerce/admin-kit/components';
8
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
9
+ import { deadlineForDays, isValidityDaysInvalid, rfqValidity } from '../validity.js';
10
+ const TERMINAL = ['Approved', 'Completed', 'Canceled', 'Expired'];
11
+ /**
12
+ * The statuses on which the operator's validity deadline still decides
13
+ * something: the two the customer can still accept a revision from, and the
14
+ * one they can still convert to an order. On a Canceled, Completed or
15
+ * (worker-)Expired request the deadline decides nothing, so saying it lapsed
16
+ * would be crying wolf over a record that is closed for another reason.
17
+ */
18
+ const VALIDITY_MATTERS_ON = ['Pending', 'Created from admin', 'Approved'];
19
+ const STATUS_VARIANT = {
20
+ 'Created from admin': 'warning',
21
+ Pending: 'warning',
22
+ Approved: 'success',
23
+ Completed: 'default',
24
+ Canceled: 'destructive',
25
+ Expired: 'secondary',
26
+ };
27
+ export function RfqDetail() {
28
+ const t = useTranslation('core');
29
+ const { id } = useParams();
30
+ const [rfq, setRfq] = useState(null);
31
+ const [loading, setLoading] = useState(true);
32
+ const [error, setError] = useState(null);
33
+ const [info, setInfo] = useState(null);
34
+ const [cancelReason, setCancelReason] = useState('');
35
+ const [cancelOpen, setCancelOpen] = useState(false);
36
+ const [busy, setBusy] = useState(false);
37
+ const [tab, setTab] = useState('overview');
38
+ // Bumped when the operator takes the "set a new deadline" shortcut out of the
39
+ // lapsed banner, so the Modify tab opens with the deadline field focused
40
+ // rather than at the top of a form the operator then has to scan.
41
+ const [validityFocusNonce, setValidityFocusNonce] = useState(0);
42
+ const refresh = useCallback(async () => {
43
+ if (!id)
44
+ return;
45
+ setLoading(true);
46
+ setError(null);
47
+ try {
48
+ const res = await apiClient.get(`/api/v1/admin/quote-requests/${id}`);
49
+ setRfq(res.data);
50
+ }
51
+ catch (err) {
52
+ setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.error.load'));
53
+ }
54
+ finally {
55
+ setLoading(false);
56
+ }
57
+ }, [id, t]);
58
+ useEffect(() => {
59
+ void refresh();
60
+ }, [refresh]);
61
+ const approve = async () => {
62
+ if (!rfq)
63
+ return;
64
+ setBusy(true);
65
+ setError(null);
66
+ setInfo(null);
67
+ try {
68
+ await apiClient.post(`/api/v1/admin/quote-requests/${rfq.id}/approve`, {}, { headers: { 'If-Match': `"${rfq.version}"` } });
69
+ setInfo(t('rfq.detail.info.approved'));
70
+ await refresh();
71
+ }
72
+ catch (err) {
73
+ setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.error.approve'));
74
+ }
75
+ finally {
76
+ setBusy(false);
77
+ }
78
+ };
79
+ const cancel = async () => {
80
+ if (!rfq)
81
+ return;
82
+ setBusy(true);
83
+ setError(null);
84
+ setInfo(null);
85
+ try {
86
+ const body = cancelReason.trim().length > 0 ? { reason: cancelReason.trim() } : {};
87
+ await apiClient.post(`/api/v1/admin/quote-requests/${rfq.id}/cancel`, body, { headers: { 'If-Match': `"${rfq.version}"` } });
88
+ setInfo(t('rfq.detail.info.canceled'));
89
+ setCancelReason('');
90
+ setCancelOpen(false);
91
+ await refresh();
92
+ }
93
+ catch (err) {
94
+ setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.error.cancel'));
95
+ }
96
+ finally {
97
+ setBusy(false);
98
+ }
99
+ };
100
+ const convert = async () => {
101
+ if (!rfq)
102
+ return;
103
+ setBusy(true);
104
+ setError(null);
105
+ setInfo(null);
106
+ try {
107
+ const res = await apiClient.post(`/api/v1/quote-requests/${rfq.id}/convert-to-order`, {});
108
+ setInfo(t('rfq.detail.convert.success', {
109
+ cartId: res.data.cartId.slice(0, 8),
110
+ url: res.data.checkoutUrl,
111
+ }));
112
+ }
113
+ catch (err) {
114
+ setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.convert.error'));
115
+ }
116
+ finally {
117
+ setBusy(false);
118
+ }
119
+ };
120
+ const copyId = useCallback(async () => {
121
+ if (!rfq)
122
+ return;
123
+ const ref = rfq.businessId ?? rfq.id;
124
+ try {
125
+ await navigator.clipboard.writeText(ref);
126
+ setInfo(t('rfq.detail.copied', { id: ref }));
127
+ }
128
+ catch {
129
+ setError(t('rfq.detail.copyError'));
130
+ }
131
+ }, [rfq, t]);
132
+ if (loading)
133
+ return _jsx("p", { className: "text-sm text-muted-foreground", children: t('rfq.detail.loading') });
134
+ if (!rfq)
135
+ return (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error ?? t('rfq.detail.notFound') }) }));
136
+ const displayId = rfq.businessId ?? rfq.id.slice(0, 8);
137
+ const isTerminal = TERMINAL.includes(rfq.status);
138
+ const total = rfq.items.every((it) => it.agreedUnitPrice !== null)
139
+ ? rfq.items.reduce((s, it) => s + (it.agreedUnitPrice ?? 0) * it.quantity, 0)
140
+ : null;
141
+ const currency = rfq.items[0]?.lineCurrency ?? 'PLN';
142
+ // Quote prices are net; surface VAT + gross so the total matches the order
143
+ // it converts into. `rfq.taxRate` is the flat rate resolved server-side.
144
+ const taxRate = rfq.taxRate ?? 0;
145
+ const taxTotal = total !== null ? total * taxRate : null;
146
+ const grossTotal = total !== null && taxTotal !== null ? total + taxTotal : null;
147
+ // The operator's validity deadline, read once per render against the same
148
+ // clock every branch below uses.
149
+ const validity = rfqValidity(rfq.expiresAt, new Date());
150
+ const validityLapsed = validity.kind === 'lapsed' && VALIDITY_MATTERS_ON.includes(rfq.status);
151
+ // `modify` is the only operation that writes `expiresAt`, and it refuses any
152
+ // status but these two — so on an Approved request the deadline can no
153
+ // longer be moved at all, and the banner says so instead of pointing at a
154
+ // tab that is not rendered.
155
+ const validityReDatable = rfq.status === 'Pending' || rfq.status === 'Created from admin';
156
+ const openValidityEditor = () => {
157
+ setTab('modify');
158
+ setValidityFocusNonce((n) => n + 1);
159
+ };
160
+ // Action buttons live in the PageHeader's top-right slot — mirroring the
161
+ // Order detail view — rather than in an in-body status row.
162
+ //
163
+ // Both are disabled past the deadline, because both can now only answer 410:
164
+ // convert-to-order is refused outright, and approving moves a lapsed request
165
+ // into `Approved`, which `modify` refuses — so the deadline could never be
166
+ // moved afterwards and the quote would be unusable by either party. The
167
+ // banner below carries the reason and the remedy; a disabled button cannot.
168
+ const headerActions = [];
169
+ if (rfq.status === 'Pending') {
170
+ headerActions.push(_jsxs(Button, { variant: "outline", size: "sm", className: "bg-card", onClick: () => void approve(), disabled: busy || validityLapsed, children: [_jsx(Check, {}), t('rfq.detail.approve')] }, "approve"));
171
+ }
172
+ if (rfq.status === 'Approved') {
173
+ headerActions.push(_jsxs(Button, { variant: "outline", size: "sm", className: "bg-card", onClick: () => void convert(), disabled: busy || validityLapsed, children: [_jsx(FileText, {}), t('rfq.detail.convert.placeOrder')] }, "convert"));
174
+ }
175
+ if (!isTerminal) {
176
+ headerActions.push(_jsxs(Button, { variant: "outline", size: "sm", className: "bg-card border-destructive/40 text-destructive hover:bg-destructive/10", onClick: () => setCancelOpen(true), disabled: busy, children: [_jsx(XCircle, {}), t('rfq.detail.cancelRfq')] }, "cancel"));
177
+ }
178
+ return (_jsxs(_Fragment, { children: [_jsx(PageHeader, { back: { label: t('rfq.list.title'), to: '/quote-requests' }, title: _jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => void copyId(), title: t('rfq.detail.copyHint'), className: "inline-flex items-center gap-1.5 hover:opacity-80", children: [t('rfq.detail.title', { id: displayId }), _jsx(Copy, { className: "size-3.5 opacity-60" })] }), _jsx(Badge, { variant: STATUS_VARIANT[rfq.status], className: "text-xs font-medium", children: rfq.status }), rfq.awaitingCustomerRevisionAcceptance ? (_jsx(Badge, { variant: "warning", className: "text-xs font-medium", children: t('rfq.detail.badge.awaitingRevision') })) : null, validityLapsed ? (_jsxs(Badge, { variant: "destructive", className: "gap-1 text-xs font-medium", children: [_jsx(CalendarX, { className: "size-3", "aria-hidden": "true" }), t('rfq.detail.badge.validityEnded')] })) : null] }), description: _jsxs("span", { children: [t('rfq.detail.meta.created', { date: formatDateTime(rfq.createdAt) }), rfq.submittedAt
179
+ ? ` · ${t('rfq.detail.meta.submitted', { date: formatDateTime(rfq.submittedAt) })}`
180
+ : '', rfq.expiredAt
181
+ ? ` · ${t('rfq.detail.meta.expired', { date: formatDateTime(rfq.expiredAt) })}`
182
+ : validity.kind === 'active'
183
+ ? ` · ${t('rfq.detail.meta.expires', { date: formatDateTime(validity.expiresAt) })}`
184
+ : validity.kind === 'lapsed'
185
+ ? ` · ${t('rfq.detail.meta.validityEnded', { date: formatDateTime(validity.expiresAt) })}`
186
+ : '', ' ', _jsxs("code", { className: "font-mono text-xs", children: ["(", rfq.id, ")"] })] }), actions: headerActions.length > 0 ? headerActions : null }), error ? (_jsx(Alert, { variant: "destructive", className: "mb-4", children: _jsx(AlertDescription, { children: error }) })) : null, info ? (_jsx(Alert, { variant: "success", className: "mb-4", children: _jsx(AlertDescription, { children: info }) })) : null, rfq.cancellationReason ? (_jsx(Alert, { variant: "destructive", className: "mb-4", children: _jsx(AlertDescription, { children: t('rfq.detail.badge.cancelReason', { reason: rfq.cancellationReason }) }) })) : null, validityLapsed && validity.kind === 'lapsed' ? (_jsxs(Alert, { variant: "warning", className: "mb-4", children: [_jsx(CalendarX, { className: "size-4", "aria-hidden": "true" }), _jsxs(AlertDescription, { children: [_jsx("p", { className: "font-medium", children: t('rfq.detail.validity.lapsed.headline', {
187
+ date: formatDateTime(validity.expiresAt),
188
+ }) }), _jsx("p", { className: "mt-1", children: validityReDatable
189
+ ? t('rfq.detail.validity.lapsed.remedyEditable')
190
+ : t('rfq.detail.validity.lapsed.remedyLocked') }), validityReDatable ? (_jsxs(Button, { variant: "outline", size: "sm", className: "mt-3 bg-card", onClick: openValidityEditor, children: [_jsx(CalendarClock, {}), t('rfq.detail.validity.lapsed.setNewDeadline')] })) : null] })] })) : null, _jsxs(Card, { className: cn('mb-4', tab !== 'modify' && 'overflow-hidden'), children: [_jsx("div", { style: { padding: '4px 4px 0', overflow: 'hidden' }, children: _jsx("div", { className: "b2b-tabs-scroll", children: _jsxs("div", { className: "b2b-tabs", role: "tablist", children: [_jsx(TabBtn, { id: "overview", label: t('rfq.detail.tabs.overview'), icon: _jsx(ClipboardList, { size: 14 }), active: tab, onChange: setTab }), !isTerminal ? (_jsx(TabBtn, { id: "modify", label: t('rfq.detail.tabs.modify'), icon: _jsx(PencilLine, { size: 14 }), active: tab, onChange: setTab })) : null, _jsx(TabBtn, { id: "history", label: t('rfq.detail.tabs.history'), icon: _jsx(History, { size: 14 }), active: tab, onChange: setTab })] }) }) }), _jsxs(CardContent, { className: "divide-y divide-border pt-6 [&>*]:py-6 [&>*:first-child]:pt-0 [&>*:last-child]:pb-0", children: [tab === 'overview' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [_jsx(Section, { title: t('rfq.detail.sections.organization'), children: rfq.organization ? (_jsxs("div", { className: "space-y-1 text-sm", children: [_jsx("p", { className: "font-medium", children: rfq.organization.name }), rfq.organization.legalName &&
191
+ rfq.organization.legalName !== rfq.organization.name ? (_jsx("p", { className: "text-muted-foreground", children: rfq.organization.legalName })) : null, _jsxs("p", { className: "text-muted-foreground", children: [t('rfq.detail.org.taxId'), ": ", _jsx("strong", { children: rfq.organization.taxId })] }), _jsxs("p", { className: "text-muted-foreground", children: [t('rfq.detail.org.vat'), ":", ' ', t(`rfq.detail.vatStatus.${rfq.organization.vatStatus}`)] })] })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: _jsx("code", { className: "font-mono text-xs", children: rfq.organizationId }) })) }), _jsx(Section, { title: t('rfq.detail.sections.customer'), children: rfq.customer ? (_jsxs("div", { className: "space-y-1 text-sm", children: [_jsx("p", { className: "font-medium", children: `${rfq.customer.firstName ?? ''} ${rfq.customer.lastName ?? ''}`.trim() ||
192
+ rfq.customer.email }), _jsx("p", { className: "text-muted-foreground", children: _jsx("a", { className: "underline underline-offset-2", href: `mailto:${rfq.customer.email}`, children: rfq.customer.email }) })] })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: _jsx("code", { className: "font-mono text-xs", children: rfq.customerAccountId }) })) })] }), rfq.headerNote ? (_jsx(Section, { title: t('rfq.detail.sections.buyerNote'), children: _jsx("p", { className: "text-sm", children: rfq.headerNote }) })) : null, _jsx(Section, { title: t('rfq.detail.sections.items'), children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('rfq.detail.column.product') }), _jsx(TableHead, { children: t('rfq.detail.column.qty') }), _jsx(TableHead, { children: t('rfq.detail.column.desired') }), _jsx(TableHead, { children: t('rfq.detail.column.agreed') }), _jsx(TableHead, { className: "text-right", children: t('rfq.detail.column.lineTotal') })] }) }), _jsx(TableBody, { children: rfq.items.map((it) => {
193
+ const lineTotal = it.agreedUnitPrice !== null
194
+ ? it.agreedUnitPrice * it.quantity
195
+ : it.desiredUnitPrice !== null
196
+ ? it.desiredUnitPrice * it.quantity
197
+ : null;
198
+ return (_jsxs(TableRow, { children: [_jsxs(TableCell, { children: [_jsx("strong", { children: it.productName }), it.variantLabel ? _jsxs("small", { children: [" (", it.variantLabel, ")"] }) : null, it.lineNote ? (_jsx("div", { className: "text-xs text-muted-foreground", children: it.lineNote })) : null] }), _jsx(TableCell, { children: it.quantity }), _jsx(TableCell, { className: "tabular-nums", children: it.desiredUnitPrice !== null ? it.desiredUnitPrice.toFixed(2) : '—' }), _jsx(TableCell, { className: "tabular-nums", children: it.agreedUnitPrice !== null ? it.agreedUnitPrice.toFixed(2) : '—' }), _jsx(TableCell, { className: "tabular-nums text-right", children: lineTotal !== null
199
+ ? `${lineTotal.toLocaleString('pl-PL', { minimumFractionDigits: 2 })} ${it.lineCurrency}`
200
+ : '—' })] }, it.id));
201
+ }) }), total !== null ? (_jsxs("tfoot", { className: "border-t [&_td]:p-2 [&_th]:p-2", children: [taxRate > 0 ? (_jsxs(_Fragment, { children: [_jsxs("tr", { children: [_jsx("th", { colSpan: 4, className: "text-right", children: t('rfq.detail.netLabel') }), _jsxs("td", { className: "tabular-nums text-right", children: [total.toLocaleString('pl-PL', { minimumFractionDigits: 2 }), " ", currency] })] }), _jsxs("tr", { children: [_jsx("th", { colSpan: 4, className: "text-right", children: t('rfq.detail.taxLabel', { rate: (taxRate * 100).toFixed(0) }) }), _jsxs("td", { className: "tabular-nums text-right", children: [(taxTotal ?? 0).toLocaleString('pl-PL', { minimumFractionDigits: 2 }), ' ', currency] })] })] })) : null, _jsxs("tr", { children: [_jsx("th", { colSpan: 4, className: "text-right font-semibold", children: taxRate > 0 ? t('rfq.detail.grossLabel') : t('rfq.detail.totalLabel') }), _jsxs("td", { className: "tabular-nums text-right font-semibold", children: [(grossTotal ?? total).toLocaleString('pl-PL', {
202
+ minimumFractionDigits: 2,
203
+ }), ' ', currency] })] })] })) : null] }) }), !isTerminal ? (_jsx(CustomFieldValuesPanel, { entityType: "quote_request", values: rfq.customFieldValues ?? {}, save: async (values) => {
204
+ await apiClient.patch(`/api/v1/admin/quote-requests/${rfq.id}`, { customFieldValues: values }, { headers: { 'If-Match': `"${rfq.version}"` } });
205
+ await refresh();
206
+ } })) : null] })) : null, tab === 'modify' && !isTerminal ? (_jsx(ModifyCard, { rfq: rfq, onSaved: refresh, setError: setError, setInfo: setInfo, focusValidityNonce: validityFocusNonce })) : null, tab === 'history' ? (_jsx(Section, { title: t('rfq.detail.history.title'), children: rfq.events.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('rfq.detail.history.empty') })) : (_jsx("ul", { className: "space-y-2", children: rfq.events.map((e) => (_jsxs("li", { className: "rounded-md border p-3 text-sm", children: [_jsxs("div", { className: "mb-1 flex items-center gap-2 text-xs text-muted-foreground", children: [_jsx("span", { children: formatDateTime(e.createdAt) }), e.actorRoleLabel ? _jsxs("span", { children: ["\u00B7 ", e.actorRoleLabel] }) : null] }), _jsx("p", { className: "font-medium", children: e.eventType })] }, e.id))) })) })) : null] })] }), cancelOpen ? (_jsx(CancelDialog, { reason: cancelReason, onReasonChange: setCancelReason, onConfirm: () => void cancel(), onClose: () => setCancelOpen(false), busy: busy })) : null] }));
207
+ }
208
+ /**
209
+ * Cancellation modal — captures the (optional) cancellation reason on an
210
+ * overlay rather than stretching the status row, then confirms the cancel.
211
+ */
212
+ function CancelDialog(props) {
213
+ const t = useTranslation('core');
214
+ return (_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4", role: "dialog", "aria-modal": "true", onClick: props.onClose, children: _jsxs("div", { className: "w-full max-w-md rounded-lg border bg-card p-5 shadow-lg", onClick: (e) => e.stopPropagation(), children: [_jsx("h2", { className: "mb-3 text-base font-semibold", children: t('rfq.detail.cancelDialog.title') }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "cancel-reason", children: t('rfq.detail.cancelReason') }), _jsx(Textarea, { id: "cancel-reason", autoFocus: true, value: props.reason, onChange: (e) => props.onReasonChange(e.target.value), placeholder: t('rfq.detail.cancelReasonPlaceholder'), rows: 3 })] }), _jsxs("div", { className: "mt-4 flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: props.onClose, disabled: props.busy, children: t('rfq.detail.cancelDialog.dismiss') }), _jsxs(Button, { variant: "destructive", onClick: props.onConfirm, disabled: props.busy, children: [_jsx(XCircle, { size: 14, className: "mr-1" }), " ", t('rfq.detail.cancelDialog.confirm')] })] })] }) }));
215
+ }
216
+ function TabBtn(props) {
217
+ return (_jsxs("button", { type: "button", role: "tab", "aria-selected": props.active === props.id, className: cn('b2b-tab', props.active === props.id && 'is-active'), onClick: () => props.onChange(props.id), children: [props.icon, props.label] }));
218
+ }
219
+ /**
220
+ * Resolves a product's current price-list unit price (sale price preferred,
221
+ * else base) via the canonical resolver. Used to prefill the agreed unit price
222
+ * so the operator starts from the price-list value and only edits the
223
+ * negotiated delta. Returns null when no price is published for the product.
224
+ */
225
+ async function resolvePriceListPrice(productId) {
226
+ try {
227
+ const res = await apiClient.get(`/api/v1/storefront/products/${productId}/resolved-price`);
228
+ const resolved = res.data.resolvedPrice;
229
+ const raw = resolved.salePrice?.amount ?? resolved.basePrice?.amount ?? null;
230
+ if (raw === null)
231
+ return null;
232
+ const n = Number(raw);
233
+ return Number.isFinite(n) ? n : null;
234
+ }
235
+ catch {
236
+ return null;
237
+ }
238
+ }
239
+ function ModifyCard({ rfq, onSaved, setError, setInfo, focusValidityNonce, }) {
240
+ const t = useTranslation('core');
241
+ const [headerNote, setHeaderNote] = useState(rfq.headerNote ?? '');
242
+ // Blank means "leave the deadline where it is" — that is `expiresInDays`
243
+ // being absent from the PATCH, which is what the contract reads as "do not
244
+ // touch it". It is never prefilled: `expiresInDays` counts from *now*, so
245
+ // any number put here on the operator's behalf would be this screen choosing
246
+ // a date the customer is then held to.
247
+ const [expiresInDays, setExpiresInDays] = useState('');
248
+ const validityInputRef = useRef(null);
249
+ const [lines, setLines] = useState(rfq.items.map((it) => {
250
+ // Open on the request's current state: start the agreed price from the
251
+ // price already defined in the quote request — the agreed price if the
252
+ // operator set one, otherwise the customer's desired price — so the
253
+ // modification is a delta on the existing offer, not a blank slate.
254
+ const definedPrice = it.agreedUnitPrice ?? it.desiredUnitPrice;
255
+ return {
256
+ productId: it.productId,
257
+ quantity: String(it.quantity),
258
+ agreedUnitPrice: definedPrice !== null ? definedPrice.toFixed(2) : '',
259
+ };
260
+ }));
261
+ const [busy, setBusy] = useState(false);
262
+ // Prefill an empty "agreed unit price" with the product's price-list price so
263
+ // the operator starts from the catalogue value and only edits the negotiated
264
+ // delta. Never clobbers a value already present (an existing agreed price, or
265
+ // one the operator just typed).
266
+ const prefillAgreed = useCallback((idx, productId) => {
267
+ void resolvePriceListPrice(productId).then((price) => {
268
+ if (price === null)
269
+ return;
270
+ setLines((prev) => prev.map((l, i) => i === idx && l.productId === productId && l.agreedUnitPrice.trim() === ''
271
+ ? { ...l, agreedUnitPrice: price.toFixed(2) }
272
+ : l));
273
+ });
274
+ }, []);
275
+ // On mount, fall back to the catalogue price only for lines where the request
276
+ // itself defines no price (neither agreed nor desired). Lines that already
277
+ // carry a request-defined price keep it as the modification's starting point.
278
+ useEffect(() => {
279
+ rfq.items.forEach((it, idx) => {
280
+ if (it.productId && it.agreedUnitPrice === null && it.desiredUnitPrice === null) {
281
+ prefillAgreed(idx, it.productId);
282
+ }
283
+ });
284
+ // eslint-disable-next-line react-hooks/exhaustive-deps
285
+ }, []);
286
+ // Land the caret on the deadline field when the operator arrived here from
287
+ // the lapsed banner: the remedy they asked for is the one control they
288
+ // should not have to hunt for in this form (Fitts's Law).
289
+ useEffect(() => {
290
+ if (focusValidityNonce > 0)
291
+ validityInputRef.current?.focus();
292
+ }, [focusValidityNonce]);
293
+ const save = async () => {
294
+ setBusy(true);
295
+ setError(null);
296
+ setInfo(null);
297
+ try {
298
+ const items = lines
299
+ .filter((l) => l.productId.trim().length > 0 && Number(l.quantity) > 0)
300
+ .map((l) => ({
301
+ productId: l.productId.trim(),
302
+ quantity: Number(l.quantity),
303
+ ...(l.agreedUnitPrice.trim().length > 0
304
+ ? { agreedUnitPrice: Number(l.agreedUnitPrice) }
305
+ : {}),
306
+ }));
307
+ if (items.length === 0) {
308
+ setError(t('rfq.detail.modify.error.atLeastOneLine'));
309
+ setBusy(false);
310
+ return;
311
+ }
312
+ // A deadline the contract would refuse is refused here rather than
313
+ // dropped from the payload: an operator who typed a number and got no
314
+ // deadline would have been told nothing.
315
+ const typedDays = expiresInDays.trim();
316
+ if (isValidityDaysInvalid(typedDays, new Date())) {
317
+ setError(t('rfq.detail.validity.error.days'));
318
+ setBusy(false);
319
+ validityInputRef.current?.focus();
320
+ return;
321
+ }
322
+ await apiClient.patch(`/api/v1/admin/quote-requests/${rfq.id}`, {
323
+ headerNote: headerNote.trim().length > 0 ? headerNote.trim() : null,
324
+ items,
325
+ // Absent means "leave the deadline as it is" — the same shape
326
+ // `RfqCreatePage` sends, and what `adminPatchQuoteRequestSchema`
327
+ // reads as untouched.
328
+ ...(typedDays !== '' ? { expiresInDays: Number(typedDays) } : {}),
329
+ }, { headers: { 'If-Match': `"${rfq.version}"` } });
330
+ setInfo(t('rfq.detail.modify.info.saved'));
331
+ await onSaved();
332
+ }
333
+ catch (err) {
334
+ setError(err instanceof ApiError ? err.envelope.error.message : t('rfq.detail.modify.error.save'));
335
+ }
336
+ finally {
337
+ setBusy(false);
338
+ }
339
+ };
340
+ const updateLine = (idx, patch) => {
341
+ setLines((prev) => prev.map((l, i) => (i === idx ? { ...l, ...patch } : l)));
342
+ };
343
+ // Reference data from the current revision: the customer's desired unit price
344
+ // and the line currency, keyed by product so each modify row can show a price
345
+ // even before an agreed price is typed.
346
+ const originalByProduct = new Map(rfq.items.map((it) => [it.productId, it]));
347
+ const currency = rfq.items[0]?.lineCurrency ?? 'PLN';
348
+ const fmt = (n) => `${n.toLocaleString('pl-PL', { minimumFractionDigits: 2 })} ${currency}`;
349
+ // A plain grid (not <Table>, which wraps in an overflow-auto container that
350
+ // would clip the product dropdown) so the picker's options overlay outside
351
+ // the row instead of being trapped inside it. The fixed-width columns only
352
+ // engage at md+ (where the header is visible); on narrower widths the row
353
+ // stacks so the trailing actions column can't overflow and break the layout.
354
+ const gridCols = 'md:grid-cols-[minmax(200px,1fr)_96px_140px_130px_140px_auto]';
355
+ // The deadline field's answers, all about the same date: what saving would
356
+ // set, or — while the field is blank — what leaving it blank keeps. "Blank"
357
+ // and "no deadline" are two of those answers and must not read as one.
358
+ const now = new Date();
359
+ const currentValidity = rfqValidity(rfq.expiresAt, now);
360
+ const typedDays = expiresInDays.trim();
361
+ const previewDeadline = deadlineForDays(expiresInDays, now);
362
+ const daysInvalid = isValidityDaysInvalid(expiresInDays, now);
363
+ const validityHelp = daysInvalid
364
+ ? t('rfq.detail.validity.error.days')
365
+ : previewDeadline !== null
366
+ ? t(Number(typedDays) === 0
367
+ ? 'rfq.detail.validity.help.previewImmediate'
368
+ : 'rfq.detail.validity.help.preview', { date: formatDateTime(previewDeadline.toISOString()) })
369
+ : currentValidity.kind === 'none'
370
+ ? t('rfq.detail.validity.help.keepNone')
371
+ : t(currentValidity.kind === 'active'
372
+ ? 'rfq.detail.validity.help.keepActive'
373
+ : 'rfq.detail.validity.help.keepLapsed', { date: formatDateTime(currentValidity.expiresAt) });
374
+ return (_jsx(Section, { title: t('rfq.detail.modify.title'), children: _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "modify-note", children: t('rfq.detail.modify.headerNote') }), _jsx(Textarea, { id: "modify-note", value: headerNote, onChange: (e) => setHeaderNote(e.target.value), rows: 2 })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: "modify-expires-in-days", className: "flex items-center gap-1.5", children: [_jsx(CalendarClock, { className: "size-3.5 opacity-70", "aria-hidden": "true" }), t('rfq.detail.validity.field')] }), _jsx(Input, { id: "modify-expires-in-days", ref: validityInputRef, type: "number", min: 0, step: 1, inputMode: "numeric", className: "w-40 tabular-nums", value: expiresInDays, placeholder: t('rfq.detail.validity.placeholder'), "aria-describedby": "modify-expires-in-days-help", "aria-invalid": daysInvalid || undefined, onChange: (e) => setExpiresInDays(e.target.value) }), _jsx("p", { id: "modify-expires-in-days-help", className: cn('text-xs', daysInvalid ? 'text-destructive' : 'text-muted-foreground'), children: validityHelp })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: cn('hidden gap-3 px-1 text-xs font-medium text-muted-foreground md:grid', gridCols), children: [_jsx("span", { children: t('rfq.detail.modify.productId') }), _jsx("span", { children: t('rfq.detail.modify.quantity') }), _jsx("span", { children: t('rfq.detail.modify.agreedUnitPrice') }), _jsx("span", { children: t('rfq.detail.modify.desiredPrice') }), _jsx("span", { children: t('rfq.detail.modify.lineTotal') }), _jsx("span", {})] }), lines.map((l, i) => {
375
+ const orig = l.productId ? originalByProduct.get(l.productId) : undefined;
376
+ const desired = orig?.desiredUnitPrice ?? null;
377
+ const qtyNum = Number(l.quantity);
378
+ const agreedNum = Number(l.agreedUnitPrice);
379
+ const lineTotal = l.agreedUnitPrice.trim().length > 0 && Number.isFinite(agreedNum) && qtyNum > 0
380
+ ? agreedNum * qtyNum
381
+ : desired !== null && qtyNum > 0
382
+ ? desired * qtyNum
383
+ : null;
384
+ return (_jsxs("div", { className: cn('grid grid-cols-1 items-center gap-3', gridCols), children: [_jsx(ProductPicker, { mode: "select", value: l.productId || null, onChange: (v) => {
385
+ // Switching products invalidates any prior agreed price; clear
386
+ // it and let the price-list value prefill for the new product.
387
+ updateLine(i, { productId: v ?? '', agreedUnitPrice: '' });
388
+ if (v)
389
+ prefillAgreed(i, v);
390
+ } }), _jsx(Input, { type: "number", min: 1, "aria-label": t('rfq.detail.modify.quantity'), value: l.quantity, onChange: (e) => updateLine(i, { quantity: e.target.value }), className: "tabular-nums" }), _jsx(Input, { type: "number", step: "0.01", min: 0, "aria-label": t('rfq.detail.modify.agreedUnitPrice'), value: l.agreedUnitPrice, onChange: (e) => updateLine(i, { agreedUnitPrice: e.target.value }), className: "tabular-nums" }), _jsx("span", { className: "self-center text-sm tabular-nums text-muted-foreground", children: desired !== null ? fmt(desired) : '—' }), _jsx("span", { className: "self-center text-sm font-medium tabular-nums", children: lineTotal !== null ? fmt(lineTotal) : '—' }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setLines((prev) => prev.filter((_, j) => j !== i)), children: t('rfq.detail.modify.remove') })] }, i));
391
+ })] }), _jsx("div", { className: "flex gap-2", children: _jsx(Button, { variant: "outline", size: "sm", onClick: () => setLines((prev) => [...prev, { productId: '', quantity: '1', agreedUnitPrice: '' }]), children: t('rfq.detail.modify.addLine') }) }), _jsx("div", { children: _jsx(Button, { onClick: () => void save(), disabled: busy, children: t('rfq.detail.modify.saveRevision') }) })] }) }));
392
+ }
393
+ /**
394
+ * The registry loads a route component through a dynamic-import factory and
395
+ * reads its default export (feature 091, FR-013). The named export stays: it is
396
+ * the spelling this module's own code and its tests use.
397
+ */
398
+ export default RfqDetail;
399
+ //# sourceMappingURL=RfqDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RfqDetail.js","sourceRoot":"","sources":["../../../src/admin/pages/RfqDetail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function RfqList(): ReactNode;
3
+ /**
4
+ * The registry loads a route component through a dynamic-import factory and
5
+ * reads its default export (feature 091, FR-013). The named export stays: it is
6
+ * the spelling this module's own code and its tests use.
7
+ */
8
+ export default RfqList;
9
+ //# sourceMappingURL=RfqList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RfqList.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/RfqList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA2FlF,wBAAgB,OAAO,IAAI,SAAS,CA2WnC;AAED;;;;GAIG;AACH,eAAe,OAAO,CAAC"}