@burdenoff/microfe-billing 2026.716.1 → 2026.729.1

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.
@@ -0,0 +1,277 @@
1
+ import { AccessDenied as e } from "../../../shared/components/AccessDenied.js";
2
+ import { PageHeader as t } from "../../../shared/components/PageHeader.js";
3
+ import "../../../shared/components/index.js";
4
+ import { useBillingPermissions as n } from "../../../hooks/useBillingPermissions.js";
5
+ import { useAssignQuotaFreeMutation as r } from "../../../../generated/global-operations.js";
6
+ import { useBillingNavigate as i } from "../../../hooks/useBillingNavigate.js";
7
+ import { useQuotaTemplates as a } from "../hooks/useQuotaTemplates.js";
8
+ import "../hooks/index.js";
9
+ import { useMemo as o, useState as s } from "react";
10
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
11
+ import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
+ import { PagePurpose as d } from "@burdenoff/fe-libs/ui";
13
+ //#region src/billing/modules/quota/pages/QuotaAssignFreePage.tsx
14
+ var f = () => {
15
+ let { t: f } = u(), p = (e, t) => {
16
+ let n = f(e);
17
+ return n === e ? t : n;
18
+ }, m = i(), h = n(), [g, _] = s(""), [v, y] = s(""), [b, x] = s(""), [S, C] = s(""), [w, T] = s(""), [E, D] = s(""), [O, k] = s(null), { quotas: A, isLoading: j } = a({ onlyActive: !0 }), [M, { loading: N }] = r(), P = A.find((e) => e.id === b), F = P?.scope === "WORKSPACE", I = o(() => P?.limits?.value, [P]);
19
+ return h.canManageQuotas ? /* @__PURE__ */ l("div", {
20
+ className: "space-y-6 p-6 max-w-2xl",
21
+ children: [
22
+ /* @__PURE__ */ c(t, {
23
+ title: p("billing.quotaAssignFree.title", "Assign Quota for Free"),
24
+ description: p("billing.quotaAssignFree.description", "Internally assign a single quota to a billing account at no charge. Requires the team secret."),
25
+ actions: /* @__PURE__ */ c("button", {
26
+ type: "button",
27
+ onClick: () => m("/quota"),
28
+ className: "px-3 py-2 text-sm border border-border-subtle rounded-md text-text-primary hover:bg-bg-sunken transition-colors",
29
+ children: "← Back to Quotas"
30
+ })
31
+ }),
32
+ /* @__PURE__ */ c(d, { children: p("billing.quotaAssignFree.purpose", "An internal tool to grant a single quota to a billing account without assigning a whole plan — useful for one-off comps or fixing a missing entitlement. It bypasses payment, so it requires the team secret and should be used deliberately.") }),
33
+ /* @__PURE__ */ l("div", {
34
+ className: "flex items-start gap-3 p-4 rounded-lg border border-status-warning-border bg-status-warning-bg/10",
35
+ children: [/* @__PURE__ */ c("svg", {
36
+ className: "size-5 text-status-warning-text shrink-0 mt-0.5",
37
+ fill: "none",
38
+ viewBox: "0 0 24 24",
39
+ stroke: "currentColor",
40
+ children: /* @__PURE__ */ c("path", {
41
+ strokeLinecap: "round",
42
+ strokeLinejoin: "round",
43
+ strokeWidth: 2,
44
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.962-.833-2.732 0L3.072 16.5c-.77.833.192 2.5 1.732 2.5z"
45
+ })
46
+ }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
47
+ className: "text-sm font-medium text-status-warning-text",
48
+ children: "Internal admin tool"
49
+ }), /* @__PURE__ */ c("p", {
50
+ className: "text-xs text-status-warning-text/80 mt-0.5",
51
+ children: "This bypasses all payment flows. The quota is granted immediately with no charge. Use only for enterprise deals, comped accounts, or fixing a missing entitlement."
52
+ })] })]
53
+ }),
54
+ /* @__PURE__ */ l("form", {
55
+ onSubmit: async (e) => {
56
+ if (e.preventDefault(), k(null), !g.trim() || !v.trim() || !b) {
57
+ k({
58
+ success: !1,
59
+ message: "All fields are required."
60
+ });
61
+ return;
62
+ }
63
+ try {
64
+ let { data: e } = await M({ variables: {
65
+ secret: g.trim(),
66
+ billingAccountId: v.trim(),
67
+ quotaId: b,
68
+ ...S.trim() ? { workspaceId: S.trim() } : {},
69
+ ...w.trim() ? { limit: Number(w) } : {},
70
+ ...E.trim() ? { durationDays: Number(E) } : {}
71
+ } });
72
+ if (e?.assignQuotaFree) {
73
+ let t = e.assignQuotaFree;
74
+ k({
75
+ success: !0,
76
+ message: `Quota "${t.quotaName}" assigned (${t.scope}). Limit: ${t.limit ?? "default"}` + (t.workspaceId ? ` · Workspace: ${t.workspaceId}` : "") + (t.endtime ? ` · Valid until: ${new Date(t.endtime).toLocaleDateString()}` : "")
77
+ }), _(""), y(""), x(""), C(""), T(""), D("");
78
+ }
79
+ } catch (e) {
80
+ k({
81
+ success: !1,
82
+ message: e instanceof Error ? e.message : "Failed to assign quota."
83
+ });
84
+ }
85
+ },
86
+ className: "border border-border-seam rounded-card bg-bg-surface overflow-hidden shadow-[var(--shadow-elevation-1)]",
87
+ children: [
88
+ /* @__PURE__ */ c("div", {
89
+ className: "p-4 border-b border-border-subtle bg-bg-sunken/30",
90
+ children: /* @__PURE__ */ c("h2", {
91
+ className: "font-semibold text-text-primary",
92
+ children: "Assignment Details"
93
+ })
94
+ }),
95
+ /* @__PURE__ */ l("div", {
96
+ className: "p-4 space-y-4",
97
+ children: [
98
+ /* @__PURE__ */ l("div", { children: [
99
+ /* @__PURE__ */ l("label", {
100
+ htmlFor: "secret",
101
+ className: "block text-sm font-medium text-text-primary mb-1",
102
+ children: ["Team Secret ", /* @__PURE__ */ c("span", {
103
+ className: "text-status-error-text",
104
+ children: "*"
105
+ })]
106
+ }),
107
+ /* @__PURE__ */ c("input", {
108
+ id: "secret",
109
+ type: "password",
110
+ value: g,
111
+ onChange: (e) => _(e.target.value),
112
+ autoComplete: "off",
113
+ className: "w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] font-mono",
114
+ placeholder: "Enter PLAN_ASSIGN_SECRET",
115
+ required: !0
116
+ }),
117
+ /* @__PURE__ */ c("p", {
118
+ className: "text-xs text-text-muted mt-1",
119
+ children: "Same team secret used by Assign Plan Free. Never expose this to users."
120
+ })
121
+ ] }),
122
+ /* @__PURE__ */ l("div", { children: [
123
+ /* @__PURE__ */ l("label", {
124
+ htmlFor: "billingAccountId",
125
+ className: "block text-sm font-medium text-text-primary mb-1",
126
+ children: ["Billing Account ID ", /* @__PURE__ */ c("span", {
127
+ className: "text-status-error-text",
128
+ children: "*"
129
+ })]
130
+ }),
131
+ /* @__PURE__ */ c("input", {
132
+ id: "billingAccountId",
133
+ type: "text",
134
+ value: v,
135
+ onChange: (e) => y(e.target.value),
136
+ className: "w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] font-mono text-sm",
137
+ placeholder: "e.g. ba_01jk3n2...",
138
+ required: !0
139
+ }),
140
+ /* @__PURE__ */ c("p", {
141
+ className: "text-xs text-text-muted mt-1",
142
+ children: "Find this in the user's billing account settings or via the billing accounts list."
143
+ })
144
+ ] }),
145
+ /* @__PURE__ */ l("div", { children: [
146
+ /* @__PURE__ */ l("label", {
147
+ htmlFor: "quotaId",
148
+ className: "block text-sm font-medium text-text-primary mb-1",
149
+ children: ["Quota ", /* @__PURE__ */ c("span", {
150
+ className: "text-status-error-text",
151
+ children: "*"
152
+ })]
153
+ }),
154
+ j ? /* @__PURE__ */ c("div", { className: "h-10 bg-bg-sunken animate-pulse rounded-md" }) : /* @__PURE__ */ l("select", {
155
+ id: "quotaId",
156
+ value: b,
157
+ onChange: (e) => {
158
+ x(e.target.value), C("");
159
+ },
160
+ className: "w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
161
+ required: !0,
162
+ children: [/* @__PURE__ */ c("option", {
163
+ value: "",
164
+ disabled: !0,
165
+ children: "Select a quota…"
166
+ }), A.map((e) => /* @__PURE__ */ l("option", {
167
+ value: e.id,
168
+ children: [
169
+ e.name,
170
+ " (",
171
+ e.scope ?? "WORKSPACE",
172
+ ")"
173
+ ]
174
+ }, e.id))]
175
+ }),
176
+ P && /* @__PURE__ */ l("p", {
177
+ className: "text-xs text-text-muted mt-1",
178
+ children: [
179
+ "Scope: ",
180
+ P.scope ?? "WORKSPACE",
181
+ " · Type: ",
182
+ P.quotaType,
183
+ I == null ? "" : ` · Default limit: ${I}`
184
+ ]
185
+ })
186
+ ] }),
187
+ F && /* @__PURE__ */ l("div", { children: [
188
+ /* @__PURE__ */ l("label", {
189
+ htmlFor: "workspaceId",
190
+ className: "block text-sm font-medium text-text-primary mb-1",
191
+ children: ["Workspace ID ", /* @__PURE__ */ c("span", {
192
+ className: "text-text-secondary font-normal",
193
+ children: "(optional)"
194
+ })]
195
+ }),
196
+ /* @__PURE__ */ c("input", {
197
+ id: "workspaceId",
198
+ type: "text",
199
+ value: S,
200
+ onChange: (e) => C(e.target.value),
201
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-primary font-mono text-sm",
202
+ placeholder: "e.g. ws_01jk3n2… (leave blank to auto-resolve)"
203
+ }),
204
+ /* @__PURE__ */ c("p", {
205
+ className: "text-xs text-text-secondary mt-1",
206
+ children: "This quota is workspace-scoped. If blank, the first active workspace for this org is used automatically."
207
+ })
208
+ ] }),
209
+ /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("label", {
210
+ htmlFor: "limit",
211
+ className: "block text-sm font-medium text-text-primary mb-1",
212
+ children: ["Limit ", /* @__PURE__ */ c("span", {
213
+ className: "text-text-secondary font-normal",
214
+ children: "(optional)"
215
+ })]
216
+ }), /* @__PURE__ */ c("input", {
217
+ id: "limit",
218
+ type: "number",
219
+ value: w,
220
+ onChange: (e) => T(e.target.value),
221
+ className: "w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
222
+ placeholder: I == null ? "Leave blank to use the quota default" : `Leave blank to use default (${I})`
223
+ })] }),
224
+ !F && P && /* @__PURE__ */ l("div", { children: [
225
+ /* @__PURE__ */ l("label", {
226
+ htmlFor: "durationDays",
227
+ className: "block text-sm font-medium text-text-primary mb-1",
228
+ children: ["Duration (days) ", /* @__PURE__ */ c("span", {
229
+ className: "text-text-secondary font-normal",
230
+ children: "(optional)"
231
+ })]
232
+ }),
233
+ /* @__PURE__ */ c("input", {
234
+ id: "durationDays",
235
+ type: "number",
236
+ min: 1,
237
+ value: E,
238
+ onChange: (e) => D(e.target.value),
239
+ className: "w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
240
+ placeholder: "Leave blank for 365 days"
241
+ }),
242
+ /* @__PURE__ */ c("p", {
243
+ className: "text-xs text-text-muted mt-1",
244
+ children: "Ignored if this quota attaches to an existing subscription — it then expires with that subscription instead."
245
+ })
246
+ ] })
247
+ ]
248
+ }),
249
+ O && /* @__PURE__ */ c("div", {
250
+ className: `mx-4 mb-4 p-3 rounded-lg border text-sm ${O.success ? "border-status-success-border bg-status-success-bg/10 text-status-success-text" : "border-status-error-border bg-status-error-bg/10 text-status-error-text"}`,
251
+ children: O.message
252
+ }),
253
+ /* @__PURE__ */ l("div", {
254
+ className: "px-4 pb-4 flex items-center gap-3",
255
+ children: [/* @__PURE__ */ c("button", {
256
+ type: "submit",
257
+ disabled: N || !g || !v || !b,
258
+ className: "px-4 py-2 text-sm font-medium bg-action-primary-bg text-action-primary-text rounded-button hover:bg-action-primary-bgHover transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
259
+ children: N ? "Assigning…" : "Assign Quota for Free"
260
+ }), /* @__PURE__ */ c("button", {
261
+ type: "button",
262
+ onClick: () => {
263
+ _(""), y(""), x(""), C(""), T(""), D(""), k(null);
264
+ },
265
+ className: "px-4 py-2 text-sm border border-border-subtle rounded-md text-text-primary hover:bg-bg-sunken transition-colors",
266
+ children: "Clear"
267
+ })]
268
+ })
269
+ ]
270
+ })
271
+ ]
272
+ }) : /* @__PURE__ */ c(e, { message: p("billing.quotaAssignFree.noPermission", "You don't have permission to access this page.") });
273
+ };
274
+ //#endregion
275
+ export { f as QuotaAssignFreePage };
276
+
277
+ //# sourceMappingURL=QuotaAssignFreePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuotaAssignFreePage.js","names":[],"sources":["../../../../../src/billing/modules/quota/pages/QuotaAssignFreePage.tsx"],"sourcesContent":["/**\n * Quota Module - Assign Quota Free (Admin only)\n *\n * Internal tool for assigning a single quota template directly to a billing\n * account (and, for workspace-scoped quotas, a workspace) at no charge and\n * without purchasing a whole plan. Protected by the same team secret as\n * \"Assign Plan Free\" — never expose to end users.\n *\n * Route: /billing/quota/assign-free\n */\n\nimport { useMemo, useState, type FC, type FormEvent } from 'react';\nimport { useBillingNavigate } from '../../../hooks/useBillingNavigate';\nimport { useBillingPermissions } from '../../../hooks/useBillingPermissions';\nimport { AccessDenied, PageHeader } from '../../../shared/components';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useAssignQuotaFreeMutation } from '../../../../generated/global-operations';\nimport { useQuotaTemplates } from '../hooks';\n\nexport const QuotaAssignFreePage: FC = () => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n\n const navigateTo = useBillingNavigate();\n const permissions = useBillingPermissions();\n\n const [secret, setSecret] = useState('');\n const [billingAccountId, setBillingAccountId] = useState('');\n const [quotaId, setQuotaId] = useState('');\n const [workspaceId, setWorkspaceId] = useState('');\n const [limit, setLimit] = useState('');\n const [durationDays, setDurationDays] = useState('');\n const [result, setResult] = useState<{ success: boolean; message: string } | null>(null);\n\n const { quotas, isLoading: isQuotasLoading } = useQuotaTemplates({ onlyActive: true });\n const [assignQuotaFree, { loading: isAssigning }] = useAssignQuotaFreeMutation();\n\n // Scope comes from the quota template itself, not an independent toggle —\n // this mirrors the backend, which routes on quota.scope and ignores any\n // client-supplied scope, so the UI can't drift from what will actually happen.\n const selectedQuota = quotas.find((q) => q.id === quotaId);\n const isWorkspaceScoped = selectedQuota?.scope === 'WORKSPACE';\n\n const defaultLimit = useMemo(() => {\n const limits = selectedQuota?.limits as { value?: number } | undefined;\n return limits?.value;\n }, [selectedQuota]);\n\n if (!permissions.canManageQuotas) {\n return (\n <AccessDenied\n message={tr(\n 'billing.quotaAssignFree.noPermission',\n \"You don't have permission to access this page.\"\n )}\n />\n );\n }\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setResult(null);\n\n if (!secret.trim() || !billingAccountId.trim() || !quotaId) {\n setResult({ success: false, message: 'All fields are required.' });\n return;\n }\n\n try {\n const { data } = await assignQuotaFree({\n variables: {\n secret: secret.trim(),\n billingAccountId: billingAccountId.trim(),\n quotaId,\n ...(workspaceId.trim() ? { workspaceId: workspaceId.trim() } : {}),\n ...(limit.trim() ? { limit: Number(limit) } : {}),\n ...(durationDays.trim() ? { durationDays: Number(durationDays) } : {}),\n },\n });\n\n if (data?.assignQuotaFree) {\n const assigned = data.assignQuotaFree;\n setResult({\n success: true,\n message:\n `Quota \"${assigned.quotaName}\" assigned (${assigned.scope}). Limit: ${assigned.limit ?? 'default'}` +\n (assigned.workspaceId ? ` · Workspace: ${assigned.workspaceId}` : '') +\n (assigned.endtime\n ? ` · Valid until: ${new Date(assigned.endtime).toLocaleDateString()}`\n : ''),\n });\n // Clear sensitive fields\n setSecret('');\n setBillingAccountId('');\n setQuotaId('');\n setWorkspaceId('');\n setLimit('');\n setDurationDays('');\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Failed to assign quota.';\n setResult({ success: false, message: msg });\n }\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-2xl\">\n <PageHeader\n title={tr('billing.quotaAssignFree.title', 'Assign Quota for Free')}\n description={tr(\n 'billing.quotaAssignFree.description',\n 'Internally assign a single quota to a billing account at no charge. Requires the team secret.'\n )}\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/quota')}\n className=\"px-3 py-2 text-sm border border-border-subtle rounded-md text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n ← Back to Quotas\n </button>\n }\n />\n\n <PagePurpose>\n {tr(\n 'billing.quotaAssignFree.purpose',\n 'An internal tool to grant a single quota to a billing account without assigning a whole plan — useful for one-off comps or fixing a missing entitlement. It bypasses payment, so it requires the team secret and should be used deliberately.'\n )}\n </PagePurpose>\n\n {/* Warning banner */}\n <div className=\"flex items-start gap-3 p-4 rounded-lg border border-status-warning-border bg-status-warning-bg/10\">\n <svg\n className=\"size-5 text-status-warning-text shrink-0 mt-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.962-.833-2.732 0L3.072 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n <div>\n <p className=\"text-sm font-medium text-status-warning-text\">Internal admin tool</p>\n <p className=\"text-xs text-status-warning-text/80 mt-0.5\">\n This bypasses all payment flows. The quota is granted immediately with no charge. Use\n only for enterprise deals, comped accounts, or fixing a missing entitlement.\n </p>\n </div>\n </div>\n\n <form\n onSubmit={handleSubmit}\n className=\"border border-border-seam rounded-card bg-bg-surface overflow-hidden shadow-[var(--shadow-elevation-1)]\"\n >\n <div className=\"p-4 border-b border-border-subtle bg-bg-sunken/30\">\n <h2 className=\"font-semibold text-text-primary\">Assignment Details</h2>\n </div>\n\n <div className=\"p-4 space-y-4\">\n {/* Secret */}\n <div>\n <label htmlFor=\"secret\" className=\"block text-sm font-medium text-text-primary mb-1\">\n Team Secret <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n id=\"secret\"\n type=\"password\"\n value={secret}\n onChange={(e) => setSecret(e.target.value)}\n autoComplete=\"off\"\n className=\"w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] font-mono\"\n placeholder=\"Enter PLAN_ASSIGN_SECRET\"\n required\n />\n <p className=\"text-xs text-text-muted mt-1\">\n Same team secret used by Assign Plan Free. Never expose this to users.\n </p>\n </div>\n\n {/* Billing Account ID */}\n <div>\n <label\n htmlFor=\"billingAccountId\"\n className=\"block text-sm font-medium text-text-primary mb-1\"\n >\n Billing Account ID <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n id=\"billingAccountId\"\n type=\"text\"\n value={billingAccountId}\n onChange={(e) => setBillingAccountId(e.target.value)}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] font-mono text-sm\"\n placeholder=\"e.g. ba_01jk3n2...\"\n required\n />\n <p className=\"text-xs text-text-muted mt-1\">\n Find this in the user's billing account settings or via the billing accounts list.\n </p>\n </div>\n\n {/* Quota selector */}\n <div>\n <label htmlFor=\"quotaId\" className=\"block text-sm font-medium text-text-primary mb-1\">\n Quota <span className=\"text-status-error-text\">*</span>\n </label>\n {isQuotasLoading ? (\n <div className=\"h-10 bg-bg-sunken animate-pulse rounded-md\" />\n ) : (\n <select\n id=\"quotaId\"\n value={quotaId}\n onChange={(e) => {\n setQuotaId(e.target.value);\n setWorkspaceId('');\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n required\n >\n <option value=\"\" disabled>\n Select a quota…\n </option>\n {quotas.map((quota) => (\n <option key={quota.id} value={quota.id}>\n {quota.name} ({quota.scope ?? 'WORKSPACE'})\n </option>\n ))}\n </select>\n )}\n {selectedQuota && (\n <p className=\"text-xs text-text-muted mt-1\">\n Scope: {selectedQuota.scope ?? 'WORKSPACE'} · Type: {selectedQuota.quotaType}\n {defaultLimit != null ? ` · Default limit: ${defaultLimit}` : ''}\n </p>\n )}\n </div>\n\n {/* Workspace ID — required for WORKSPACE-scoped quotas, hidden otherwise */}\n {isWorkspaceScoped && (\n <div>\n <label\n htmlFor=\"workspaceId\"\n className=\"block text-sm font-medium text-text-primary mb-1\"\n >\n Workspace ID <span className=\"text-text-secondary font-normal\">(optional)</span>\n </label>\n <input\n id=\"workspaceId\"\n type=\"text\"\n value={workspaceId}\n onChange={(e) => setWorkspaceId(e.target.value)}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-primary font-mono text-sm\"\n placeholder=\"e.g. ws_01jk3n2… (leave blank to auto-resolve)\"\n />\n <p className=\"text-xs text-text-secondary mt-1\">\n This quota is workspace-scoped. If blank, the first active workspace for this org is\n used automatically.\n </p>\n </div>\n )}\n\n {/* Limit override (optional) */}\n <div>\n <label htmlFor=\"limit\" className=\"block text-sm font-medium text-text-primary mb-1\">\n Limit <span className=\"text-text-secondary font-normal\">(optional)</span>\n </label>\n <input\n id=\"limit\"\n type=\"number\"\n value={limit}\n onChange={(e) => setLimit(e.target.value)}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n placeholder={\n defaultLimit != null\n ? `Leave blank to use default (${defaultLimit})`\n : 'Leave blank to use the quota default'\n }\n />\n </div>\n\n {/* Duration in days (optional, GLOBAL scope only) */}\n {!isWorkspaceScoped && selectedQuota && (\n <div>\n <label\n htmlFor=\"durationDays\"\n className=\"block text-sm font-medium text-text-primary mb-1\"\n >\n Duration (days) <span className=\"text-text-secondary font-normal\">(optional)</span>\n </label>\n <input\n id=\"durationDays\"\n type=\"number\"\n min={1}\n value={durationDays}\n onChange={(e) => setDurationDays(e.target.value)}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-input bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n placeholder=\"Leave blank for 365 days\"\n />\n <p className=\"text-xs text-text-muted mt-1\">\n Ignored if this quota attaches to an existing subscription — it then expires with\n that subscription instead.\n </p>\n </div>\n )}\n </div>\n\n {/* Result banner */}\n {result && (\n <div\n className={`mx-4 mb-4 p-3 rounded-lg border text-sm ${\n result.success\n ? 'border-status-success-border bg-status-success-bg/10 text-status-success-text'\n : 'border-status-error-border bg-status-error-bg/10 text-status-error-text'\n }`}\n >\n {result.message}\n </div>\n )}\n\n <div className=\"px-4 pb-4 flex items-center gap-3\">\n <button\n type=\"submit\"\n disabled={isAssigning || !secret || !billingAccountId || !quotaId}\n className=\"px-4 py-2 text-sm font-medium bg-action-primary-bg text-action-primary-text rounded-button hover:bg-action-primary-bgHover transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isAssigning ? 'Assigning…' : 'Assign Quota for Free'}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setSecret('');\n setBillingAccountId('');\n setQuotaId('');\n setWorkspaceId('');\n setLimit('');\n setDurationDays('');\n setResult(null);\n }}\n className=\"px-4 py-2 text-sm border border-border-subtle rounded-md text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n Clear\n </button>\n </div>\n </form>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -3,3 +3,4 @@ import "./QuotaTemplatesListPage.js";
3
3
  import "./QuotaTemplateDetailPage.js";
4
4
  import "./QuotaTemplateCreatePage.js";
5
5
  import "./QuotaTemplateEditPage.js";
6
+ import "./QuotaAssignFreePage.js";
@@ -1 +1 @@
1
- {"version":3,"file":"graphql.js","names":[],"sources":["../../../../src/billing/shared/types/graphql.ts"],"sourcesContent":["/**\n * GraphQL Types for Billing Module\n * Auto-generated types matching the backend billing service schema\n */\n\n// ============================================================================\n// Enums\n// ============================================================================\n\nexport enum SubscriptionStatus {\n ACTIVE = 'active',\n CANCELED = 'canceled',\n EXPIRED = 'expired',\n UPGRADED = 'upgraded',\n}\n\nexport enum InvoiceStatus {\n DRAFT = 'DRAFT',\n OPEN = 'OPEN',\n PAID = 'PAID',\n VOID = 'VOID',\n UNCOLLECTIBLE = 'UNCOLLECTIBLE',\n}\n\nexport enum PaymentStatus {\n PENDING = 'PENDING',\n SUCCEEDED = 'SUCCEEDED',\n FAILED = 'FAILED',\n CANCELED = 'CANCELED',\n REFUNDED = 'REFUNDED',\n}\n\nexport enum ChargeStatus {\n PENDING = 'PENDING',\n SUCCEEDED = 'SUCCEEDED',\n FAILED = 'FAILED',\n REFUNDED = 'REFUNDED',\n}\n\nexport enum RefundStatus {\n PENDING = 'PENDING',\n SUCCEEDED = 'SUCCEEDED',\n FAILED = 'FAILED',\n CANCELED = 'CANCELED',\n}\n\nexport enum PaymentMethodType {\n CREDIT_CARD = 'CREDIT_CARD',\n DEBIT_CARD = 'DEBIT_CARD',\n BANK_TRANSFER = 'BANK_TRANSFER',\n PAYPAL = 'PAYPAL',\n CRYPTO = 'CRYPTO',\n WALLET = 'WALLET',\n NETBANKING = 'NETBANKING',\n}\n\nexport enum PlanDuration {\n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n}\n\nexport enum PricingModel {\n FLAT_RATE = 'FLAT_RATE',\n PER_SEAT = 'PER_SEAT',\n}\n\nexport enum QuotaType {\n POOLED = 'POOLED',\n PRODUCT_SPECIFIC = 'PRODUCT_SPECIFIC',\n}\n\nexport enum QuotaResetPeriod {\n NEVER = 'NEVER',\n DAILY = 'DAILY',\n MONTHLY = 'MONTHLY',\n}\n\nexport enum QuotaStatus {\n HEALTHY = 'HEALTHY',\n WARNING = 'WARNING',\n CRITICAL = 'CRITICAL',\n EXHAUSTED = 'EXHAUSTED',\n INACTIVE = 'INACTIVE',\n}\n\nexport enum TransactionType {\n PAYMENT = 'payment',\n REFUND = 'refund',\n ADJUSTMENT = 'adjustment',\n}\n\nexport enum TransactionStatus {\n PENDING = 'pending',\n SUCCESS = 'success',\n FAILED = 'failed',\n}\n\nexport enum CreditTransactionType {\n PURCHASE = 'purchase',\n USAGE = 'usage',\n ADJUSTMENT = 'adjustment',\n GRANTED = 'granted',\n}\n\nexport enum CreditTransactionStatus {\n PENDING = 'pending',\n SUCCESS = 'success',\n FAILED = 'failed',\n REFUND = 'refund',\n}\n\nexport enum EntitlementAccessType {\n FREE_ACCESS = 'FREE_ACCESS',\n DISCOUNT = 'DISCOUNT',\n}\n\nexport enum PurchaseType {\n PLAN = 'PLAN',\n ADDON = 'ADDON',\n CREDITS = 'CREDITS',\n}\n\nexport enum PaymentProviderPreference {\n AUTO = 'AUTO',\n STRIPE = 'STRIPE',\n RAZORPAY = 'RAZORPAY',\n}\n\nexport enum AnalyticsPeriod {\n LAST_7_DAYS = 'LAST_7_DAYS',\n LAST_30_DAYS = 'LAST_30_DAYS',\n LAST_90_DAYS = 'LAST_90_DAYS',\n LAST_MONTH = 'LAST_MONTH',\n CURRENT_MONTH = 'CURRENT_MONTH',\n}\n\nexport enum UsageMetricType {\n USERS = 'USERS',\n STORAGE = 'STORAGE',\n API_CALLS = 'API_CALLS',\n BANDWIDTH = 'BANDWIDTH',\n REQUESTS = 'REQUESTS',\n COMPUTE_HOURS = 'COMPUTE_HOURS',\n TRANSACTIONS = 'TRANSACTIONS',\n CUSTOM = 'CUSTOM',\n}\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport interface BillingAccount {\n id: string;\n orgId: string;\n name: string;\n email: string;\n billingEmail?: string;\n currency: string;\n creditAmount: number;\n stripeCustomerId?: string;\n razorpayCustomerId?: string;\n defaultPaymentMethod?: string;\n taxId?: string;\n isActive: boolean;\n isDefault?: boolean;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n subscriptions?: BillingSubscription[];\n paymentMethods?: PaymentMethod[];\n creditTransactions?: CreditTransaction[];\n quotaAssignments?: QuotaAssignment[];\n billingAddresses?: BillingAddress[];\n transactions?: Transaction[];\n}\n\nexport interface BillingAddress {\n id: string;\n billingAccountId: string;\n orgId: string;\n line1: string;\n line2?: string;\n city: string;\n state?: string;\n postalCode: string;\n country: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// Plan Types\n// ============================================================================\n\nexport interface Plan {\n id: string;\n productID: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number>;\n geoPricingOverrides?: GeoPricingOverrideInput[];\n duration: PlanDuration;\n pricingModel?: PricingModel;\n pricePerSeat?: number;\n minSeats?: number;\n maxSeats?: number;\n isActive: boolean;\n isPurchasable: boolean;\n features?: SubscriptionFeatures[];\n itemEntitlements?: SubscriptionEntitlement[];\n subscriptions?: BillingSubscription[];\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n product?: Product;\n}\n\nexport interface SubscriptionFeatures {\n id: string;\n planId?: string;\n addonId?: string;\n quotaId?: string;\n plan?: Plan;\n addon?: Addon;\n quota?: Quota;\n context?: Record<string, unknown>;\n}\n\nexport interface SubscriptionEntitlement {\n id: string;\n planId: string;\n itemId: string;\n accessType: EntitlementAccessType;\n discountPercentage?: number;\n plan?: Plan;\n item?: { id: string };\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// Subscription Types\n// ============================================================================\n\nexport interface BillingSubscription {\n id: string;\n billingAccountId: string;\n planId: string;\n status: SubscriptionStatus;\n startDate: string;\n endDate: string;\n autoRenewal: boolean;\n recurrence: boolean;\n seatCount?: number;\n lastSeatChangeAt?: string;\n lastBillingDate?: string;\n nextBillingDate?: string;\n lastRenewalDate?: string;\n canceledAt?: string;\n canceledBy?: string;\n cancellationReason?: string;\n stripeSubscriptionId?: string;\n razorpaySubscriptionId?: string;\n paymentGateway?: string;\n assignedWorkspaceId?: string | null;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n plan?: Plan;\n billingAccount?: BillingAccount;\n addonSubscriptions?: AddonSubscription[];\n quotas?: QuotaAssignment[];\n transactions?: Transaction[];\n history?: SubscriptionHistory[];\n}\n\nexport interface SubscriptionHistory {\n id: string;\n subscriptionId: string;\n fromStatus: SubscriptionStatus;\n toStatus: SubscriptionStatus;\n reason?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n}\n\n// ============================================================================\n// Addon Types\n// ============================================================================\n\nexport interface Addon {\n id: string;\n productID: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number>;\n geoPricingOverrides?: GeoPricingOverrideInput[];\n duration: PlanDuration;\n isActive: boolean;\n features?: SubscriptionFeatures[];\n addonSubscriptions?: AddonSubscription[];\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n product?: Product;\n}\n\nexport interface AddonSubscription {\n id: string;\n addonId: string;\n currentSubscriptionId: string;\n quantity: number;\n startDate: string;\n endDate: string;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n addon?: Addon;\n currentSubscription?: BillingSubscription;\n}\n\n// ============================================================================\n// Invoice Types\n// ============================================================================\n\nexport interface Invoice {\n id: string;\n orgId: string;\n billingAccountId?: string;\n subscriptionId?: string;\n paymentId?: string;\n invoiceNumber: string;\n status: InvoiceStatus;\n subtotal: number;\n tax: number;\n total: number;\n amountPaid: number;\n currency: string;\n dueDate?: string;\n paidAt?: string;\n gatewayInvoiceId?: string;\n invoiceUrl?: string;\n pdfUrl?: string;\n itemDescription?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n items: InvoiceItem[];\n subscription?: BillingSubscription;\n payment?: Payment;\n}\n\nexport interface InvoiceItem {\n id: string;\n invoiceId: string;\n description: string;\n quantity: number;\n unitPrice: number;\n amount: number;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Payment Types\n// ============================================================================\n\nexport interface Payment {\n id: string;\n orgId: string;\n transactionId?: string;\n amount: number;\n currency: string;\n status: PaymentStatus;\n method: PaymentMethodType;\n provider?: string;\n gatewayPaymentId?: string;\n gatewayOrderId?: string;\n failureReason?: string;\n paidAt?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n invoice?: Invoice;\n}\n\nexport interface PaymentMethod {\n id: string;\n orgId: string;\n billingAccountId?: string;\n type: PaymentMethodType;\n brand?: string;\n last4?: string;\n expiryMonth?: number;\n expiryYear?: number;\n isDefault: boolean;\n isVerified: boolean;\n verifiedAt?: string;\n stripeCustomerId?: string;\n stripePaymentMethodId?: string;\n razorpayCustomerId?: string;\n razorpayPaymentMethodId?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n billingAccount?: BillingAccount;\n transactions?: Transaction[];\n}\n\nexport interface Charge {\n id: string;\n orgId: string;\n amount: number;\n currency: string;\n status: ChargeStatus;\n description?: string;\n provider?: string;\n gatewayChargeId?: string;\n gatewayPaymentId?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n refunds: Refund[];\n}\n\nexport interface Refund {\n id: string;\n chargeId: string;\n amount: number;\n currency: string;\n status: RefundStatus;\n reason?: string;\n provider?: string;\n gatewayRefundId?: string;\n processedAt?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n charge?: Charge;\n}\n\n// ============================================================================\n// Transaction Types\n// ============================================================================\n\nexport interface Transaction {\n id: string;\n billingAccountId: string;\n amount: number;\n currency: string;\n type: TransactionType;\n status: TransactionStatus;\n description?: string;\n stripePaymentId?: string;\n razorpayPaymentId?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// Credit Types\n// ============================================================================\n\nexport interface CreditTransaction {\n id: string;\n billingAccountId: string;\n productId: string;\n amount: number;\n type: CreditTransactionType;\n status: CreditTransactionStatus;\n fromType?: CreditTransactionType | null;\n payoutRequestId?: string | null;\n entityType?: string;\n entityId?: string;\n transactionId?: string;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n billingAccount?: BillingAccount;\n transaction?: Transaction;\n}\n\nexport interface CreditBalanceByType {\n purchased: number;\n earned: number;\n granted: number;\n withdrawable: number;\n total: number;\n}\n\nexport interface CreditNote {\n id: string;\n orgId: string;\n invoiceId?: string;\n number: string;\n amount: number;\n currency: string;\n reason?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreditRate {\n id: string;\n rateUSD: number;\n effectiveFrom: string;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// Quota Types\n// ============================================================================\n\nexport interface Quota {\n id: string;\n name: string;\n limits: Record<string, unknown>;\n quotaType: QuotaType;\n reusable: boolean;\n resetPeriod: QuotaResetPeriod;\n isActive: boolean;\n subscriptions?: SubscriptionFeatures[];\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface QuotaAssignment {\n id: string;\n billingAccountId?: string;\n subscriptionId?: string;\n name: string;\n limits: Record<string, unknown>;\n quotaType: QuotaType;\n reusable: boolean;\n currentUsageSum: number;\n totalUsageCount: number;\n endtime: string;\n context?: Record<string, unknown>;\n createdAt: string;\n // Relations\n billingAccount?: BillingAccount;\n subscription?: BillingSubscription;\n usages?: Usage[];\n recentUsages?: Usage[];\n usageAnalytics?: QuotaUsageAnalytics;\n}\n\nexport interface QuotaAssignmentWithAnalytics extends QuotaAssignment {\n status: QuotaStatus;\n healthScore: number;\n usagePercentage: number;\n limitLeft: number;\n analytics: QuotaUsageAnalytics;\n}\n\nexport interface QuotaAssignmentUsageSummary {\n id: string;\n name: string;\n quotaType: QuotaType;\n reusable: boolean;\n limit: number;\n limitLeft: number;\n used: number;\n usagePercentage: number;\n noLimit: boolean;\n subscriptionId?: string;\n recentUsages: Usage[];\n createdAt: string;\n endtime: string;\n}\n\n// ============================================================================\n// Usage Types\n// ============================================================================\n\nexport interface Usage {\n id: string;\n quotaAssignmentId: string;\n userId?: string;\n productId?: string;\n amount: number;\n description?: string;\n tags?: Record<string, unknown>;\n timestamp: string;\n lastUpdated: string;\n context?: Record<string, unknown>;\n // Relations\n quotaAssignment?: QuotaAssignment;\n user?: { id: string };\n}\n\nexport interface UsageRecord {\n id: string;\n orgId: string;\n subscriptionId?: string;\n metricType: UsageMetricType;\n quantity: number;\n unitCost?: number;\n totalCost?: number;\n timestamp: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface DailyUsage {\n date: string;\n usage: number;\n count: number;\n}\n\nexport interface PeakUsage {\n peakDate: string;\n maxDailyUsage: number;\n peakHour?: number;\n}\n\nexport interface UsageTrends {\n averageDailyUsage?: number;\n growthRate?: number;\n predictedUsage?: number;\n}\n\nexport interface UsageByType {\n resourceType: string;\n usage: number;\n count: number;\n percentage: number;\n}\n\nexport interface QuotaUsageAnalytics {\n dailyUsage: DailyUsage[];\n usageByType: UsageByType[];\n peakUsage?: PeakUsage;\n trends?: UsageTrends;\n}\n\nexport interface QuotaUsageSummary {\n quotaId: string;\n quotaName: string;\n usage: number;\n limit: number;\n percentage: number;\n status: QuotaStatus;\n}\n\nexport interface UsageActivity {\n id: string;\n quotaName: string;\n amount: number;\n description: string;\n tags?: Record<string, unknown>;\n timestamp: string;\n}\n\nexport interface UsageDashboard {\n totalUsage: number;\n totalQuotas: number;\n activeQuotas: number;\n healthyQuotas: number;\n warningQuotas: number;\n criticalQuotas: number;\n exhaustedQuotas: number;\n topUsageByQuota: QuotaUsageSummary[];\n recentActivities: UsageActivity[];\n overallTrends: UsageTrends;\n}\n\nexport interface BillingAccountQuotasSummary {\n billingAccountId: string;\n totalUsage: number;\n totalLimit: number;\n pooledQuotas: QuotaAssignmentUsageSummary[];\n subscriptionQuotas: QuotaAssignmentUsageSummary[];\n}\n\n// ============================================================================\n// Other Types\n// ============================================================================\n\nexport interface Product {\n id: string;\n name: string;\n url?: string;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Discount {\n id: string;\n code: string;\n type: string;\n value: number;\n currency?: string;\n maxUses?: number;\n usedCount: number;\n validFrom: string;\n validUntil?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n transactions?: Transaction[];\n}\n\nexport interface TaxRate {\n id: string;\n country: string;\n state?: string;\n rate: number;\n description?: string;\n active: boolean;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface BillingNotification {\n id: string;\n orgId: string;\n type: string;\n message: string;\n sentAt?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n}\n\n// ============================================================================\n// Payment Initiation Types\n// ============================================================================\n\nexport interface InitiatePaymentInput {\n billingAccountId: string;\n purchaseType: PurchaseType;\n amount: number;\n currency: string;\n planId?: string;\n addonId?: string;\n quantity?: number;\n // Multiple addons support (cart checkout)\n addonIds?: string[];\n quantities?: number[];\n creditAmount?: number;\n productId?: string;\n provider?: PaymentProviderPreference;\n // Saved card support\n paymentMethodId?: string;\n saveCard?: boolean;\n // Plan change/upgrade support\n upgradeFromSubscriptionId?: string;\n // Plan downgrade — old sub auto-renewal cancelled, runs to natural expiry\n downgradeFromSubscriptionId?: string;\n metadata?: Record<string, unknown>;\n // Auto-renewal (for plan purchases)\n autoRenew?: boolean;\n autoRenewPaymentMethodId?: string;\n}\n\nexport interface InitiatePaymentResponse {\n success: boolean;\n provider: string;\n paymentId?: string;\n clientSecret?: string;\n orderId?: string;\n razorpayKeyId?: string;\n razorpayCustomerId?: string;\n prefillName?: string;\n prefillEmail?: string;\n prefillContact?: string;\n subtotal: number;\n taxAmount: number;\n taxRate: number;\n taxType: string;\n taxBreakdown?: Record<string, unknown>;\n jurisdiction: string;\n total: number;\n currency: string;\n error?: string;\n}\n\nexport interface VerifyPaymentMethodInput {\n billingAccountId: string;\n currency: string;\n provider?: PaymentProviderPreference;\n setAsDefault?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface VerifyPaymentMethodResponse {\n success: boolean;\n provider: string;\n orderId?: string;\n razorpayKeyId?: string;\n razorpayCustomerId?: string;\n clientSecret?: string;\n amount: number;\n currency: string;\n prefillName?: string;\n prefillEmail?: string;\n prefillContact?: string;\n error?: string;\n}\n\n// ============================================================================\n// Pagination Types\n// ============================================================================\n\nexport interface PaginationInput {\n page?: number;\n limit?: number;\n offset?: number;\n cursor?: string;\n}\n\nexport interface PaginatedResponse<T> {\n items: T[];\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n hasMore: boolean;\n}\n\nexport interface PaginatedCreditTransactions {\n creditTransactions: CreditTransaction[];\n page: number;\n pageSize: number;\n totalCount: number;\n hasMore: boolean;\n}\n\nexport interface PaginatedQuotaAssignments {\n quotaAssignments: QuotaAssignment[];\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\nexport interface PaginatedQuotaAssignmentsWithAnalytics {\n quotaAssignments: QuotaAssignmentWithAnalytics[];\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\nexport interface PaginatedUsages {\n usages: Usage[];\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\n// ============================================================================\n// Input Types\n// ============================================================================\n\nexport interface CreateBillingAccountInput {\n name: string;\n email: string;\n billingEmail?: string;\n currency?: string;\n taxId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateBillingAccountInput {\n id: string;\n name?: string;\n email?: string;\n billingEmail?: string;\n currency?: string;\n taxId?: string;\n isActive?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreatePaymentMethodInput {\n billingAccountId: string;\n type: PaymentMethodType;\n brand?: string;\n last4?: string;\n expiryMonth?: number;\n expiryYear?: number;\n isDefault?: boolean;\n stripePaymentMethodId?: string;\n razorpayPaymentMethodId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SetBillingAddressInput {\n billingAccountId: string;\n line1: string;\n line2?: string;\n city: string;\n state?: string;\n postalCode: string;\n country: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreatePlanInput {\n productId: string;\n name: string;\n price: number;\n currency?: string;\n duration: PlanDuration;\n isPurchasable?: boolean;\n quotas: { quotaId: string; quantity: number }[];\n geoPricingOverrides?: GeoPricingOverrideInput[];\n currencyPriceOverrides?: CurrencyPriceOverrideInput[];\n}\n\nexport interface UpdatePlanInput {\n id: string;\n name?: string;\n price?: number;\n currency?: string;\n duration?: PlanDuration;\n isActive?: boolean;\n isPurchasable?: boolean;\n quotas: { quotaId: string; quantity: number }[];\n geoPricingOverrides?: GeoPricingOverrideInput[];\n currencyPriceOverrides?: CurrencyPriceOverrideInput[];\n}\n\nexport interface GeoPricingOverrideInput {\n country?: string;\n state?: string;\n region?: string;\n currency: string;\n amount?: number;\n perSeatAmount?: number;\n}\n\nexport interface CurrencyPriceOverrideInput {\n currency: string;\n amount: number;\n perSeatAmount?: number;\n}\n\nexport interface CreateAddonInput {\n productId: string;\n name: string;\n price: number;\n currency: string;\n duration: PlanDuration;\n quotas: { quotaId: string; quantity: number }[];\n geoPricingOverrides?: GeoPricingOverrideInput[];\n currencyPriceOverrides?: CurrencyPriceOverrideInput[];\n}\n\nexport interface UpdateAddonInput {\n id: string;\n name?: string;\n price?: number;\n currency?: string;\n duration?: PlanDuration;\n isActive?: boolean;\n quotas: { quotaId: string; quantity: number }[];\n geoPricingOverrides?: GeoPricingOverrideInput[];\n currencyPriceOverrides?: CurrencyPriceOverrideInput[];\n}\n\nexport interface CreateQuotaInput {\n name: string;\n limits: Record<string, unknown>;\n quotaType?: QuotaType;\n reusable: boolean;\n resetPeriod?: QuotaResetPeriod;\n context?: Record<string, unknown>;\n}\n\nexport interface UpdateQuotaInput {\n id: string;\n name?: string;\n limits?: Record<string, unknown>;\n reusable?: boolean;\n isActive: boolean;\n resetPeriod?: QuotaResetPeriod;\n context?: Record<string, unknown>;\n}\n\nexport interface SpendCreditsInput {\n billingAccountId: string;\n planId?: string;\n storeItemId?: string;\n isAnnual?: boolean;\n addOnIds?: { id: string; quantity?: number }[];\n upgradeFromSubscriptionId?: string;\n subscriptionId?: string;\n /** Seat count for PER_SEAT plans. Credits charged = pricePerSeat × seatCount. */\n seatCount?: number;\n}\n\nexport interface CancelSubscriptionInput {\n billingAccountId: string;\n subscriptionId: string;\n reason?: string;\n canceledBy?: string;\n}\n\nexport interface UpdateSubscriptionSeatsInput {\n subscriptionId: string;\n seatCount: number;\n}\n\nexport interface CreateEntitlementInput {\n planId: string;\n itemId: string;\n accessType: EntitlementAccessType;\n discountPercentage?: number;\n}\n\nexport interface UpdateEntitlementInput {\n id: string;\n accessType?: EntitlementAccessType;\n discountPercentage?: number;\n}\n\n// ============================================================================\n// Filter & Sort Types\n// ============================================================================\n\nexport interface DateRangeInput {\n from?: string;\n to?: string;\n}\n\nexport interface AmountRangeInput {\n min?: number;\n max?: number;\n}\n\nexport interface ContextFilterInput {\n orgId?: string;\n userId?: string;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n}\n\nexport interface ContextInput {\n orgId?: string;\n userId?: string;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n custom?: Record<string, unknown>;\n}\n"],"mappings":";AASA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,SAAA,UACA,EAAA,WAAA,YACA,EAAA,UAAA,WACA,EAAA,WAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,QAAA,SACA,EAAA,OAAA,QACA,EAAA,OAAA,QACA,EAAA,OAAA,QACA,EAAA,gBAAA;KACD,EAkCW,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,SAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,YAAA,aACA,EAAA,WAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,SAAA,UACA,EAAA,mBAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,QAAA,SACA,EAAA,QAAA,SACA,EAAA,UAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,UAAA,WACA,EAAA,WAAA,YACA,EAAA,YAAA,aACA,EAAA,WAAA;KACD,EAQW,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,UAAA,WACA,EAAA,SAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,WAAA,YACA,EAAA,QAAA,SACA,EAAA,aAAA,cACA,EAAA,UAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,UAAA,WACA,EAAA,SAAA,UACA,EAAA,SAAA;KACD,EAaW,IAAL,yBAAA,GAAA;QACL,EAAA,OAAA,QACA,EAAA,SAAA,UACA,EAAA,WAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,cAAA,eACA,EAAA,eAAA,gBACA,EAAA,eAAA,gBACA,EAAA,aAAA,cACA,EAAA,gBAAA;KACD"}
1
+ {"version":3,"file":"graphql.js","names":[],"sources":["../../../../src/billing/shared/types/graphql.ts"],"sourcesContent":["/**\n * GraphQL Types for Billing Module\n * Auto-generated types matching the backend billing service schema\n */\n\n// ============================================================================\n// Enums\n// ============================================================================\n\nexport enum SubscriptionStatus {\n ACTIVE = 'active',\n CANCELED = 'canceled',\n EXPIRED = 'expired',\n UPGRADED = 'upgraded',\n}\n\nexport enum InvoiceStatus {\n DRAFT = 'DRAFT',\n OPEN = 'OPEN',\n PAID = 'PAID',\n VOID = 'VOID',\n UNCOLLECTIBLE = 'UNCOLLECTIBLE',\n}\n\nexport enum PaymentStatus {\n PENDING = 'PENDING',\n SUCCEEDED = 'SUCCEEDED',\n FAILED = 'FAILED',\n CANCELED = 'CANCELED',\n REFUNDED = 'REFUNDED',\n}\n\nexport enum ChargeStatus {\n PENDING = 'PENDING',\n SUCCEEDED = 'SUCCEEDED',\n FAILED = 'FAILED',\n REFUNDED = 'REFUNDED',\n}\n\nexport enum RefundStatus {\n PENDING = 'PENDING',\n SUCCEEDED = 'SUCCEEDED',\n FAILED = 'FAILED',\n CANCELED = 'CANCELED',\n}\n\nexport enum PaymentMethodType {\n CREDIT_CARD = 'CREDIT_CARD',\n DEBIT_CARD = 'DEBIT_CARD',\n BANK_TRANSFER = 'BANK_TRANSFER',\n PAYPAL = 'PAYPAL',\n CRYPTO = 'CRYPTO',\n WALLET = 'WALLET',\n NETBANKING = 'NETBANKING',\n}\n\nexport enum PlanDuration {\n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n}\n\nexport enum PricingModel {\n FLAT_RATE = 'FLAT_RATE',\n PER_SEAT = 'PER_SEAT',\n}\n\nexport enum QuotaType {\n POOLED = 'POOLED',\n PRODUCT_SPECIFIC = 'PRODUCT_SPECIFIC',\n}\n\nexport enum QuotaScope {\n WORKSPACE = 'WORKSPACE',\n GLOBAL = 'GLOBAL',\n}\n\nexport enum QuotaResetPeriod {\n NEVER = 'NEVER',\n DAILY = 'DAILY',\n MONTHLY = 'MONTHLY',\n}\n\nexport enum QuotaStatus {\n HEALTHY = 'HEALTHY',\n WARNING = 'WARNING',\n CRITICAL = 'CRITICAL',\n EXHAUSTED = 'EXHAUSTED',\n INACTIVE = 'INACTIVE',\n}\n\nexport enum TransactionType {\n PAYMENT = 'payment',\n REFUND = 'refund',\n ADJUSTMENT = 'adjustment',\n}\n\nexport enum TransactionStatus {\n PENDING = 'pending',\n SUCCESS = 'success',\n FAILED = 'failed',\n}\n\nexport enum CreditTransactionType {\n PURCHASE = 'purchase',\n USAGE = 'usage',\n ADJUSTMENT = 'adjustment',\n GRANTED = 'granted',\n}\n\nexport enum CreditTransactionStatus {\n PENDING = 'pending',\n SUCCESS = 'success',\n FAILED = 'failed',\n REFUND = 'refund',\n}\n\nexport enum EntitlementAccessType {\n FREE_ACCESS = 'FREE_ACCESS',\n DISCOUNT = 'DISCOUNT',\n}\n\nexport enum PurchaseType {\n PLAN = 'PLAN',\n ADDON = 'ADDON',\n CREDITS = 'CREDITS',\n}\n\nexport enum PaymentProviderPreference {\n AUTO = 'AUTO',\n STRIPE = 'STRIPE',\n RAZORPAY = 'RAZORPAY',\n}\n\nexport enum AnalyticsPeriod {\n LAST_7_DAYS = 'LAST_7_DAYS',\n LAST_30_DAYS = 'LAST_30_DAYS',\n LAST_90_DAYS = 'LAST_90_DAYS',\n LAST_MONTH = 'LAST_MONTH',\n CURRENT_MONTH = 'CURRENT_MONTH',\n}\n\nexport enum UsageMetricType {\n USERS = 'USERS',\n STORAGE = 'STORAGE',\n API_CALLS = 'API_CALLS',\n BANDWIDTH = 'BANDWIDTH',\n REQUESTS = 'REQUESTS',\n COMPUTE_HOURS = 'COMPUTE_HOURS',\n TRANSACTIONS = 'TRANSACTIONS',\n CUSTOM = 'CUSTOM',\n}\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport interface BillingAccount {\n id: string;\n orgId: string;\n name: string;\n email: string;\n billingEmail?: string;\n currency: string;\n creditAmount: number;\n stripeCustomerId?: string;\n razorpayCustomerId?: string;\n defaultPaymentMethod?: string;\n taxId?: string;\n isActive: boolean;\n isDefault?: boolean;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n subscriptions?: BillingSubscription[];\n paymentMethods?: PaymentMethod[];\n creditTransactions?: CreditTransaction[];\n quotaAssignments?: QuotaAssignment[];\n billingAddresses?: BillingAddress[];\n transactions?: Transaction[];\n}\n\nexport interface BillingAddress {\n id: string;\n billingAccountId: string;\n orgId: string;\n line1: string;\n line2?: string;\n city: string;\n state?: string;\n postalCode: string;\n country: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// Plan Types\n// ============================================================================\n\nexport interface Plan {\n id: string;\n productID: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number>;\n geoPricingOverrides?: GeoPricingOverrideInput[];\n duration: PlanDuration;\n pricingModel?: PricingModel;\n pricePerSeat?: number;\n minSeats?: number;\n maxSeats?: number;\n isActive: boolean;\n isPurchasable: boolean;\n features?: SubscriptionFeatures[];\n itemEntitlements?: SubscriptionEntitlement[];\n subscriptions?: BillingSubscription[];\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n product?: Product;\n}\n\nexport interface SubscriptionFeatures {\n id: string;\n planId?: string;\n addonId?: string;\n quotaId?: string;\n plan?: Plan;\n addon?: Addon;\n quota?: Quota;\n context?: Record<string, unknown>;\n}\n\nexport interface SubscriptionEntitlement {\n id: string;\n planId: string;\n itemId: string;\n accessType: EntitlementAccessType;\n discountPercentage?: number;\n plan?: Plan;\n item?: { id: string };\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// Subscription Types\n// ============================================================================\n\nexport interface BillingSubscription {\n id: string;\n billingAccountId: string;\n planId: string;\n status: SubscriptionStatus;\n startDate: string;\n endDate: string;\n autoRenewal: boolean;\n recurrence: boolean;\n seatCount?: number;\n lastSeatChangeAt?: string;\n lastBillingDate?: string;\n nextBillingDate?: string;\n lastRenewalDate?: string;\n canceledAt?: string;\n canceledBy?: string;\n cancellationReason?: string;\n stripeSubscriptionId?: string;\n razorpaySubscriptionId?: string;\n paymentGateway?: string;\n assignedWorkspaceId?: string | null;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n plan?: Plan;\n billingAccount?: BillingAccount;\n addonSubscriptions?: AddonSubscription[];\n quotas?: QuotaAssignment[];\n transactions?: Transaction[];\n history?: SubscriptionHistory[];\n}\n\nexport interface SubscriptionHistory {\n id: string;\n subscriptionId: string;\n fromStatus: SubscriptionStatus;\n toStatus: SubscriptionStatus;\n reason?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n}\n\n// ============================================================================\n// Addon Types\n// ============================================================================\n\nexport interface Addon {\n id: string;\n productID: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number>;\n geoPricingOverrides?: GeoPricingOverrideInput[];\n duration: PlanDuration;\n isActive: boolean;\n features?: SubscriptionFeatures[];\n addonSubscriptions?: AddonSubscription[];\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n product?: Product;\n}\n\nexport interface AddonSubscription {\n id: string;\n addonId: string;\n currentSubscriptionId: string;\n quantity: number;\n startDate: string;\n endDate: string;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n addon?: Addon;\n currentSubscription?: BillingSubscription;\n}\n\n// ============================================================================\n// Invoice Types\n// ============================================================================\n\nexport interface Invoice {\n id: string;\n orgId: string;\n billingAccountId?: string;\n subscriptionId?: string;\n paymentId?: string;\n invoiceNumber: string;\n status: InvoiceStatus;\n subtotal: number;\n tax: number;\n total: number;\n amountPaid: number;\n currency: string;\n dueDate?: string;\n paidAt?: string;\n gatewayInvoiceId?: string;\n invoiceUrl?: string;\n pdfUrl?: string;\n itemDescription?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n items: InvoiceItem[];\n subscription?: BillingSubscription;\n payment?: Payment;\n}\n\nexport interface InvoiceItem {\n id: string;\n invoiceId: string;\n description: string;\n quantity: number;\n unitPrice: number;\n amount: number;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Payment Types\n// ============================================================================\n\nexport interface Payment {\n id: string;\n orgId: string;\n transactionId?: string;\n amount: number;\n currency: string;\n status: PaymentStatus;\n method: PaymentMethodType;\n provider?: string;\n gatewayPaymentId?: string;\n gatewayOrderId?: string;\n failureReason?: string;\n paidAt?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n invoice?: Invoice;\n}\n\nexport interface PaymentMethod {\n id: string;\n orgId: string;\n billingAccountId?: string;\n type: PaymentMethodType;\n brand?: string;\n last4?: string;\n expiryMonth?: number;\n expiryYear?: number;\n isDefault: boolean;\n isVerified: boolean;\n verifiedAt?: string;\n stripeCustomerId?: string;\n stripePaymentMethodId?: string;\n razorpayCustomerId?: string;\n razorpayPaymentMethodId?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n billingAccount?: BillingAccount;\n transactions?: Transaction[];\n}\n\nexport interface Charge {\n id: string;\n orgId: string;\n amount: number;\n currency: string;\n status: ChargeStatus;\n description?: string;\n provider?: string;\n gatewayChargeId?: string;\n gatewayPaymentId?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n refunds: Refund[];\n}\n\nexport interface Refund {\n id: string;\n chargeId: string;\n amount: number;\n currency: string;\n status: RefundStatus;\n reason?: string;\n provider?: string;\n gatewayRefundId?: string;\n processedAt?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n charge?: Charge;\n}\n\n// ============================================================================\n// Transaction Types\n// ============================================================================\n\nexport interface Transaction {\n id: string;\n billingAccountId: string;\n amount: number;\n currency: string;\n type: TransactionType;\n status: TransactionStatus;\n description?: string;\n stripePaymentId?: string;\n razorpayPaymentId?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// Credit Types\n// ============================================================================\n\nexport interface CreditTransaction {\n id: string;\n billingAccountId: string;\n productId: string;\n amount: number;\n type: CreditTransactionType;\n status: CreditTransactionStatus;\n fromType?: CreditTransactionType | null;\n payoutRequestId?: string | null;\n entityType?: string;\n entityId?: string;\n transactionId?: string;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n // Relations\n billingAccount?: BillingAccount;\n transaction?: Transaction;\n}\n\nexport interface CreditBalanceByType {\n purchased: number;\n earned: number;\n granted: number;\n withdrawable: number;\n total: number;\n}\n\nexport interface CreditNote {\n id: string;\n orgId: string;\n invoiceId?: string;\n number: string;\n amount: number;\n currency: string;\n reason?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreditRate {\n id: string;\n rateUSD: number;\n effectiveFrom: string;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// Quota Types\n// ============================================================================\n\nexport interface Quota {\n id: string;\n name: string;\n limits: Record<string, unknown>;\n quotaType: QuotaType;\n reusable: boolean;\n resetPeriod: QuotaResetPeriod;\n isActive: boolean;\n scope?: QuotaScope;\n subscriptions?: SubscriptionFeatures[];\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface QuotaAssignment {\n id: string;\n billingAccountId?: string;\n subscriptionId?: string;\n name: string;\n limits: Record<string, unknown>;\n quotaType: QuotaType;\n reusable: boolean;\n currentUsageSum: number;\n totalUsageCount: number;\n endtime: string;\n context?: Record<string, unknown>;\n createdAt: string;\n // Relations\n billingAccount?: BillingAccount;\n subscription?: BillingSubscription;\n usages?: Usage[];\n recentUsages?: Usage[];\n usageAnalytics?: QuotaUsageAnalytics;\n}\n\nexport interface QuotaAssignmentWithAnalytics extends QuotaAssignment {\n status: QuotaStatus;\n healthScore: number;\n usagePercentage: number;\n limitLeft: number;\n analytics: QuotaUsageAnalytics;\n}\n\nexport interface QuotaAssignmentUsageSummary {\n id: string;\n name: string;\n quotaType: QuotaType;\n reusable: boolean;\n limit: number;\n limitLeft: number;\n used: number;\n usagePercentage: number;\n noLimit: boolean;\n subscriptionId?: string;\n recentUsages: Usage[];\n createdAt: string;\n endtime: string;\n}\n\n// ============================================================================\n// Usage Types\n// ============================================================================\n\nexport interface Usage {\n id: string;\n quotaAssignmentId: string;\n userId?: string;\n productId?: string;\n amount: number;\n description?: string;\n tags?: Record<string, unknown>;\n timestamp: string;\n lastUpdated: string;\n context?: Record<string, unknown>;\n // Relations\n quotaAssignment?: QuotaAssignment;\n user?: { id: string };\n}\n\nexport interface UsageRecord {\n id: string;\n orgId: string;\n subscriptionId?: string;\n metricType: UsageMetricType;\n quantity: number;\n unitCost?: number;\n totalCost?: number;\n timestamp: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface DailyUsage {\n date: string;\n usage: number;\n count: number;\n}\n\nexport interface PeakUsage {\n peakDate: string;\n maxDailyUsage: number;\n peakHour?: number;\n}\n\nexport interface UsageTrends {\n averageDailyUsage?: number;\n growthRate?: number;\n predictedUsage?: number;\n}\n\nexport interface UsageByType {\n resourceType: string;\n usage: number;\n count: number;\n percentage: number;\n}\n\nexport interface QuotaUsageAnalytics {\n dailyUsage: DailyUsage[];\n usageByType: UsageByType[];\n peakUsage?: PeakUsage;\n trends?: UsageTrends;\n}\n\nexport interface QuotaUsageSummary {\n quotaId: string;\n quotaName: string;\n usage: number;\n limit: number;\n percentage: number;\n status: QuotaStatus;\n}\n\nexport interface UsageActivity {\n id: string;\n quotaName: string;\n amount: number;\n description: string;\n tags?: Record<string, unknown>;\n timestamp: string;\n}\n\nexport interface UsageDashboard {\n totalUsage: number;\n totalQuotas: number;\n activeQuotas: number;\n healthyQuotas: number;\n warningQuotas: number;\n criticalQuotas: number;\n exhaustedQuotas: number;\n topUsageByQuota: QuotaUsageSummary[];\n recentActivities: UsageActivity[];\n overallTrends: UsageTrends;\n}\n\nexport interface BillingAccountQuotasSummary {\n billingAccountId: string;\n totalUsage: number;\n totalLimit: number;\n pooledQuotas: QuotaAssignmentUsageSummary[];\n subscriptionQuotas: QuotaAssignmentUsageSummary[];\n}\n\n// ============================================================================\n// Other Types\n// ============================================================================\n\nexport interface Product {\n id: string;\n name: string;\n url?: string;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Discount {\n id: string;\n code: string;\n type: string;\n value: number;\n currency?: string;\n maxUses?: number;\n usedCount: number;\n validFrom: string;\n validUntil?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n transactions?: Transaction[];\n}\n\nexport interface TaxRate {\n id: string;\n country: string;\n state?: string;\n rate: number;\n description?: string;\n active: boolean;\n context?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface BillingNotification {\n id: string;\n orgId: string;\n type: string;\n message: string;\n sentAt?: string;\n metadata?: Record<string, unknown>;\n context?: Record<string, unknown>;\n createdAt: string;\n}\n\n// ============================================================================\n// Payment Initiation Types\n// ============================================================================\n\nexport interface InitiatePaymentInput {\n billingAccountId: string;\n purchaseType: PurchaseType;\n amount: number;\n currency: string;\n planId?: string;\n addonId?: string;\n quantity?: number;\n // Multiple addons support (cart checkout)\n addonIds?: string[];\n quantities?: number[];\n creditAmount?: number;\n productId?: string;\n provider?: PaymentProviderPreference;\n // Saved card support\n paymentMethodId?: string;\n saveCard?: boolean;\n // Plan change/upgrade support\n upgradeFromSubscriptionId?: string;\n // Plan downgrade — old sub auto-renewal cancelled, runs to natural expiry\n downgradeFromSubscriptionId?: string;\n metadata?: Record<string, unknown>;\n // Auto-renewal (for plan purchases)\n autoRenew?: boolean;\n autoRenewPaymentMethodId?: string;\n}\n\nexport interface InitiatePaymentResponse {\n success: boolean;\n provider: string;\n paymentId?: string;\n clientSecret?: string;\n orderId?: string;\n razorpayKeyId?: string;\n razorpayCustomerId?: string;\n prefillName?: string;\n prefillEmail?: string;\n prefillContact?: string;\n subtotal: number;\n taxAmount: number;\n taxRate: number;\n taxType: string;\n taxBreakdown?: Record<string, unknown>;\n jurisdiction: string;\n total: number;\n currency: string;\n error?: string;\n}\n\nexport interface VerifyPaymentMethodInput {\n billingAccountId: string;\n currency: string;\n provider?: PaymentProviderPreference;\n setAsDefault?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface VerifyPaymentMethodResponse {\n success: boolean;\n provider: string;\n orderId?: string;\n razorpayKeyId?: string;\n razorpayCustomerId?: string;\n clientSecret?: string;\n amount: number;\n currency: string;\n prefillName?: string;\n prefillEmail?: string;\n prefillContact?: string;\n error?: string;\n}\n\n// ============================================================================\n// Pagination Types\n// ============================================================================\n\nexport interface PaginationInput {\n page?: number;\n limit?: number;\n offset?: number;\n cursor?: string;\n}\n\nexport interface PaginatedResponse<T> {\n items: T[];\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n hasMore: boolean;\n}\n\nexport interface PaginatedCreditTransactions {\n creditTransactions: CreditTransaction[];\n page: number;\n pageSize: number;\n totalCount: number;\n hasMore: boolean;\n}\n\nexport interface PaginatedQuotaAssignments {\n quotaAssignments: QuotaAssignment[];\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\nexport interface PaginatedQuotaAssignmentsWithAnalytics {\n quotaAssignments: QuotaAssignmentWithAnalytics[];\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\nexport interface PaginatedUsages {\n usages: Usage[];\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\n// ============================================================================\n// Input Types\n// ============================================================================\n\nexport interface CreateBillingAccountInput {\n name: string;\n email: string;\n billingEmail?: string;\n currency?: string;\n taxId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateBillingAccountInput {\n id: string;\n name?: string;\n email?: string;\n billingEmail?: string;\n currency?: string;\n taxId?: string;\n isActive?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreatePaymentMethodInput {\n billingAccountId: string;\n type: PaymentMethodType;\n brand?: string;\n last4?: string;\n expiryMonth?: number;\n expiryYear?: number;\n isDefault?: boolean;\n stripePaymentMethodId?: string;\n razorpayPaymentMethodId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SetBillingAddressInput {\n billingAccountId: string;\n line1: string;\n line2?: string;\n city: string;\n state?: string;\n postalCode: string;\n country: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreatePlanInput {\n productId: string;\n name: string;\n price: number;\n currency?: string;\n duration: PlanDuration;\n isPurchasable?: boolean;\n quotas: { quotaId: string; quantity: number }[];\n geoPricingOverrides?: GeoPricingOverrideInput[];\n currencyPriceOverrides?: CurrencyPriceOverrideInput[];\n}\n\nexport interface UpdatePlanInput {\n id: string;\n name?: string;\n price?: number;\n currency?: string;\n duration?: PlanDuration;\n isActive?: boolean;\n isPurchasable?: boolean;\n quotas: { quotaId: string; quantity: number }[];\n geoPricingOverrides?: GeoPricingOverrideInput[];\n currencyPriceOverrides?: CurrencyPriceOverrideInput[];\n}\n\nexport interface GeoPricingOverrideInput {\n country?: string;\n state?: string;\n region?: string;\n currency: string;\n amount?: number;\n perSeatAmount?: number;\n}\n\nexport interface CurrencyPriceOverrideInput {\n currency: string;\n amount: number;\n perSeatAmount?: number;\n}\n\nexport interface CreateAddonInput {\n productId: string;\n name: string;\n price: number;\n currency: string;\n duration: PlanDuration;\n quotas: { quotaId: string; quantity: number }[];\n geoPricingOverrides?: GeoPricingOverrideInput[];\n currencyPriceOverrides?: CurrencyPriceOverrideInput[];\n}\n\nexport interface UpdateAddonInput {\n id: string;\n name?: string;\n price?: number;\n currency?: string;\n duration?: PlanDuration;\n isActive?: boolean;\n quotas: { quotaId: string; quantity: number }[];\n geoPricingOverrides?: GeoPricingOverrideInput[];\n currencyPriceOverrides?: CurrencyPriceOverrideInput[];\n}\n\nexport interface CreateQuotaInput {\n name: string;\n limits: Record<string, unknown>;\n quotaType?: QuotaType;\n reusable: boolean;\n resetPeriod?: QuotaResetPeriod;\n context?: Record<string, unknown>;\n}\n\nexport interface UpdateQuotaInput {\n id: string;\n name?: string;\n limits?: Record<string, unknown>;\n reusable?: boolean;\n isActive: boolean;\n resetPeriod?: QuotaResetPeriod;\n context?: Record<string, unknown>;\n}\n\nexport interface SpendCreditsInput {\n billingAccountId: string;\n planId?: string;\n storeItemId?: string;\n isAnnual?: boolean;\n addOnIds?: { id: string; quantity?: number }[];\n upgradeFromSubscriptionId?: string;\n subscriptionId?: string;\n /** Seat count for PER_SEAT plans. Credits charged = pricePerSeat × seatCount. */\n seatCount?: number;\n}\n\nexport interface CancelSubscriptionInput {\n billingAccountId: string;\n subscriptionId: string;\n reason?: string;\n canceledBy?: string;\n}\n\nexport interface UpdateSubscriptionSeatsInput {\n subscriptionId: string;\n seatCount: number;\n}\n\nexport interface CreateEntitlementInput {\n planId: string;\n itemId: string;\n accessType: EntitlementAccessType;\n discountPercentage?: number;\n}\n\nexport interface UpdateEntitlementInput {\n id: string;\n accessType?: EntitlementAccessType;\n discountPercentage?: number;\n}\n\n// ============================================================================\n// Filter & Sort Types\n// ============================================================================\n\nexport interface DateRangeInput {\n from?: string;\n to?: string;\n}\n\nexport interface AmountRangeInput {\n min?: number;\n max?: number;\n}\n\nexport interface ContextFilterInput {\n orgId?: string;\n userId?: string;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n}\n\nexport interface ContextInput {\n orgId?: string;\n userId?: string;\n workspaceId?: string;\n organizationId?: string;\n projectId?: string;\n custom?: Record<string, unknown>;\n}\n"],"mappings":";AASA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,SAAA,UACA,EAAA,WAAA,YACA,EAAA,UAAA,WACA,EAAA,WAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,QAAA,SACA,EAAA,OAAA,QACA,EAAA,OAAA,QACA,EAAA,OAAA,QACA,EAAA,gBAAA;KACD,EAkCW,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,SAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,YAAA,aACA,EAAA,WAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,SAAA,UACA,EAAA,mBAAA;KACD,EAOW,IAAL,yBAAA,GAAA;QACL,EAAA,QAAA,SACA,EAAA,QAAA,SACA,EAAA,UAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,UAAA,WACA,EAAA,WAAA,YACA,EAAA,YAAA,aACA,EAAA,WAAA;KACD,EAQW,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,UAAA,WACA,EAAA,SAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,WAAA,YACA,EAAA,QAAA,SACA,EAAA,aAAA,cACA,EAAA,UAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,UAAA,WACA,EAAA,SAAA,UACA,EAAA,SAAA;KACD,EAaW,IAAL,yBAAA,GAAA;QACL,EAAA,OAAA,QACA,EAAA,SAAA,UACA,EAAA,WAAA;KACD,EAEW,IAAL,yBAAA,GAAA;QACL,EAAA,cAAA,eACA,EAAA,eAAA,gBACA,EAAA,eAAA,gBACA,EAAA,aAAA,cACA,EAAA,gBAAA;KACD"}