@openrails/billing-ui 0.242.0 → 0.243.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 (260) hide show
  1. package/CHANGELOG.md +27 -11
  2. package/README.md +41 -8
  3. package/dist/admin/billing-admin.d.ts +3 -0
  4. package/dist/admin/components/app-sidebar.d.ts +1 -0
  5. package/dist/admin/components/confirm.d.ts +4 -0
  6. package/dist/admin/components/cursor-pager.d.ts +8 -0
  7. package/dist/admin/components/data-table.d.ts +14 -0
  8. package/dist/admin/components/fact-card.d.ts +5 -0
  9. package/dist/admin/components/form-field-errors.d.ts +3 -0
  10. package/dist/admin/components/linked-table-row.d.ts +5 -0
  11. package/dist/admin/components/logo.d.ts +3 -0
  12. package/dist/admin/components/no-access.d.ts +3 -0
  13. package/dist/admin/components/no-merchants.d.ts +1 -0
  14. package/dist/admin/components/notification-bell.d.ts +2 -0
  15. package/dist/admin/components/route-error.d.ts +3 -0
  16. package/dist/admin/components/site-header.d.ts +9 -0
  17. package/dist/admin/components/status-badge.d.ts +3 -0
  18. package/dist/admin/components/typed-confirm-dialog.d.ts +11 -0
  19. package/dist/admin/components/ui/alert-dialog.d.ts +18 -0
  20. package/dist/admin/components/ui/avatar.d.ts +11 -0
  21. package/dist/admin/components/ui/badge.d.ts +7 -0
  22. package/dist/admin/components/ui/breadcrumb.d.ts +10 -0
  23. package/dist/admin/components/ui/button.d.ts +8 -0
  24. package/dist/admin/components/ui/card.d.ts +11 -0
  25. package/dist/admin/components/ui/chart.d.ts +44 -0
  26. package/dist/admin/components/ui/dialog.d.ts +17 -0
  27. package/dist/admin/components/ui/dropdown-menu.d.ts +29 -0
  28. package/dist/admin/components/ui/input.d.ts +3 -0
  29. package/dist/admin/components/ui/label.d.ts +3 -0
  30. package/dist/admin/components/ui/select.d.ts +15 -0
  31. package/dist/admin/components/ui/separator.d.ts +3 -0
  32. package/dist/admin/components/ui/sheet.d.ts +14 -0
  33. package/dist/admin/components/ui/sidebar.d.ts +63 -0
  34. package/dist/admin/components/ui/skeleton.d.ts +2 -0
  35. package/dist/admin/components/ui/sonner.d.ts +3 -0
  36. package/dist/admin/components/ui/switch.d.ts +5 -0
  37. package/dist/admin/components/ui/table.d.ts +10 -0
  38. package/dist/admin/components/ui/tabs.d.ts +10 -0
  39. package/dist/admin/components/ui/textarea.d.ts +3 -0
  40. package/dist/admin/components/ui/tooltip.d.ts +6 -0
  41. package/dist/admin/context.d.ts +1193 -0
  42. package/dist/admin/hooks/use-mobile.d.ts +1 -0
  43. package/dist/admin/index.d.ts +5 -0
  44. package/dist/admin/layouts/app-layout.d.ts +4 -0
  45. package/dist/admin/lib/api/client.d.ts +64 -0
  46. package/dist/admin/lib/api/copilot.d.ts +6 -0
  47. package/dist/admin/lib/api/credit-endpoints.d.ts +8 -0
  48. package/dist/admin/lib/api/credit-types.d.ts +9 -0
  49. package/dist/admin/lib/api/endpoints.d.ts +133 -0
  50. package/dist/admin/lib/api/index.d.ts +89 -0
  51. package/dist/admin/lib/api/invoice-profile-endpoints.d.ts +6 -0
  52. package/dist/admin/lib/api/metrics.d.ts +68 -0
  53. package/dist/admin/lib/api/order-endpoints.d.ts +21 -0
  54. package/dist/admin/lib/api/types.d.ts +122 -0
  55. package/dist/admin/lib/auth.d.ts +6 -0
  56. package/dist/admin/lib/capabilities.d.ts +13 -0
  57. package/dist/admin/lib/chunk-error.d.ts +1 -0
  58. package/dist/admin/lib/confirm.d.ts +11 -0
  59. package/dist/admin/lib/credit-queries.d.ts +23 -0
  60. package/dist/admin/lib/csv.d.ts +3 -0
  61. package/dist/admin/lib/cursor-pages.d.ts +13 -0
  62. package/dist/admin/lib/dialog-width.d.ts +6 -0
  63. package/dist/admin/lib/dom.d.ts +1 -0
  64. package/dist/admin/lib/duration.d.ts +3 -0
  65. package/dist/admin/lib/format.d.ts +23 -0
  66. package/dist/admin/lib/mount.d.ts +6 -0
  67. package/dist/admin/lib/mutations.d.ts +125 -0
  68. package/dist/admin/lib/order-queries.d.ts +29 -0
  69. package/dist/admin/lib/queries.d.ts +369 -0
  70. package/dist/admin/lib/query-client.d.ts +3 -0
  71. package/dist/admin/lib/toast.d.ts +10 -0
  72. package/dist/admin/lib/utils.d.ts +2 -0
  73. package/dist/admin/messages.d.ts +670 -0
  74. package/dist/admin/navigation.d.ts +14 -0
  75. package/dist/admin/pages/catalog/application-dialog.d.ts +2 -0
  76. package/dist/admin/pages/catalog/copilot-panel.d.ts +4 -0
  77. package/dist/admin/pages/catalog/index.d.ts +4 -0
  78. package/dist/admin/pages/catalog/meter-form.d.ts +6 -0
  79. package/dist/admin/pages/catalog/metering-model.d.ts +67 -0
  80. package/dist/admin/pages/catalog/metering.d.ts +3 -0
  81. package/dist/admin/pages/catalog/price-detail.d.ts +2 -0
  82. package/dist/admin/pages/catalog/price-format.d.ts +3 -0
  83. package/dist/admin/pages/catalog/price-wizard-logic.d.ts +20 -0
  84. package/dist/admin/pages/catalog/price-wizard.d.ts +10 -0
  85. package/dist/admin/pages/catalog/psp-links.d.ts +10 -0
  86. package/dist/admin/pages/catalog/rate-card-editor.d.ts +10 -0
  87. package/dist/admin/pages/customers/credit-form.d.ts +14 -0
  88. package/dist/admin/pages/customers/credits.d.ts +5 -0
  89. package/dist/admin/pages/customers/default-card-badges.d.ts +3 -0
  90. package/dist/admin/pages/customers/detail.d.ts +5 -0
  91. package/dist/admin/pages/customers/grant-duration.d.ts +32 -0
  92. package/dist/admin/pages/customers/index.d.ts +2 -0
  93. package/dist/admin/pages/customers/invoice-profile-model.d.ts +18 -0
  94. package/dist/admin/pages/customers/invoice-profile.d.ts +9 -0
  95. package/dist/admin/pages/dashboard/index.d.ts +2 -0
  96. package/dist/admin/pages/dashboard/lib.d.ts +48 -0
  97. package/dist/admin/pages/dashboard/range-picker.d.ts +1 -0
  98. package/dist/admin/pages/dashboard/range.d.ts +34 -0
  99. package/dist/admin/pages/dashboard/reports-model.d.ts +29 -0
  100. package/dist/admin/pages/dashboard/reports.d.ts +2 -0
  101. package/dist/admin/pages/dashboard/use-range.d.ts +5 -0
  102. package/dist/admin/pages/dashboard/widget-editor.d.ts +8 -0
  103. package/dist/admin/pages/dashboard/widget-tile.d.ts +9 -0
  104. package/dist/admin/pages/dashboard/widget-viz.d.ts +12 -0
  105. package/dist/admin/pages/ops/index.d.ts +2 -0
  106. package/dist/admin/pages/orders/detail.d.ts +5 -0
  107. package/dist/admin/pages/orders/index.d.ts +1 -0
  108. package/dist/admin/pages/orders/model.d.ts +7 -0
  109. package/dist/admin/pages/payments/attempts.d.ts +7 -0
  110. package/dist/admin/pages/payments/detail.d.ts +2 -0
  111. package/dist/admin/pages/payments/health-model.d.ts +149 -0
  112. package/dist/admin/pages/payments/health.d.ts +2 -0
  113. package/dist/admin/pages/payments/index.d.ts +2 -0
  114. package/dist/admin/pages/settings/configuration-edit.d.ts +9 -0
  115. package/dist/admin/pages/settings/index.d.ts +9 -0
  116. package/dist/admin/pages/settings/notifications.d.ts +2 -0
  117. package/dist/admin/pages/settings/setting-fields.d.ts +20 -0
  118. package/dist/admin/pages/subscriptions/change-subscription-dialog.d.ts +16 -0
  119. package/dist/admin/pages/subscriptions/detail.d.ts +2 -0
  120. package/dist/admin/pages/subscriptions/dunning.d.ts +2 -0
  121. package/dist/admin/pages/subscriptions/index.d.ts +2 -0
  122. package/dist/admin/pages/subscriptions/subscription-change-options.d.ts +23 -0
  123. package/dist/admin/pages/subscriptions/views.d.ts +15 -0
  124. package/dist/admin/router.d.ts +32 -0
  125. package/dist/admin/routes.d.ts +5 -0
  126. package/dist/admin/summary.d.ts +27 -0
  127. package/dist/admin/theme.d.ts +2 -0
  128. package/dist/admin/types.d.ts +56 -0
  129. package/dist/admin/ui-context.d.ts +14 -0
  130. package/dist/admin-attempts-lAoW-Urd.js +419 -0
  131. package/dist/admin-attempts-lAoW-Urd.js.map +1 -0
  132. package/dist/admin-auth-DQGHtt0j.js +14 -0
  133. package/dist/admin-auth-DQGHtt0j.js.map +1 -0
  134. package/dist/admin-badge-DR5-1qd8.js +31 -0
  135. package/dist/admin-badge-DR5-1qd8.js.map +1 -0
  136. package/dist/admin-button-CTL3DgOt.js +46 -0
  137. package/dist/admin-button-CTL3DgOt.js.map +1 -0
  138. package/dist/admin-capabilities-BuigAgtm.js +59 -0
  139. package/dist/admin-capabilities-BuigAgtm.js.map +1 -0
  140. package/dist/admin-card-bzAks3-3.js +51 -0
  141. package/dist/admin-card-bzAks3-3.js.map +1 -0
  142. package/dist/admin-catalog-CC7I4n0_.js +1189 -0
  143. package/dist/admin-catalog-CC7I4n0_.js.map +1 -0
  144. package/dist/admin-confirm-katGq0Qo.js +12 -0
  145. package/dist/admin-confirm-katGq0Qo.js.map +1 -0
  146. package/dist/admin-csv-CPoNZj2D.js +16 -0
  147. package/dist/admin-csv-CPoNZj2D.js.map +1 -0
  148. package/dist/admin-customers-D8u5gq3M.js +160 -0
  149. package/dist/admin-customers-D8u5gq3M.js.map +1 -0
  150. package/dist/admin-dashboard-DqqFjOzq.js +420 -0
  151. package/dist/admin-dashboard-DqqFjOzq.js.map +1 -0
  152. package/dist/admin-data-table-qfXLOFmN.js +96 -0
  153. package/dist/admin-data-table-qfXLOFmN.js.map +1 -0
  154. package/dist/admin-detail-5aNNvrc0.js +324 -0
  155. package/dist/admin-detail-5aNNvrc0.js.map +1 -0
  156. package/dist/admin-detail-7p684Uyc.js +342 -0
  157. package/dist/admin-detail-7p684Uyc.js.map +1 -0
  158. package/dist/admin-detail-CGOyqs7s.js +1312 -0
  159. package/dist/admin-detail-CGOyqs7s.js.map +1 -0
  160. package/dist/admin-detail-DUAJQg8G.js +710 -0
  161. package/dist/admin-detail-DUAJQg8G.js.map +1 -0
  162. package/dist/admin-dialog-BjuKI5Hp.js +88 -0
  163. package/dist/admin-dialog-BjuKI5Hp.js.map +1 -0
  164. package/dist/admin-dialog-width-BPrgdYlj.js +6 -0
  165. package/dist/admin-dialog-width-BPrgdYlj.js.map +1 -0
  166. package/dist/admin-dom-uMmZzRvU.js +149 -0
  167. package/dist/admin-dom-uMmZzRvU.js.map +1 -0
  168. package/dist/admin-dropdown-menu-BW1D_h6s.js +69 -0
  169. package/dist/admin-dropdown-menu-BW1D_h6s.js.map +1 -0
  170. package/dist/admin-dunning-B2zgtrOo.js +10 -0
  171. package/dist/admin-dunning-B2zgtrOo.js.map +1 -0
  172. package/dist/admin-fact-card-DO_fHosg.js +20 -0
  173. package/dist/admin-fact-card-DO_fHosg.js.map +1 -0
  174. package/dist/admin-form-field-errors-hbUMIriS.js +14 -0
  175. package/dist/admin-form-field-errors-hbUMIriS.js.map +1 -0
  176. package/dist/admin-format-DoohJ7Fg.js +136 -0
  177. package/dist/admin-format-DoohJ7Fg.js.map +1 -0
  178. package/dist/admin-health-B4jN2LwR.js +983 -0
  179. package/dist/admin-health-B4jN2LwR.js.map +1 -0
  180. package/dist/admin-input-CcfQfJFN.js +17 -0
  181. package/dist/admin-input-CcfQfJFN.js.map +1 -0
  182. package/dist/admin-invoice-profile-model-Cgjy3zV8.js +53 -0
  183. package/dist/admin-invoice-profile-model-Cgjy3zV8.js.map +1 -0
  184. package/dist/admin-label-BiEN5cjb.js +15 -0
  185. package/dist/admin-label-BiEN5cjb.js.map +1 -0
  186. package/dist/admin-linked-table-row-BsaUruCN.js +26 -0
  187. package/dist/admin-linked-table-row-BsaUruCN.js.map +1 -0
  188. package/dist/admin-metering-BGAXbT23.js +1702 -0
  189. package/dist/admin-metering-BGAXbT23.js.map +1 -0
  190. package/dist/admin-ops-B3mcr76u.js +217 -0
  191. package/dist/admin-ops-B3mcr76u.js.map +1 -0
  192. package/dist/admin-orders-dxC99Idl.js +192 -0
  193. package/dist/admin-orders-dxC99Idl.js.map +1 -0
  194. package/dist/admin-payments-Bs7HSfP0.js +246 -0
  195. package/dist/admin-payments-Bs7HSfP0.js.map +1 -0
  196. package/dist/admin-price-detail-DRquxpA9.js +482 -0
  197. package/dist/admin-price-detail-DRquxpA9.js.map +1 -0
  198. package/dist/admin-price-format-DM1qORWI.js +44 -0
  199. package/dist/admin-price-format-DM1qORWI.js.map +1 -0
  200. package/dist/admin-price-wizard-CI7K-2Nz.js +357 -0
  201. package/dist/admin-price-wizard-CI7K-2Nz.js.map +1 -0
  202. package/dist/admin-range-picker-Dr2M1EZr.js +192 -0
  203. package/dist/admin-range-picker-Dr2M1EZr.js.map +1 -0
  204. package/dist/admin-reports-CywKLiSA.js +320 -0
  205. package/dist/admin-reports-CywKLiSA.js.map +1 -0
  206. package/dist/admin-select-DBgprVW6.js +81 -0
  207. package/dist/admin-select-DBgprVW6.js.map +1 -0
  208. package/dist/admin-settings-Bmoy95uO.js +1434 -0
  209. package/dist/admin-settings-Bmoy95uO.js.map +1 -0
  210. package/dist/admin-skeleton-DsM7crYi.js +14 -0
  211. package/dist/admin-skeleton-DsM7crYi.js.map +1 -0
  212. package/dist/admin-status-badge-BFPgo71d.js +38 -0
  213. package/dist/admin-status-badge-BFPgo71d.js.map +1 -0
  214. package/dist/admin-subscriptions-CLYc_HEV.js +301 -0
  215. package/dist/admin-subscriptions-CLYc_HEV.js.map +1 -0
  216. package/dist/admin-switch-BJUxLCsa.js +20 -0
  217. package/dist/admin-switch-BJUxLCsa.js.map +1 -0
  218. package/dist/admin-table-CH9TrXJf.js +61 -0
  219. package/dist/admin-table-CH9TrXJf.js.map +1 -0
  220. package/dist/admin-tabs-528FJMjt.js +46 -0
  221. package/dist/admin-tabs-528FJMjt.js.map +1 -0
  222. package/dist/admin-textarea-DEz38RaI.js +15 -0
  223. package/dist/admin-textarea-DEz38RaI.js.map +1 -0
  224. package/dist/admin-typed-confirm-dialog-DU7m9-O7.js +66 -0
  225. package/dist/admin-typed-confirm-dialog-DU7m9-O7.js.map +1 -0
  226. package/dist/admin-utils-BK4Vh1o_.js +1809 -0
  227. package/dist/admin-utils-BK4Vh1o_.js.map +1 -0
  228. package/dist/admin-widget-viz-Da48c-Zf.js +581 -0
  229. package/dist/admin-widget-viz-Da48c-Zf.js.map +1 -0
  230. package/dist/admin.css +3 -0
  231. package/dist/admin.js +2164 -0
  232. package/dist/admin.js.map +1 -0
  233. package/dist/appearance.d.ts +1 -1
  234. package/dist/client/generated/error-codes.d.ts +1 -1
  235. package/dist/client/generated/routes.d.ts +2171 -176
  236. package/dist/client/generated/wire.d.ts +1273 -0
  237. package/dist/{hooks-Uiw-zW3H.js → hooks-Ckd8F2JF.js} +7 -7
  238. package/dist/hooks-Ckd8F2JF.js.map +1 -0
  239. package/dist/index.d.ts +1 -1
  240. package/dist/index.js +11 -11
  241. package/dist/index.js.map +1 -1
  242. package/dist/lib/{offer-label.d.ts → price-label.d.ts} +1 -1
  243. package/dist/locales/de.js +1 -1
  244. package/dist/locales/de.js.map +1 -1
  245. package/dist/locales/en.d.ts +1 -1
  246. package/dist/locales/en.js +1 -1
  247. package/dist/locales/en.js.map +1 -1
  248. package/dist/locales/es.js +1 -1
  249. package/dist/locales/es.js.map +1 -1
  250. package/dist/locales/ja.js +1 -1
  251. package/dist/locales/ja.js.map +1 -1
  252. package/dist/locales/ko.js +1 -1
  253. package/dist/locales/ko.js.map +1 -1
  254. package/dist/locales/zh.js +1 -1
  255. package/dist/locales/zh.js.map +1 -1
  256. package/dist/{offers.d.ts → product-list.d.ts} +5 -5
  257. package/dist/react.js +1 -1
  258. package/dist/styles.css +1 -1
  259. package/package.json +28 -6
  260. package/dist/hooks-Uiw-zW3H.js.map +0 -1
@@ -0,0 +1,342 @@
1
+ import { E as e, c as t, p as n, r, w as i } from "./admin-utils-BK4Vh1o_.js";
2
+ import { t as a } from "./admin-button-CTL3DgOt.js";
3
+ import { t as o } from "./admin-input-CcfQfJFN.js";
4
+ import { a as s } from "./admin-capabilities-BuigAgtm.js";
5
+ import { n as c, o as l, s as u, t as d, u as f } from "./admin-format-DoohJ7Fg.js";
6
+ import { n as p, r as m } from "./admin-dom-uMmZzRvU.js";
7
+ import { t as h } from "./admin-status-badge-BFPgo71d.js";
8
+ import { a as g, i as _, n as v, o as y, r as b, t as x } from "./admin-dialog-BjuKI5Hp.js";
9
+ import { t as S } from "./admin-label-BiEN5cjb.js";
10
+ import { a as C, o as w, r as T, t as E } from "./admin-card-bzAks3-3.js";
11
+ import { r as D } from "./admin-invoice-profile-model-Cgjy3zV8.js";
12
+ import { t as O } from "./admin-data-table-qfXLOFmN.js";
13
+ import { useState as k } from "react";
14
+ import { useMutation as A, useQuery as j, useQueryClient as M } from "@tanstack/react-query";
15
+ import { Fragment as N, jsx as P, jsxs as F } from "react/jsx-runtime";
16
+ //#region src/admin/pages/orders/model.ts
17
+ var I = {
18
+ waive_balance: "Waive balance",
19
+ mark_uncollectible: "Mark uncollectible",
20
+ record_payment: "Record payment"
21
+ }, L = {
22
+ waive_balance: "Forgive the remaining debt. Existing payments stay recorded and are not refunded.",
23
+ mark_uncollectible: "Stop scheduled collection. What the order owes remains owed; collecting it again reopens it.",
24
+ record_payment: "Record money already received outside automatic collection. This does not charge a payment method."
25
+ };
26
+ function R(e) {
27
+ let t = e.usage;
28
+ if (!t || BigInt(t.amount_due) <= 0n) return [];
29
+ switch (e.status) {
30
+ case "open": return [
31
+ "record_payment",
32
+ "mark_uncollectible",
33
+ "waive_balance"
34
+ ];
35
+ case "uncollectible": return ["record_payment", "waive_balance"];
36
+ }
37
+ return [];
38
+ }
39
+ function z(e) {
40
+ return "kind" in e ? "Payment recorded." : e.status === "complete" ? "Order paid." : e.status === "processing" ? "Collection is pending verification. No new collection should be started." : "Order updated.";
41
+ }
42
+ function B(e, t, n) {
43
+ let r = d(e.trim(), n);
44
+ if (r === null) throw Error(`Enter a positive amount with up to ${n} decimal places.`);
45
+ if (BigInt(r) <= 0n || BigInt(r) > BigInt(t)) throw Error("Payment must be positive and no greater than what the order owes.");
46
+ return r;
47
+ }
48
+ //#endregion
49
+ //#region src/admin/pages/orders/detail.tsx
50
+ var V = [
51
+ {
52
+ header: "Paid",
53
+ cell: ({ row: e }) => l(e.original.created_at)
54
+ },
55
+ {
56
+ header: "Amount",
57
+ cell: ({ row: e }) => u(e.original.amount, e.original.currency)
58
+ },
59
+ {
60
+ header: "Status",
61
+ cell: ({ row: e }) => /* @__PURE__ */ P(h, { status: e.original.status })
62
+ },
63
+ {
64
+ header: "Method",
65
+ cell: ({ row: e }) => e.original.rail ?? e.original.channel
66
+ },
67
+ {
68
+ header: "Reference",
69
+ cell: ({ row: e }) => e.original.transaction_id || f(e.original.id)
70
+ }
71
+ ];
72
+ function H() {
73
+ let { orderQueries: e } = n(), { id: r = "" } = t(), { data: a, isPending: o, error: s } = j(e.detail(r));
74
+ return o ? /* @__PURE__ */ P("p", { children: /* @__PURE__ */ P(i, { id: "Loading order…" }) }) : s ? /* @__PURE__ */ P("p", {
75
+ role: "alert",
76
+ className: "text-destructive",
77
+ children: s.message
78
+ }) : a ? /* @__PURE__ */ P(U, { order: a }, a.id) : /* @__PURE__ */ P("p", { children: /* @__PURE__ */ P(i, { id: "Order not found." }) });
79
+ }
80
+ function U({ order: e }) {
81
+ let { orderQueries: t } = n(), a = m(e.id, 25), o = j(t.payments(e.id, a.size, a.cursor)), s = e.payment.last_payment_error;
82
+ return /* @__PURE__ */ F("div", {
83
+ className: "flex flex-col gap-5",
84
+ children: [
85
+ /* @__PURE__ */ P(r, {
86
+ to: "/orders",
87
+ className: "text-sm underline",
88
+ children: /* @__PURE__ */ P(i, { id: "← Orders" })
89
+ }),
90
+ /* @__PURE__ */ F("div", {
91
+ className: "flex flex-wrap items-center gap-3",
92
+ children: [
93
+ /* @__PURE__ */ P("h1", {
94
+ className: "text-xl font-semibold",
95
+ children: e.number ?? e.id
96
+ }),
97
+ /* @__PURE__ */ P(h, { status: e.status }),
98
+ e.usage?.delinquent && /* @__PURE__ */ P(h, { status: "delinquent" })
99
+ ]
100
+ }),
101
+ /* @__PURE__ */ F("p", {
102
+ className: "text-sm",
103
+ children: [
104
+ /* @__PURE__ */ P(i, { id: "Customer" }),
105
+ " ",
106
+ /* @__PURE__ */ P(r, {
107
+ className: "underline",
108
+ to: `/customers/${e.customer_id}`,
109
+ children: e.customer_id
110
+ }),
111
+ " ",
112
+ "· ",
113
+ e.origin,
114
+ " · ",
115
+ e.currency
116
+ ]
117
+ }),
118
+ /* @__PURE__ */ P("div", {
119
+ className: "grid gap-4 md:grid-cols-3",
120
+ children: [["Total", e.total], ...e.usage ? [["Paid", e.usage.amount_paid], ["Unpaid", e.usage.amount_due]] : []].map(([t, n]) => /* @__PURE__ */ F(E, { children: [/* @__PURE__ */ P(C, { children: /* @__PURE__ */ P(w, { children: t }) }), /* @__PURE__ */ P(T, {
121
+ className: "text-xl",
122
+ children: u(n, e.currency)
123
+ })] }, String(t)))
124
+ }),
125
+ e.usage && /* @__PURE__ */ P(W, { usage: e.usage }),
126
+ e.renewal && /* @__PURE__ */ F(E, { children: [/* @__PURE__ */ P(C, { children: /* @__PURE__ */ P(w, { children: /* @__PURE__ */ P(i, { id: "Renewal" }) }) }), /* @__PURE__ */ F(T, {
127
+ className: "grid gap-3 text-sm md:grid-cols-2",
128
+ children: [
129
+ /* @__PURE__ */ F("p", { children: [
130
+ /* @__PURE__ */ P(i, { id: "Subscription:" }),
131
+ " ",
132
+ /* @__PURE__ */ P(r, {
133
+ className: "underline",
134
+ to: `/subscriptions/${e.renewal.subscription_id}`,
135
+ children: f(e.renewal.subscription_id)
136
+ })
137
+ ] }),
138
+ /* @__PURE__ */ F("p", { children: [
139
+ /* @__PURE__ */ P(i, { id: "Period: " }),
140
+ l(e.renewal.period_starts_at),
141
+ " –",
142
+ " ",
143
+ l(e.renewal.period_ends_at)
144
+ ] }),
145
+ /* @__PURE__ */ F("p", { children: [/* @__PURE__ */ P(i, { id: "Due: " }), l(e.renewal.due_at)] })
146
+ ]
147
+ })] }),
148
+ /* @__PURE__ */ F(E, { children: [/* @__PURE__ */ P(C, { children: /* @__PURE__ */ P(w, { children: /* @__PURE__ */ P(i, { id: "Lines" }) }) }), /* @__PURE__ */ F(T, { children: [/* @__PURE__ */ F("table", {
149
+ className: "w-full text-sm",
150
+ children: [/* @__PURE__ */ P("thead", { children: /* @__PURE__ */ F("tr", {
151
+ className: "text-left",
152
+ children: [
153
+ /* @__PURE__ */ P("th", { children: /* @__PURE__ */ P(i, { id: "Description" }) }),
154
+ /* @__PURE__ */ P("th", { children: /* @__PURE__ */ P(i, { id: "Quantity" }) }),
155
+ /* @__PURE__ */ P("th", {
156
+ className: "text-right",
157
+ children: /* @__PURE__ */ P(i, { id: "Amount" })
158
+ })
159
+ ]
160
+ }) }), /* @__PURE__ */ P("tbody", { children: e.lines.map((t) => /* @__PURE__ */ F("tr", { children: [
161
+ /* @__PURE__ */ F("td", {
162
+ className: "py-2",
163
+ children: [t.description, t.source && /* @__PURE__ */ P("p", {
164
+ className: "text-xs text-muted-foreground",
165
+ children: t.source
166
+ })]
167
+ }),
168
+ /* @__PURE__ */ P("td", { children: t.quantity ?? "—" }),
169
+ /* @__PURE__ */ P("td", {
170
+ className: "text-right",
171
+ children: u(t.amount, e.currency)
172
+ })
173
+ ] }, t.id)) })]
174
+ }), !e.lines.length && /* @__PURE__ */ P("p", { children: /* @__PURE__ */ P(i, { id: "No lines." }) })] })] }),
175
+ /* @__PURE__ */ F(E, { children: [/* @__PURE__ */ P(C, { children: /* @__PURE__ */ P(w, { children: /* @__PURE__ */ P(i, { id: "Payment" }) }) }), /* @__PURE__ */ F(T, {
176
+ className: "space-y-3 text-sm",
177
+ children: [
178
+ /* @__PURE__ */ F("p", { children: [/* @__PURE__ */ P(i, { id: "Status: " }), /* @__PURE__ */ P(h, { status: e.payment.status })] }),
179
+ s && /* @__PURE__ */ F("p", { children: [/* @__PURE__ */ P(i, { id: "Last failure: " }), s.message] }),
180
+ e.usage && /* @__PURE__ */ P(G, { order: e })
181
+ ]
182
+ })] }),
183
+ /* @__PURE__ */ F(E, { children: [/* @__PURE__ */ P(C, { children: /* @__PURE__ */ P(w, { children: /* @__PURE__ */ P(i, { id: "Payment history" }) }) }), /* @__PURE__ */ P(T, { children: o.error ? /* @__PURE__ */ P("p", {
184
+ role: "alert",
185
+ className: "text-destructive",
186
+ children: o.error.message
187
+ }) : /* @__PURE__ */ F(N, { children: [/* @__PURE__ */ P(O, {
188
+ columns: V,
189
+ data: o.data?.data ?? [],
190
+ loading: o.isPending,
191
+ emptyMessage: "No payments recorded."
192
+ }), /* @__PURE__ */ P(p, {
193
+ pages: a,
194
+ rows: o.data?.data?.length ?? 0,
195
+ nextCursor: o.data?.next_cursor,
196
+ busy: o.isFetching
197
+ })] }) })] })
198
+ ]
199
+ });
200
+ }
201
+ function W({ usage: e }) {
202
+ return /* @__PURE__ */ F(E, { children: [/* @__PURE__ */ P(C, { children: /* @__PURE__ */ P(w, { children: /* @__PURE__ */ P(i, { id: "Usage billed" }) }) }), /* @__PURE__ */ F(T, {
203
+ className: "grid gap-3 text-sm md:grid-cols-2",
204
+ children: [
205
+ /* @__PURE__ */ F("p", { children: [
206
+ /* @__PURE__ */ P(i, { id: "Period: " }),
207
+ l(e.period_starts_at),
208
+ " –",
209
+ " ",
210
+ l(e.period_ends_at)
211
+ ] }),
212
+ /* @__PURE__ */ F("p", { children: [/* @__PURE__ */ P(i, { id: "Due: " }), l(e.due_at)] }),
213
+ /* @__PURE__ */ F("p", { children: [
214
+ /* @__PURE__ */ P(i, { id: "Collection:" }),
215
+ " ",
216
+ e.collection_method === "send_invoice" ? "Manual remittance" : "Saved payment method"
217
+ ] }),
218
+ /* @__PURE__ */ F("p", { children: [/* @__PURE__ */ P(i, { id: "Next attempt: " }), l(e.next_collection_attempt_at)] }),
219
+ /* @__PURE__ */ F("p", { children: [/* @__PURE__ */ P(i, { id: "Purchase order: " }), e.po_number ?? "—"] }),
220
+ /* @__PURE__ */ F("p", { children: [/* @__PURE__ */ P(i, { id: "Memo: " }), e.memo ?? "—"] }),
221
+ /* @__PURE__ */ F("div", { children: [/* @__PURE__ */ P("p", {
222
+ className: "font-medium",
223
+ children: /* @__PURE__ */ P(i, { id: "Billing contacts" })
224
+ }), e.billing_contacts.length ? e.billing_contacts.map((e, t) => /* @__PURE__ */ F("p", { children: [e.name ? `${e.name} · ` : "", e.email] }, t)) : /* @__PURE__ */ P("p", { children: "—" })] }),
225
+ /* @__PURE__ */ F("div", { children: [/* @__PURE__ */ P("p", {
226
+ className: "font-medium",
227
+ children: /* @__PURE__ */ P(i, { id: "Tax details" })
228
+ }), Object.entries(e.tax ?? {}).map(([e, t]) => /* @__PURE__ */ F("p", { children: [
229
+ e,
230
+ ": ",
231
+ D(t)
232
+ ] }, e))] }),
233
+ /* @__PURE__ */ P("p", {
234
+ className: "text-muted-foreground md:col-span-2",
235
+ children: /* @__PURE__ */ P(i, { id: "These are the customer&apos;s invoice profile when the order was billed. Editing the profile affects later orders." })
236
+ })
237
+ ]
238
+ })] });
239
+ }
240
+ function G({ order: t }) {
241
+ let { toast: r, usageActionMutation: l } = n(), { id: u } = e(), d = s(), [f, p] = k(null), [m, h] = k(""), [C, w] = k(""), [T, E] = k(null), D = M(), O = A(l(D, t.customer_id)), j = d ? R(t) : [];
242
+ async function V() {
243
+ if (!(!f || O.isPending)) {
244
+ E(null);
245
+ try {
246
+ if (!j.includes(f)) throw Error("This action is no longer available. Refresh the order before continuing.");
247
+ if (f === "record_payment" && !C.trim()) throw Error("Enter the bank or payment reference.");
248
+ let e;
249
+ if (f === "record_payment") {
250
+ let n = c(t.currency);
251
+ if (n === void 0) throw Error(`${t.currency} is not a registered currency.`);
252
+ e = B(m, t.usage.amount_due, n);
253
+ }
254
+ let n = await O.mutateAsync({
255
+ id: t.id,
256
+ action: f,
257
+ amount: e,
258
+ reference: C.trim()
259
+ });
260
+ r(z(n)), p(null);
261
+ } catch (e) {
262
+ E(e instanceof Error ? e.message : "Order action failed.");
263
+ }
264
+ }
265
+ }
266
+ return /* @__PURE__ */ F(N, { children: [
267
+ t.status === "processing" && /* @__PURE__ */ F("p", {
268
+ role: "status",
269
+ children: [
270
+ /* @__PURE__ */ P(i, { id: "A collection of this order is in progress. It must finish, or be resolved with " }),
271
+ /* @__PURE__ */ P("code", { children: /* @__PURE__ */ P(i, { id: "openrails intents resolve" }) }),
272
+ /* @__PURE__ */ P(i, { id: ", before another action." })
273
+ ]
274
+ }),
275
+ /* @__PURE__ */ P("div", {
276
+ className: "flex flex-wrap gap-2",
277
+ children: j.map((e) => /* @__PURE__ */ P(a, {
278
+ variant: e === "waive_balance" ? "destructive" : "outline",
279
+ onClick: () => {
280
+ p(e), E(null);
281
+ },
282
+ children: I[e]
283
+ }, e))
284
+ }),
285
+ !j.length && t.status !== "processing" && /* @__PURE__ */ P("p", {
286
+ className: "text-muted-foreground",
287
+ children: /* @__PURE__ */ P(i, { id: "No actions are available for your permissions and this order&apos;s state." })
288
+ }),
289
+ /* @__PURE__ */ P(x, {
290
+ open: f !== null,
291
+ onOpenChange: (e) => {
292
+ !e && !O.isPending && p(null);
293
+ },
294
+ children: /* @__PURE__ */ F(v, { children: [
295
+ /* @__PURE__ */ F(g, { children: [/* @__PURE__ */ P(y, { children: f ? I[f] : "Order action" }), /* @__PURE__ */ P(b, { children: f ? L[f] : "" })] }),
296
+ f === "record_payment" && /* @__PURE__ */ F("div", {
297
+ className: "space-y-3",
298
+ children: [/* @__PURE__ */ F("div", { children: [/* @__PURE__ */ F(S, {
299
+ htmlFor: u("order-payment-amount"),
300
+ children: [
301
+ /* @__PURE__ */ P(i, { id: "Amount (" }),
302
+ t.currency,
303
+ ")"
304
+ ]
305
+ }), /* @__PURE__ */ P(o, {
306
+ id: u("order-payment-amount"),
307
+ inputMode: "decimal",
308
+ value: m,
309
+ onChange: (e) => h(e.target.value)
310
+ })] }), /* @__PURE__ */ F("div", { children: [/* @__PURE__ */ P(S, {
311
+ htmlFor: u("order-payment-reference"),
312
+ children: /* @__PURE__ */ P(i, { id: "Payment reference" })
313
+ }), /* @__PURE__ */ P(o, {
314
+ id: u("order-payment-reference"),
315
+ maxLength: 255,
316
+ value: C,
317
+ onChange: (e) => w(e.target.value)
318
+ })] })]
319
+ }),
320
+ T && /* @__PURE__ */ P("p", {
321
+ role: "alert",
322
+ className: "text-destructive",
323
+ children: T
324
+ }),
325
+ /* @__PURE__ */ F(_, { children: [/* @__PURE__ */ P(a, {
326
+ variant: "outline",
327
+ disabled: O.isPending,
328
+ onClick: () => p(null),
329
+ children: /* @__PURE__ */ P(i, { id: "Cancel" })
330
+ }), /* @__PURE__ */ P(a, {
331
+ disabled: O.isPending || !f || !j.includes(f),
332
+ onClick: () => void V(),
333
+ children: O.isPending ? "Working…" : "Confirm"
334
+ })] })
335
+ ] })
336
+ })
337
+ ] });
338
+ }
339
+ //#endregion
340
+ export { H as OrderDetailPage };
341
+
342
+ //# sourceMappingURL=admin-detail-7p684Uyc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-detail-7p684Uyc.js","names":[],"sources":["../src/admin/pages/orders/model.ts","../src/admin/pages/orders/detail.tsx"],"sourcesContent":["import type { Order, Payment } from \"#orck/client/generated/wire\"\nimport type { UsageAction } from \"#orck/admin/lib/api/order-endpoints\"\nimport { amountFromInput } from \"#orck/admin/lib/format\"\n\nexport const usageActionLabels: Record<UsageAction, string> = {\n waive_balance: \"Waive balance\",\n mark_uncollectible: \"Mark uncollectible\",\n record_payment: \"Record payment\",\n}\nexport const usageActionDescriptions: Record<UsageAction, string> = {\n waive_balance:\n \"Forgive the remaining debt. Existing payments stay recorded and are not refunded.\",\n mark_uncollectible:\n \"Stop scheduled collection. What the order owes remains owed; collecting it again reopens it.\",\n record_payment:\n \"Record money already received outside automatic collection. This does not charge a payment method.\",\n}\n// usageActions are what staff who may change billing can do to a usage\n// order in its state: none while a collection is in progress.\nexport function usageActions(order: Order): UsageAction[] {\n const usage = order.usage\n if (!usage || BigInt(usage.amount_due) <= 0n) return []\n switch (order.status) {\n case \"open\":\n return [\"record_payment\", \"mark_uncollectible\", \"waive_balance\"]\n case \"uncollectible\":\n return [\"record_payment\", \"waive_balance\"]\n }\n return []\n}\nexport function usageResultMessage(result: Order | Payment) {\n if (\"kind\" in result) return \"Payment recorded.\"\n if (result.status === \"complete\") return \"Order paid.\"\n if (result.status === \"processing\")\n return \"Collection is pending verification. No new collection should be started.\"\n return \"Order updated.\"\n}\nexport function usagePaymentAmount(\n input: string,\n amountDue: string,\n decimals: number\n) {\n const amount = amountFromInput(input.trim(), decimals)\n if (amount === null)\n throw new Error(\n `Enter a positive amount with up to ${decimals} decimal places.`\n )\n if (BigInt(amount) <= 0n || BigInt(amount) > BigInt(amountDue))\n throw new Error(\n \"Payment must be positive and no greater than what the order owes.\"\n )\n return amount\n}\n","import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminServices } from \"#orck/admin/context\"\nimport { useState } from \"react\"\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\"\nimport { Link, useParams } from \"#orck/admin/router\"\nimport type { ColumnDef } from \"@tanstack/react-table\"\n\nimport { CursorPager } from \"#orck/admin/components/cursor-pager\"\nimport { DataTable } from \"#orck/admin/components/data-table\"\nimport { StatusBadge } from \"#orck/admin/components/status-badge\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport { Label } from \"#orck/admin/components/ui/label\"\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"#orck/admin/components/ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from \"#orck/admin/components/ui/dialog\"\nimport { useCursorPages } from \"#orck/admin/lib/cursor-pages\"\nimport type { Order, OrderUsage, Payment } from \"#orck/client/generated/wire\"\nimport type { UsageAction } from \"#orck/admin/lib/api/order-endpoints\"\n\nimport { useAdminUpdates } from \"#orck/admin/lib/capabilities\"\nimport {\n currencyScale,\n formatDate,\n formatNativeAmount,\n shortId,\n} from \"#orck/admin/lib/format\"\nimport { taxDisplay } from \"../customers/invoice-profile-model\"\nimport {\n usageActionDescriptions,\n usageActionLabels,\n usageActions,\n usagePaymentAmount,\n usageResultMessage,\n} from \"./model\"\n\nconst historyColumns: ColumnDef<Payment, unknown>[] = [\n {\n header: \"Paid\",\n cell: ({ row }) => formatDate(row.original.created_at),\n },\n {\n header: \"Amount\",\n cell: ({ row }) =>\n formatNativeAmount(row.original.amount, row.original.currency),\n },\n {\n header: \"Status\",\n cell: ({ row }) => <StatusBadge status={row.original.status} />,\n },\n {\n header: \"Method\",\n cell: ({ row }) => row.original.rail ?? row.original.channel,\n },\n {\n header: \"Reference\",\n cell: ({ row }) => row.original.transaction_id || shortId(row.original.id),\n },\n]\nexport function OrderDetailPage() {\n const { orderQueries } = useAdminServices()\n\n const { id = \"\" } = useParams()\n const { data: order, isPending, error } = useQuery(orderQueries.detail(id))\n if (isPending)\n return (\n <p>\n <AdminMessage id={\"Loading order…\"} />\n </p>\n )\n if (error)\n return (\n <p role=\"alert\" className=\"text-destructive\">\n {error.message}\n </p>\n )\n if (!order)\n return (\n <p>\n <AdminMessage id={\"Order not found.\"} />\n </p>\n )\n return <OrderDetail key={order.id} order={order} />\n}\nexport function OrderDetail({ order }: { order: Order }) {\n const { orderQueries } = useAdminServices()\n\n const paging = useCursorPages(order.id, 25)\n const history = useQuery(\n orderQueries.payments(order.id, paging.size, paging.cursor)\n )\n const failure = order.payment.last_payment_error\n return (\n <div className=\"flex flex-col gap-5\">\n <Link to=\"/orders\" className=\"text-sm underline\">\n <AdminMessage id={\"← Orders\"} />\n </Link>\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{order.number ?? order.id}</h1>\n <StatusBadge status={order.status} />\n {order.usage?.delinquent && <StatusBadge status=\"delinquent\" />}\n </div>\n <p className=\"text-sm\">\n <AdminMessage id={\"Customer\"} />{\" \"}\n <Link className=\"underline\" to={`/customers/${order.customer_id}`}>\n {order.customer_id}\n </Link>{\" \"}\n · {order.origin} · {order.currency}\n </p>\n <div className=\"grid gap-4 md:grid-cols-3\">\n {[\n [\"Total\", order.total],\n ...(order.usage\n ? [\n [\"Paid\", order.usage.amount_paid],\n [\"Unpaid\", order.usage.amount_due],\n ]\n : []),\n ].map(([label, value]) => (\n <Card key={String(label)}>\n <CardHeader>\n <CardTitle>{label}</CardTitle>\n </CardHeader>\n <CardContent className=\"text-xl\">\n {formatNativeAmount(value, order.currency)}\n </CardContent>\n </Card>\n ))}\n </div>\n {order.usage && <UsageFacts usage={order.usage} />}\n {order.renewal && (\n <Card>\n <CardHeader>\n <CardTitle>\n <AdminMessage id={\"Renewal\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3 text-sm md:grid-cols-2\">\n <p>\n <AdminMessage id={\"Subscription:\"} />{\" \"}\n <Link\n className=\"underline\"\n to={`/subscriptions/${order.renewal.subscription_id}`}\n >\n {shortId(order.renewal.subscription_id)}\n </Link>\n </p>\n <p>\n <AdminMessage id={\"Period: \"} />\n {formatDate(order.renewal.period_starts_at)} –{\" \"}\n {formatDate(order.renewal.period_ends_at)}\n </p>\n <p>\n <AdminMessage id={\"Due: \"} />\n {formatDate(order.renewal.due_at)}\n </p>\n </CardContent>\n </Card>\n )}\n <Card>\n <CardHeader>\n <CardTitle>\n <AdminMessage id={\"Lines\"} />\n </CardTitle>\n </CardHeader>\n <CardContent>\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"text-left\">\n <th>\n <AdminMessage id={\"Description\"} />\n </th>\n <th>\n <AdminMessage id={\"Quantity\"} />\n </th>\n <th className=\"text-right\">\n <AdminMessage id={\"Amount\"} />\n </th>\n </tr>\n </thead>\n <tbody>\n {order.lines.map((line) => (\n <tr key={line.id}>\n <td className=\"py-2\">\n {line.description}\n {line.source && (\n <p className=\"text-xs text-muted-foreground\">\n {line.source}\n </p>\n )}\n </td>\n <td>{line.quantity ?? \"—\"}</td>\n <td className=\"text-right\">\n {formatNativeAmount(line.amount, order.currency)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {!order.lines.length && (\n <p>\n <AdminMessage id={\"No lines.\"} />\n </p>\n )}\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>\n <AdminMessage id={\"Payment\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <p>\n <AdminMessage id={\"Status: \"} />\n <StatusBadge status={order.payment.status} />\n </p>\n {failure && (\n <p>\n <AdminMessage id={\"Last failure: \"} />\n {failure.message}\n </p>\n )}\n {order.usage && <UsageActions order={order} />}\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>\n <AdminMessage id={\"Payment history\"} />\n </CardTitle>\n </CardHeader>\n <CardContent>\n {history.error ? (\n <p role=\"alert\" className=\"text-destructive\">\n {history.error.message}\n </p>\n ) : (\n <>\n <DataTable\n columns={historyColumns}\n data={history.data?.data ?? []}\n loading={history.isPending}\n emptyMessage=\"No payments recorded.\"\n />\n <CursorPager\n pages={paging}\n rows={history.data?.data?.length ?? 0}\n nextCursor={history.data?.next_cursor}\n busy={history.isFetching}\n />\n </>\n )}\n </CardContent>\n </Card>\n </div>\n )\n}\n\nfunction UsageFacts({ usage }: { usage: OrderUsage }) {\n return (\n <Card>\n <CardHeader>\n <CardTitle>\n <AdminMessage id={\"Usage billed\"} />\n </CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3 text-sm md:grid-cols-2\">\n <p>\n <AdminMessage id={\"Period: \"} />\n {formatDate(usage.period_starts_at)} –{\" \"}\n {formatDate(usage.period_ends_at)}\n </p>\n <p>\n <AdminMessage id={\"Due: \"} />\n {formatDate(usage.due_at)}\n </p>\n <p>\n <AdminMessage id={\"Collection:\"} />{\" \"}\n {usage.collection_method === \"send_invoice\"\n ? \"Manual remittance\"\n : \"Saved payment method\"}\n </p>\n <p>\n <AdminMessage id={\"Next attempt: \"} />\n {formatDate(usage.next_collection_attempt_at)}\n </p>\n <p>\n <AdminMessage id={\"Purchase order: \"} />\n {usage.po_number ?? \"—\"}\n </p>\n <p>\n <AdminMessage id={\"Memo: \"} />\n {usage.memo ?? \"—\"}\n </p>\n <div>\n <p className=\"font-medium\">\n <AdminMessage id={\"Billing contacts\"} />\n </p>\n {usage.billing_contacts.length ? (\n usage.billing_contacts.map((c, i) => (\n <p key={i}>\n {c.name ? `${c.name} · ` : \"\"}\n {c.email}\n </p>\n ))\n ) : (\n <p>—</p>\n )}\n </div>\n <div>\n <p className=\"font-medium\">\n <AdminMessage id={\"Tax details\"} />\n </p>\n {Object.entries(usage.tax ?? {}).map(([key, value]) => (\n <p key={key}>\n {key}: {taxDisplay(value)}\n </p>\n ))}\n </div>\n <p className=\"text-muted-foreground md:col-span-2\">\n <AdminMessage\n id={\n \"These are the customer&apos;s invoice profile when the order was billed. Editing the profile affects later orders.\"\n }\n />\n </p>\n </CardContent>\n </Card>\n )\n}\n\nfunction UsageActions({ order }: { order: Order }) {\n const { toast, usageActionMutation } = useAdminServices()\n\n const { id: adminId } = useAdminUI()\n\n const canUpdate = useAdminUpdates()\n const [action, setAction] = useState<UsageAction | null>(null)\n const [amount, setAmount] = useState(\"\")\n const [reference, setReference] = useState(\"\")\n const [error, setError] = useState<string | null>(null)\n const client = useQueryClient()\n const mutation = useMutation(usageActionMutation(client, order.customer_id))\n const actions = canUpdate ? usageActions(order) : []\n async function submit() {\n if (!action || mutation.isPending) return\n setError(null)\n try {\n if (!actions.includes(action))\n throw new Error(\n \"This action is no longer available. Refresh the order before continuing.\"\n )\n if (action === \"record_payment\" && !reference.trim())\n throw new Error(\"Enter the bank or payment reference.\")\n let paid: string | undefined\n if (action === \"record_payment\") {\n const scale = currencyScale(order.currency)\n if (scale === undefined)\n throw new Error(`${order.currency} is not a registered currency.`)\n paid = usagePaymentAmount(amount, order.usage!.amount_due, scale)\n }\n const result = await mutation.mutateAsync({\n id: order.id,\n action,\n amount: paid,\n reference: reference.trim(),\n })\n toast(usageResultMessage(result))\n setAction(null)\n } catch (failure) {\n setError(\n failure instanceof Error ? failure.message : \"Order action failed.\"\n )\n }\n }\n return (\n <>\n {order.status === \"processing\" && (\n <p role=\"status\">\n <AdminMessage\n id={\n \"A collection of this order is in progress. It must finish, or be resolved with \"\n }\n />\n <code>\n <AdminMessage id={\"openrails intents resolve\"} />\n </code>\n <AdminMessage id={\", before another action.\"} />\n </p>\n )}\n <div className=\"flex flex-wrap gap-2\">\n {actions.map((value) => (\n <Button\n key={value}\n variant={value === \"waive_balance\" ? \"destructive\" : \"outline\"}\n onClick={() => {\n setAction(value)\n setError(null)\n }}\n >\n {usageActionLabels[value]}\n </Button>\n ))}\n </div>\n {!actions.length && order.status !== \"processing\" && (\n <p className=\"text-muted-foreground\">\n <AdminMessage\n id={\n \"No actions are available for your permissions and this order&apos;s state.\"\n }\n />\n </p>\n )}\n <Dialog\n open={action !== null}\n onOpenChange={(open) => {\n if (!open && !mutation.isPending) setAction(null)\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {action ? usageActionLabels[action] : \"Order action\"}\n </DialogTitle>\n <DialogDescription>\n {action ? usageActionDescriptions[action] : \"\"}\n </DialogDescription>\n </DialogHeader>\n {action === \"record_payment\" && (\n <div className=\"space-y-3\">\n <div>\n <Label htmlFor={adminId(\"order-payment-amount\")}>\n <AdminMessage id={\"Amount (\"} />\n {order.currency})\n </Label>\n <Input\n id={adminId(\"order-payment-amount\")}\n inputMode=\"decimal\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n />\n </div>\n <div>\n <Label htmlFor={adminId(\"order-payment-reference\")}>\n <AdminMessage id={\"Payment reference\"} />\n </Label>\n <Input\n id={adminId(\"order-payment-reference\")}\n maxLength={255}\n value={reference}\n onChange={(e) => setReference(e.target.value)}\n />\n </div>\n </div>\n )}\n {error && (\n <p role=\"alert\" className=\"text-destructive\">\n {error}\n </p>\n )}\n <DialogFooter>\n <Button\n variant=\"outline\"\n disabled={mutation.isPending}\n onClick={() => setAction(null)}\n >\n <AdminMessage id={\"Cancel\"} />\n </Button>\n <Button\n disabled={\n mutation.isPending || !action || !actions.includes(action)\n }\n onClick={() => void submit()}\n >\n {mutation.isPending ? \"Working…\" : \"Confirm\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n"],"mappings":"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"}