@openrails/billing-ui 0.241.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.
- package/CHANGELOG.md +27 -11
- package/README.md +41 -8
- package/dist/admin/billing-admin.d.ts +3 -0
- package/dist/admin/components/app-sidebar.d.ts +1 -0
- package/dist/admin/components/confirm.d.ts +4 -0
- package/dist/admin/components/cursor-pager.d.ts +8 -0
- package/dist/admin/components/data-table.d.ts +14 -0
- package/dist/admin/components/fact-card.d.ts +5 -0
- package/dist/admin/components/form-field-errors.d.ts +3 -0
- package/dist/admin/components/linked-table-row.d.ts +5 -0
- package/dist/admin/components/logo.d.ts +3 -0
- package/dist/admin/components/no-access.d.ts +3 -0
- package/dist/admin/components/no-merchants.d.ts +1 -0
- package/dist/admin/components/notification-bell.d.ts +2 -0
- package/dist/admin/components/route-error.d.ts +3 -0
- package/dist/admin/components/site-header.d.ts +9 -0
- package/dist/admin/components/status-badge.d.ts +3 -0
- package/dist/admin/components/typed-confirm-dialog.d.ts +11 -0
- package/dist/admin/components/ui/alert-dialog.d.ts +18 -0
- package/dist/admin/components/ui/avatar.d.ts +11 -0
- package/dist/admin/components/ui/badge.d.ts +7 -0
- package/dist/admin/components/ui/breadcrumb.d.ts +10 -0
- package/dist/admin/components/ui/button.d.ts +8 -0
- package/dist/admin/components/ui/card.d.ts +11 -0
- package/dist/admin/components/ui/chart.d.ts +44 -0
- package/dist/admin/components/ui/dialog.d.ts +17 -0
- package/dist/admin/components/ui/dropdown-menu.d.ts +29 -0
- package/dist/admin/components/ui/input.d.ts +3 -0
- package/dist/admin/components/ui/label.d.ts +3 -0
- package/dist/admin/components/ui/select.d.ts +15 -0
- package/dist/admin/components/ui/separator.d.ts +3 -0
- package/dist/admin/components/ui/sheet.d.ts +14 -0
- package/dist/admin/components/ui/sidebar.d.ts +63 -0
- package/dist/admin/components/ui/skeleton.d.ts +2 -0
- package/dist/admin/components/ui/sonner.d.ts +3 -0
- package/dist/admin/components/ui/switch.d.ts +5 -0
- package/dist/admin/components/ui/table.d.ts +10 -0
- package/dist/admin/components/ui/tabs.d.ts +10 -0
- package/dist/admin/components/ui/textarea.d.ts +3 -0
- package/dist/admin/components/ui/tooltip.d.ts +6 -0
- package/dist/admin/context.d.ts +1193 -0
- package/dist/admin/hooks/use-mobile.d.ts +1 -0
- package/dist/admin/index.d.ts +5 -0
- package/dist/admin/layouts/app-layout.d.ts +4 -0
- package/dist/admin/lib/api/client.d.ts +64 -0
- package/dist/admin/lib/api/copilot.d.ts +6 -0
- package/dist/admin/lib/api/credit-endpoints.d.ts +8 -0
- package/dist/admin/lib/api/credit-types.d.ts +9 -0
- package/dist/admin/lib/api/endpoints.d.ts +133 -0
- package/dist/admin/lib/api/index.d.ts +89 -0
- package/dist/admin/lib/api/invoice-profile-endpoints.d.ts +6 -0
- package/dist/admin/lib/api/metrics.d.ts +68 -0
- package/dist/admin/lib/api/order-endpoints.d.ts +21 -0
- package/dist/admin/lib/api/types.d.ts +122 -0
- package/dist/admin/lib/auth.d.ts +6 -0
- package/dist/admin/lib/capabilities.d.ts +13 -0
- package/dist/admin/lib/chunk-error.d.ts +1 -0
- package/dist/admin/lib/confirm.d.ts +11 -0
- package/dist/admin/lib/credit-queries.d.ts +23 -0
- package/dist/admin/lib/csv.d.ts +3 -0
- package/dist/admin/lib/cursor-pages.d.ts +13 -0
- package/dist/admin/lib/dialog-width.d.ts +6 -0
- package/dist/admin/lib/dom.d.ts +1 -0
- package/dist/admin/lib/duration.d.ts +3 -0
- package/dist/admin/lib/format.d.ts +23 -0
- package/dist/admin/lib/mount.d.ts +6 -0
- package/dist/admin/lib/mutations.d.ts +125 -0
- package/dist/admin/lib/order-queries.d.ts +29 -0
- package/dist/admin/lib/queries.d.ts +369 -0
- package/dist/admin/lib/query-client.d.ts +3 -0
- package/dist/admin/lib/toast.d.ts +10 -0
- package/dist/admin/lib/utils.d.ts +2 -0
- package/dist/admin/messages.d.ts +670 -0
- package/dist/admin/navigation.d.ts +14 -0
- package/dist/admin/pages/catalog/application-dialog.d.ts +2 -0
- package/dist/admin/pages/catalog/copilot-panel.d.ts +4 -0
- package/dist/admin/pages/catalog/index.d.ts +4 -0
- package/dist/admin/pages/catalog/meter-form.d.ts +6 -0
- package/dist/admin/pages/catalog/metering-model.d.ts +67 -0
- package/dist/admin/pages/catalog/metering.d.ts +3 -0
- package/dist/admin/pages/catalog/price-detail.d.ts +2 -0
- package/dist/admin/pages/catalog/price-format.d.ts +3 -0
- package/dist/admin/pages/catalog/price-wizard-logic.d.ts +20 -0
- package/dist/admin/pages/catalog/price-wizard.d.ts +10 -0
- package/dist/admin/pages/catalog/psp-links.d.ts +10 -0
- package/dist/admin/pages/catalog/rate-card-editor.d.ts +10 -0
- package/dist/admin/pages/customers/credit-form.d.ts +14 -0
- package/dist/admin/pages/customers/credits.d.ts +5 -0
- package/dist/admin/pages/customers/default-card-badges.d.ts +3 -0
- package/dist/admin/pages/customers/detail.d.ts +5 -0
- package/dist/admin/pages/customers/grant-duration.d.ts +32 -0
- package/dist/admin/pages/customers/index.d.ts +2 -0
- package/dist/admin/pages/customers/invoice-profile-model.d.ts +18 -0
- package/dist/admin/pages/customers/invoice-profile.d.ts +9 -0
- package/dist/admin/pages/dashboard/index.d.ts +2 -0
- package/dist/admin/pages/dashboard/lib.d.ts +48 -0
- package/dist/admin/pages/dashboard/range-picker.d.ts +1 -0
- package/dist/admin/pages/dashboard/range.d.ts +34 -0
- package/dist/admin/pages/dashboard/reports-model.d.ts +29 -0
- package/dist/admin/pages/dashboard/reports.d.ts +2 -0
- package/dist/admin/pages/dashboard/use-range.d.ts +5 -0
- package/dist/admin/pages/dashboard/widget-editor.d.ts +8 -0
- package/dist/admin/pages/dashboard/widget-tile.d.ts +9 -0
- package/dist/admin/pages/dashboard/widget-viz.d.ts +12 -0
- package/dist/admin/pages/ops/index.d.ts +2 -0
- package/dist/admin/pages/orders/detail.d.ts +5 -0
- package/dist/admin/pages/orders/index.d.ts +1 -0
- package/dist/admin/pages/orders/model.d.ts +7 -0
- package/dist/admin/pages/payments/attempts.d.ts +7 -0
- package/dist/admin/pages/payments/detail.d.ts +2 -0
- package/dist/admin/pages/payments/health-model.d.ts +149 -0
- package/dist/admin/pages/payments/health.d.ts +2 -0
- package/dist/admin/pages/payments/index.d.ts +2 -0
- package/dist/admin/pages/settings/configuration-edit.d.ts +9 -0
- package/dist/admin/pages/settings/index.d.ts +9 -0
- package/dist/admin/pages/settings/notifications.d.ts +2 -0
- package/dist/admin/pages/settings/setting-fields.d.ts +20 -0
- package/dist/admin/pages/subscriptions/change-subscription-dialog.d.ts +16 -0
- package/dist/admin/pages/subscriptions/detail.d.ts +2 -0
- package/dist/admin/pages/subscriptions/dunning.d.ts +2 -0
- package/dist/admin/pages/subscriptions/index.d.ts +2 -0
- package/dist/admin/pages/subscriptions/subscription-change-options.d.ts +23 -0
- package/dist/admin/pages/subscriptions/views.d.ts +15 -0
- package/dist/admin/router.d.ts +32 -0
- package/dist/admin/routes.d.ts +5 -0
- package/dist/admin/summary.d.ts +27 -0
- package/dist/admin/theme.d.ts +2 -0
- package/dist/admin/types.d.ts +56 -0
- package/dist/admin/ui-context.d.ts +14 -0
- package/dist/admin-attempts-lAoW-Urd.js +419 -0
- package/dist/admin-attempts-lAoW-Urd.js.map +1 -0
- package/dist/admin-auth-DQGHtt0j.js +14 -0
- package/dist/admin-auth-DQGHtt0j.js.map +1 -0
- package/dist/admin-badge-DR5-1qd8.js +31 -0
- package/dist/admin-badge-DR5-1qd8.js.map +1 -0
- package/dist/admin-button-CTL3DgOt.js +46 -0
- package/dist/admin-button-CTL3DgOt.js.map +1 -0
- package/dist/admin-capabilities-BuigAgtm.js +59 -0
- package/dist/admin-capabilities-BuigAgtm.js.map +1 -0
- package/dist/admin-card-bzAks3-3.js +51 -0
- package/dist/admin-card-bzAks3-3.js.map +1 -0
- package/dist/admin-catalog-CC7I4n0_.js +1189 -0
- package/dist/admin-catalog-CC7I4n0_.js.map +1 -0
- package/dist/admin-confirm-katGq0Qo.js +12 -0
- package/dist/admin-confirm-katGq0Qo.js.map +1 -0
- package/dist/admin-csv-CPoNZj2D.js +16 -0
- package/dist/admin-csv-CPoNZj2D.js.map +1 -0
- package/dist/admin-customers-D8u5gq3M.js +160 -0
- package/dist/admin-customers-D8u5gq3M.js.map +1 -0
- package/dist/admin-dashboard-DqqFjOzq.js +420 -0
- package/dist/admin-dashboard-DqqFjOzq.js.map +1 -0
- package/dist/admin-data-table-qfXLOFmN.js +96 -0
- package/dist/admin-data-table-qfXLOFmN.js.map +1 -0
- package/dist/admin-detail-5aNNvrc0.js +324 -0
- package/dist/admin-detail-5aNNvrc0.js.map +1 -0
- package/dist/admin-detail-7p684Uyc.js +342 -0
- package/dist/admin-detail-7p684Uyc.js.map +1 -0
- package/dist/admin-detail-CGOyqs7s.js +1312 -0
- package/dist/admin-detail-CGOyqs7s.js.map +1 -0
- package/dist/admin-detail-DUAJQg8G.js +710 -0
- package/dist/admin-detail-DUAJQg8G.js.map +1 -0
- package/dist/admin-dialog-BjuKI5Hp.js +88 -0
- package/dist/admin-dialog-BjuKI5Hp.js.map +1 -0
- package/dist/admin-dialog-width-BPrgdYlj.js +6 -0
- package/dist/admin-dialog-width-BPrgdYlj.js.map +1 -0
- package/dist/admin-dom-uMmZzRvU.js +149 -0
- package/dist/admin-dom-uMmZzRvU.js.map +1 -0
- package/dist/admin-dropdown-menu-BW1D_h6s.js +69 -0
- package/dist/admin-dropdown-menu-BW1D_h6s.js.map +1 -0
- package/dist/admin-dunning-B2zgtrOo.js +10 -0
- package/dist/admin-dunning-B2zgtrOo.js.map +1 -0
- package/dist/admin-fact-card-DO_fHosg.js +20 -0
- package/dist/admin-fact-card-DO_fHosg.js.map +1 -0
- package/dist/admin-form-field-errors-hbUMIriS.js +14 -0
- package/dist/admin-form-field-errors-hbUMIriS.js.map +1 -0
- package/dist/admin-format-DoohJ7Fg.js +136 -0
- package/dist/admin-format-DoohJ7Fg.js.map +1 -0
- package/dist/admin-health-B4jN2LwR.js +983 -0
- package/dist/admin-health-B4jN2LwR.js.map +1 -0
- package/dist/admin-input-CcfQfJFN.js +17 -0
- package/dist/admin-input-CcfQfJFN.js.map +1 -0
- package/dist/admin-invoice-profile-model-Cgjy3zV8.js +53 -0
- package/dist/admin-invoice-profile-model-Cgjy3zV8.js.map +1 -0
- package/dist/admin-label-BiEN5cjb.js +15 -0
- package/dist/admin-label-BiEN5cjb.js.map +1 -0
- package/dist/admin-linked-table-row-BsaUruCN.js +26 -0
- package/dist/admin-linked-table-row-BsaUruCN.js.map +1 -0
- package/dist/admin-metering-BGAXbT23.js +1702 -0
- package/dist/admin-metering-BGAXbT23.js.map +1 -0
- package/dist/admin-ops-B3mcr76u.js +217 -0
- package/dist/admin-ops-B3mcr76u.js.map +1 -0
- package/dist/admin-orders-dxC99Idl.js +192 -0
- package/dist/admin-orders-dxC99Idl.js.map +1 -0
- package/dist/admin-payments-Bs7HSfP0.js +246 -0
- package/dist/admin-payments-Bs7HSfP0.js.map +1 -0
- package/dist/admin-price-detail-DRquxpA9.js +482 -0
- package/dist/admin-price-detail-DRquxpA9.js.map +1 -0
- package/dist/admin-price-format-DM1qORWI.js +44 -0
- package/dist/admin-price-format-DM1qORWI.js.map +1 -0
- package/dist/admin-price-wizard-CI7K-2Nz.js +357 -0
- package/dist/admin-price-wizard-CI7K-2Nz.js.map +1 -0
- package/dist/admin-range-picker-Dr2M1EZr.js +192 -0
- package/dist/admin-range-picker-Dr2M1EZr.js.map +1 -0
- package/dist/admin-reports-CywKLiSA.js +320 -0
- package/dist/admin-reports-CywKLiSA.js.map +1 -0
- package/dist/admin-select-DBgprVW6.js +81 -0
- package/dist/admin-select-DBgprVW6.js.map +1 -0
- package/dist/admin-settings-Bmoy95uO.js +1434 -0
- package/dist/admin-settings-Bmoy95uO.js.map +1 -0
- package/dist/admin-skeleton-DsM7crYi.js +14 -0
- package/dist/admin-skeleton-DsM7crYi.js.map +1 -0
- package/dist/admin-status-badge-BFPgo71d.js +38 -0
- package/dist/admin-status-badge-BFPgo71d.js.map +1 -0
- package/dist/admin-subscriptions-CLYc_HEV.js +301 -0
- package/dist/admin-subscriptions-CLYc_HEV.js.map +1 -0
- package/dist/admin-switch-BJUxLCsa.js +20 -0
- package/dist/admin-switch-BJUxLCsa.js.map +1 -0
- package/dist/admin-table-CH9TrXJf.js +61 -0
- package/dist/admin-table-CH9TrXJf.js.map +1 -0
- package/dist/admin-tabs-528FJMjt.js +46 -0
- package/dist/admin-tabs-528FJMjt.js.map +1 -0
- package/dist/admin-textarea-DEz38RaI.js +15 -0
- package/dist/admin-textarea-DEz38RaI.js.map +1 -0
- package/dist/admin-typed-confirm-dialog-DU7m9-O7.js +66 -0
- package/dist/admin-typed-confirm-dialog-DU7m9-O7.js.map +1 -0
- package/dist/admin-utils-BK4Vh1o_.js +1809 -0
- package/dist/admin-utils-BK4Vh1o_.js.map +1 -0
- package/dist/admin-widget-viz-Da48c-Zf.js +581 -0
- package/dist/admin-widget-viz-Da48c-Zf.js.map +1 -0
- package/dist/admin.css +3 -0
- package/dist/admin.js +2164 -0
- package/dist/admin.js.map +1 -0
- package/dist/appearance.d.ts +1 -1
- package/dist/client/generated/error-codes.d.ts +1 -1
- package/dist/client/generated/routes.d.ts +2156 -189
- package/dist/client/generated/wire.d.ts +1265 -50
- package/dist/client/types.d.ts +0 -1
- package/dist/{client-Cxz_miQj.js → client-PjivPHmE.js} +2 -3
- package/dist/client-PjivPHmE.js.map +1 -0
- package/dist/client.js +1 -1
- package/dist/{hooks-aKefXeMO.js → hooks-Ckd8F2JF.js} +8 -8
- package/dist/hooks-Ckd8F2JF.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/{offer-label.d.ts → price-label.d.ts} +1 -1
- package/dist/locales/de.js +1 -1
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts +1 -1
- package/dist/locales/en.js +1 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +1 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/ja.js +1 -1
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +1 -1
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/zh.js +1 -1
- package/dist/locales/zh.js.map +1 -1
- package/dist/{offers.d.ts → product-list.d.ts} +5 -5
- package/dist/react.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +28 -6
- package/dist/client-Cxz_miQj.js.map +0 -1
- package/dist/hooks-aKefXeMO.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'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'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'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'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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"}
|