@mindbill/browser 0.3.0 → 0.6.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/README.md +29 -7
- package/dist/index.d.ts +79 -19
- package/dist/index.js +23 -71
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,19 +8,41 @@ the Partner API key never reaches the browser.
|
|
|
8
8
|
import { createBillLifecycleClient } from "@mindbill/browser";
|
|
9
9
|
|
|
10
10
|
const billing = createBillLifecycleClient({
|
|
11
|
+
billId: "bill_123",
|
|
11
12
|
sessionEndpoint: "/api/mindbill/session",
|
|
12
13
|
});
|
|
13
14
|
|
|
14
|
-
const
|
|
15
|
+
const data = await billing.getLifecycle();
|
|
16
|
+
const packet = await billing.getPacket();
|
|
15
17
|
```
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
The browser client operates only on an already-submitted bill. It loads the
|
|
20
|
+
immutable snapshot, server-owned activity history, current lifecycle actions,
|
|
21
|
+
EORs, and the complete submission packet. It can execute only actions authorized
|
|
22
|
+
by the server, including Second Bill Review, payment posting, close, and reopen.
|
|
23
|
+
Bill creation, document selection, review, and the atomic submission stay on the partner server.
|
|
24
|
+
The public lifecycle begins at `submitted`, then advances through `accepted`,
|
|
25
|
+
`processed`, and `closed`; it never exposes draft or queued states. The same
|
|
26
|
+
lifecycle client is safe to use from React, Angular, or plain JavaScript.
|
|
20
27
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
Pre-submission components can query canonical routing reference data without
|
|
29
|
+
inventing a draft bill:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { createBillReferenceClient } from "@mindbill/browser";
|
|
33
|
+
|
|
34
|
+
const references = createBillReferenceClient({
|
|
35
|
+
sessionEndpoint: "/api/mindbill/session",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const payers = await references.searchClaimsAdministrators("Zurich", "claim-123");
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This client exposes reference-data operations only. It never creates or mutates
|
|
42
|
+
a bill; the first persisted bill remains the submitted immutable snapshot.
|
|
43
|
+
|
|
44
|
+
Pass `billId` for the submitted bill. An optional `resource: { billId }`
|
|
45
|
+
restriction makes the session usable for only that bill.
|
|
24
46
|
|
|
25
47
|
The session endpoint is the only required partner-server integration. See the
|
|
26
48
|
[10-minute quickstart](https://docs.mindbill.org/quickstart).
|
package/dist/index.d.ts
CHANGED
|
@@ -112,6 +112,13 @@ type BillReviewData = {
|
|
|
112
112
|
middleName?: string;
|
|
113
113
|
lastName?: string;
|
|
114
114
|
dob?: string;
|
|
115
|
+
phone?: string;
|
|
116
|
+
address?: {
|
|
117
|
+
line1?: string;
|
|
118
|
+
city?: string;
|
|
119
|
+
state?: string;
|
|
120
|
+
postalCode?: string;
|
|
121
|
+
};
|
|
115
122
|
};
|
|
116
123
|
injury: {
|
|
117
124
|
claimNumber?: string;
|
|
@@ -122,6 +129,8 @@ type BillReviewData = {
|
|
|
122
129
|
adjNumber?: string;
|
|
123
130
|
claimsAdminId?: string;
|
|
124
131
|
claimsAdminName?: string;
|
|
132
|
+
injuryDescription?: string;
|
|
133
|
+
diagnosisCodes?: string[];
|
|
125
134
|
claimPatternStatus?: BillReviewClaimPatternStatus;
|
|
126
135
|
};
|
|
127
136
|
};
|
|
@@ -187,6 +196,9 @@ type BillDeliveryOptions = {
|
|
|
187
196
|
claimsEmail?: string | null;
|
|
188
197
|
portalUrl?: string | null;
|
|
189
198
|
mailingAddress?: string | null;
|
|
199
|
+
adjusterName?: string | null;
|
|
200
|
+
adjusterPhone?: string | null;
|
|
201
|
+
adjusterEmail?: string | null;
|
|
190
202
|
};
|
|
191
203
|
};
|
|
192
204
|
type SubmitBillInput = {
|
|
@@ -200,7 +212,7 @@ type SubmitBillInput = {
|
|
|
200
212
|
subject?: string;
|
|
201
213
|
note?: string;
|
|
202
214
|
};
|
|
203
|
-
type BillLifecycleActionId = "
|
|
215
|
+
type BillLifecycleActionId = "second_review" | "independent_bill_review" | "view_eor" | "post_payment" | "close" | "reopen";
|
|
204
216
|
type BillLifecycleAction = {
|
|
205
217
|
id: BillLifecycleActionId;
|
|
206
218
|
label: string;
|
|
@@ -215,6 +227,44 @@ type BillEorDocument = {
|
|
|
215
227
|
addedAt: string;
|
|
216
228
|
contentUrl: string;
|
|
217
229
|
};
|
|
230
|
+
type BillActivityRecord = {
|
|
231
|
+
id: string;
|
|
232
|
+
type: string;
|
|
233
|
+
createdAt: string;
|
|
234
|
+
title?: string;
|
|
235
|
+
description: string;
|
|
236
|
+
actor: string | null;
|
|
237
|
+
delivery: BillSubmissionRoute | null;
|
|
238
|
+
amount: number | null;
|
|
239
|
+
accepted: boolean | null;
|
|
240
|
+
stcCategory: string | null;
|
|
241
|
+
};
|
|
242
|
+
type BillPaymentRecord = {
|
|
243
|
+
id: string;
|
|
244
|
+
method: "check" | "eft";
|
|
245
|
+
checkNumber: string;
|
|
246
|
+
status: string | null;
|
|
247
|
+
depositDate: string | null;
|
|
248
|
+
checkReceived: boolean | null;
|
|
249
|
+
receivedDate: string | null;
|
|
250
|
+
amount: number;
|
|
251
|
+
feeAmount: number | null;
|
|
252
|
+
feeReason: string | null;
|
|
253
|
+
source: "paper" | "835" | "portal";
|
|
254
|
+
postedAt: string;
|
|
255
|
+
updatedAt: string | null;
|
|
256
|
+
note: string | null;
|
|
257
|
+
};
|
|
258
|
+
type BillRemittanceSummary = {
|
|
259
|
+
payerReportedPaid: number | null;
|
|
260
|
+
totalPaid: number;
|
|
261
|
+
balanceDue: number;
|
|
262
|
+
denialReason: string | null;
|
|
263
|
+
};
|
|
264
|
+
type BillLifecycleDelivery = {
|
|
265
|
+
payerName: string;
|
|
266
|
+
contacts: BillDeliveryOptions["contacts"];
|
|
267
|
+
};
|
|
218
268
|
type BillLifecycleData = BillReviewData & {
|
|
219
269
|
lifecycle: {
|
|
220
270
|
state: string;
|
|
@@ -225,6 +275,10 @@ type BillLifecycleData = BillReviewData & {
|
|
|
225
275
|
actions: BillLifecycleAction[];
|
|
226
276
|
};
|
|
227
277
|
eors: BillEorDocument[];
|
|
278
|
+
activity: BillActivityRecord[];
|
|
279
|
+
payments: BillPaymentRecord[];
|
|
280
|
+
remittance: BillRemittanceSummary;
|
|
281
|
+
delivery: BillLifecycleDelivery;
|
|
228
282
|
};
|
|
229
283
|
type BillLifecycleSession = {
|
|
230
284
|
token: string;
|
|
@@ -238,6 +292,9 @@ type BillLifecycleSessionProvider = (request: BillLifecycleSessionRequest) => Pr
|
|
|
238
292
|
type CloseBillInput = {
|
|
239
293
|
reason: string;
|
|
240
294
|
};
|
|
295
|
+
type ReopenBillInput = {
|
|
296
|
+
reason: string;
|
|
297
|
+
};
|
|
241
298
|
type PostBillPaymentInput = {
|
|
242
299
|
amount: number;
|
|
243
300
|
method: "check" | "eft";
|
|
@@ -268,7 +325,7 @@ type BrowserBillCreateInput = {
|
|
|
268
325
|
firstName: string;
|
|
269
326
|
middleName?: string;
|
|
270
327
|
lastName: string;
|
|
271
|
-
dateOfBirth
|
|
328
|
+
dateOfBirth: string;
|
|
272
329
|
ssn?: string;
|
|
273
330
|
gender?: "M" | "F" | "X";
|
|
274
331
|
phone?: string;
|
|
@@ -327,38 +384,41 @@ type BrowserBillCreateInput = {
|
|
|
327
384
|
}>;
|
|
328
385
|
};
|
|
329
386
|
type BillLifecycleClientOptions = {
|
|
330
|
-
/**
|
|
331
|
-
billId
|
|
387
|
+
/** ID of an already-submitted bill. Bills are created only by the atomic server API. */
|
|
388
|
+
billId: string;
|
|
332
389
|
sessionEndpoint?: string | undefined;
|
|
333
390
|
getSession?: BillLifecycleSessionProvider | undefined;
|
|
334
391
|
apiBaseUrl?: string | undefined;
|
|
335
392
|
fetch?: typeof globalThis.fetch | undefined;
|
|
336
393
|
};
|
|
394
|
+
/** Browser-session options for pre-submission reference-data lookups. */
|
|
395
|
+
type BillReferenceClientOptions = Omit<BillLifecycleClientOptions, "billId">;
|
|
396
|
+
type BillReferenceClient = {
|
|
397
|
+
searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;
|
|
398
|
+
clearSession: () => void;
|
|
399
|
+
};
|
|
337
400
|
type BillLifecycleClient = {
|
|
338
|
-
getBillId: () => string
|
|
339
|
-
createBill: (input: BrowserBillCreateInput) => Promise<{
|
|
340
|
-
billId: string;
|
|
341
|
-
data: BillLifecycleData;
|
|
342
|
-
}>;
|
|
401
|
+
getBillId: () => string;
|
|
343
402
|
getLifecycle: (signal?: AbortSignal) => Promise<BillLifecycleData>;
|
|
344
403
|
searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;
|
|
345
404
|
getDeliveryOptions: () => Promise<BillDeliveryOptions>;
|
|
346
|
-
saveReview: (input: BillReviewSaveInput) => Promise<BillLifecycleData>;
|
|
347
|
-
submitBill: (input: BillReviewSaveInput, submission: SubmitBillInput) => Promise<BillLifecycleData>;
|
|
348
|
-
addAttachment: (file: File, documentType: BillReviewDocumentType, description?: string) => Promise<BillLifecycleData>;
|
|
349
|
-
removeAttachment: (attachmentId: string) => Promise<BillLifecycleData>;
|
|
350
405
|
getAttachment: (attachmentId: string) => Promise<Blob>;
|
|
351
406
|
getEor: (documentId: string) => Promise<Blob>;
|
|
407
|
+
getPacket: () => Promise<Blob>;
|
|
352
408
|
closeBill: (input: CloseBillInput) => Promise<BillLifecycleData>;
|
|
409
|
+
reopenBill: (input: ReopenBillInput) => Promise<BillLifecycleData>;
|
|
353
410
|
postPayment: (input: PostBillPaymentInput) => Promise<BillLifecycleData>;
|
|
354
411
|
submitSecondReview: (input: SubmitSecondReviewInput) => Promise<BillLifecycleData>;
|
|
355
|
-
startCorrection: () => Promise<{
|
|
356
|
-
replacementBillId: string;
|
|
357
|
-
data: BillLifecycleData;
|
|
358
|
-
}>;
|
|
359
412
|
clearSession: () => void;
|
|
360
413
|
};
|
|
361
|
-
/** Browser-safe, framework-neutral client for
|
|
414
|
+
/** Browser-safe, framework-neutral client for an already-submitted bill. */
|
|
362
415
|
declare function createBillLifecycleClient({ billId, sessionEndpoint, getSession, apiBaseUrl, fetch: fetchOverride, }: BillLifecycleClientOptions): BillLifecycleClient;
|
|
416
|
+
/**
|
|
417
|
+
* Browser-safe client for reference data needed before a bill exists.
|
|
418
|
+
*
|
|
419
|
+
* Partners can pass the same short-lived session provider used by the submitted-bill
|
|
420
|
+
* lifecycle without inventing a draft bill or exposing payer directory credentials.
|
|
421
|
+
*/
|
|
422
|
+
declare function createBillReferenceClient(options?: BillReferenceClientOptions): BillReferenceClient;
|
|
363
423
|
|
|
364
|
-
export { type BillDeliveryOption, type BillDeliveryOptions, type BillEorDocument, type BillLifecycleAction, type BillLifecycleActionId, type BillLifecycleClient, type BillLifecycleClientOptions, type BillLifecycleData, type BillLifecycleSession, type BillLifecycleSessionProvider, type BillLifecycleSessionRequest, type BillReviewAttachment, type BillReviewBillingProvider, type BillReviewClaimPatternStatus, type BillReviewClinician, type BillReviewData, type BillReviewDocumentType, type BillReviewFeatures, type BillReviewLineItem, type BillReviewLocation, type BillReviewPayer, type BillReviewSaveInput, type BillSubmissionRoute, type BrowserBillAddress, type BrowserBillCreateInput, type CloseBillInput, DEFAULT_API_BASE_URL, DEFAULT_SESSION_ENDPOINT, type PostBillPaymentInput, type SubmitBillInput, type SubmitSecondReviewInput, createBillLifecycleClient, sanitizeBillReviewSaveInput };
|
|
424
|
+
export { type BillActivityRecord, type BillDeliveryOption, type BillDeliveryOptions, type BillEorDocument, type BillLifecycleAction, type BillLifecycleActionId, type BillLifecycleClient, type BillLifecycleClientOptions, type BillLifecycleData, type BillLifecycleDelivery, type BillLifecycleSession, type BillLifecycleSessionProvider, type BillLifecycleSessionRequest, type BillPaymentRecord, type BillReferenceClient, type BillReferenceClientOptions, type BillRemittanceSummary, type BillReviewAttachment, type BillReviewBillingProvider, type BillReviewClaimPatternStatus, type BillReviewClinician, type BillReviewData, type BillReviewDocumentType, type BillReviewFeatures, type BillReviewLineItem, type BillReviewLocation, type BillReviewPayer, type BillReviewSaveInput, type BillSubmissionRoute, type BrowserBillAddress, type BrowserBillCreateInput, type CloseBillInput, DEFAULT_API_BASE_URL, DEFAULT_SESSION_ENDPOINT, type PostBillPaymentInput, type ReopenBillInput, type SubmitBillInput, type SubmitSecondReviewInput, createBillLifecycleClient, createBillReferenceClient, sanitizeBillReviewSaveInput };
|
package/dist/index.js
CHANGED
|
@@ -119,7 +119,7 @@ function normalizeLifecycle(value) {
|
|
|
119
119
|
throw new Error("The billing service returned an invalid bill lifecycle.");
|
|
120
120
|
}
|
|
121
121
|
const data = value;
|
|
122
|
-
if (!data.bill || !data.patient || !data.injury || !data.lifecycle || !Array.isArray(data.lifecycle.actions) || !Array.isArray(data.eors)) {
|
|
122
|
+
if (!data.bill || !data.patient || !data.injury || !data.lifecycle || !Array.isArray(data.lifecycle.actions) || !Array.isArray(data.eors) || !Array.isArray(data.activity) || !Array.isArray(data.payments) || !data.remittance || typeof data.remittance !== "object" || !data.delivery || typeof data.delivery !== "object" || !data.delivery.contacts || typeof data.delivery.contacts !== "object") {
|
|
123
123
|
throw new Error("The billing service returned an invalid bill lifecycle.");
|
|
124
124
|
}
|
|
125
125
|
return data;
|
|
@@ -149,8 +149,8 @@ function createBillLifecycleClient({
|
|
|
149
149
|
if (typeof fetcher !== "function") throw new Error("A Fetch API implementation is required.");
|
|
150
150
|
let session = null;
|
|
151
151
|
let sessionRequest = null;
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
const currentBillId = billId.trim();
|
|
153
|
+
if (!currentBillId) throw new Error("billId is required for the submitted-bill lifecycle client.");
|
|
154
154
|
const mintSession = async (signal, force = false) => {
|
|
155
155
|
if (!force && isSessionFresh(session)) return session;
|
|
156
156
|
if (!force && sessionRequest) return sessionRequest;
|
|
@@ -192,13 +192,7 @@ function createBillLifecycleClient({
|
|
|
192
192
|
}
|
|
193
193
|
return response;
|
|
194
194
|
};
|
|
195
|
-
const
|
|
196
|
-
if (!currentBillId) {
|
|
197
|
-
throw new Error("No bill is open. Pass billId or create a bill before using this operation.");
|
|
198
|
-
}
|
|
199
|
-
return currentBillId;
|
|
200
|
-
};
|
|
201
|
-
const billPath = (suffix = "") => `/partner/v2/browser/bills/${encodeURIComponent(requireBillId())}${suffix}`;
|
|
195
|
+
const billPath = (suffix = "") => `/partner/v2/browser/bills/${encodeURIComponent(currentBillId)}${suffix}`;
|
|
202
196
|
const loadLifecycle = async (signal) => {
|
|
203
197
|
const response = await request(billPath("/lifecycle"), {}, signal);
|
|
204
198
|
if (!response.ok) throw await responseError(response, "Bill lifecycle could not be loaded.");
|
|
@@ -255,38 +249,10 @@ function createBillLifecycleClient({
|
|
|
255
249
|
const body = await response.json();
|
|
256
250
|
return normalizeLifecycle(body.data);
|
|
257
251
|
};
|
|
258
|
-
const saveReview = async (input) => {
|
|
259
|
-
await mutation(billPath(), {
|
|
260
|
-
method: "PATCH",
|
|
261
|
-
headers: { "content-type": "application/json" },
|
|
262
|
-
body: JSON.stringify(sanitizeBillReviewSaveInput(input))
|
|
263
|
-
}, "Bill changes could not be saved.");
|
|
264
|
-
return loadLifecycle();
|
|
265
|
-
};
|
|
266
252
|
return {
|
|
267
253
|
getBillId() {
|
|
268
254
|
return currentBillId;
|
|
269
255
|
},
|
|
270
|
-
async createBill(input) {
|
|
271
|
-
if (currentBillId) throw new Error("A bill is already open in this lifecycle client.");
|
|
272
|
-
if (createRequest) return createRequest;
|
|
273
|
-
const pending = (async () => {
|
|
274
|
-
const response = await mutation("/partner/v2/browser/bills", {
|
|
275
|
-
method: "POST",
|
|
276
|
-
headers: { "content-type": "application/json" },
|
|
277
|
-
body: JSON.stringify(input)
|
|
278
|
-
}, "Bill could not be created.");
|
|
279
|
-
const body = await response.json();
|
|
280
|
-
const nextBillId = typeof body.id === "string" ? body.id : typeof body.data?.id === "string" ? body.data.id : null;
|
|
281
|
-
if (!nextBillId) throw new Error("The billing service did not return the new bill ID.");
|
|
282
|
-
currentBillId = nextBillId;
|
|
283
|
-
return { billId: nextBillId, data: await loadLifecycle() };
|
|
284
|
-
})().finally(() => {
|
|
285
|
-
if (createRequest === pending) createRequest = null;
|
|
286
|
-
});
|
|
287
|
-
createRequest = pending;
|
|
288
|
-
return pending;
|
|
289
|
-
},
|
|
290
256
|
clearSession() {
|
|
291
257
|
session = null;
|
|
292
258
|
sessionRequest = null;
|
|
@@ -299,28 +265,6 @@ function createBillLifecycleClient({
|
|
|
299
265
|
const body = await response.json();
|
|
300
266
|
return normalizeDeliveryOptions(body.data ?? body);
|
|
301
267
|
},
|
|
302
|
-
saveReview,
|
|
303
|
-
async submitBill(input, submission) {
|
|
304
|
-
await saveReview(input);
|
|
305
|
-
await mutation(billPath("/submissions"), {
|
|
306
|
-
method: "POST",
|
|
307
|
-
headers: { "content-type": "application/json" },
|
|
308
|
-
body: JSON.stringify(submission)
|
|
309
|
-
}, "Bill could not be submitted.");
|
|
310
|
-
return loadLifecycle();
|
|
311
|
-
},
|
|
312
|
-
async addAttachment(file, documentType, description) {
|
|
313
|
-
const body = new FormData();
|
|
314
|
-
body.set("file", file);
|
|
315
|
-
body.set("documentType", documentType);
|
|
316
|
-
if (description) body.set("description", description);
|
|
317
|
-
await mutation(billPath("/documents"), { method: "POST", body }, "Document could not be attached.");
|
|
318
|
-
return loadLifecycle();
|
|
319
|
-
},
|
|
320
|
-
async removeAttachment(attachmentId) {
|
|
321
|
-
await mutation(billPath(`/documents/${encodeURIComponent(attachmentId)}`), { method: "DELETE" }, "Document could not be removed.");
|
|
322
|
-
return loadLifecycle();
|
|
323
|
-
},
|
|
324
268
|
async getAttachment(attachmentId) {
|
|
325
269
|
const response = await request(billPath(`/documents/${encodeURIComponent(attachmentId)}`));
|
|
326
270
|
if (!response.ok) throw await responseError(response, "Document could not be opened.");
|
|
@@ -331,32 +275,40 @@ function createBillLifecycleClient({
|
|
|
331
275
|
if (!response.ok) throw await responseError(response, "EOR could not be opened.");
|
|
332
276
|
return response.blob();
|
|
333
277
|
},
|
|
278
|
+
async getPacket() {
|
|
279
|
+
const response = await request(billPath("/packet"));
|
|
280
|
+
if (!response.ok) throw await responseError(response, "Submission packet could not be downloaded.");
|
|
281
|
+
return response.blob();
|
|
282
|
+
},
|
|
334
283
|
closeBill(input) {
|
|
335
284
|
return action({ action: "close", ...input }, "Bill could not be closed.");
|
|
336
285
|
},
|
|
286
|
+
reopenBill(input) {
|
|
287
|
+
return action({ action: "reopen", ...input }, "Bill could not be reopened.");
|
|
288
|
+
},
|
|
337
289
|
postPayment(input) {
|
|
338
290
|
return action({ action: "post_payment", ...input, checkNumber: input.checkNumber ?? "" }, "Payment could not be posted.");
|
|
339
291
|
},
|
|
340
292
|
submitSecondReview(input) {
|
|
341
293
|
return action({ action: "second_review", ...input }, "Second Review could not be submitted.");
|
|
342
|
-
},
|
|
343
|
-
async startCorrection() {
|
|
344
|
-
const response = await mutation(billPath("/actions"), {
|
|
345
|
-
method: "POST",
|
|
346
|
-
headers: { "content-type": "application/json" },
|
|
347
|
-
body: JSON.stringify({ action: "start_correction" })
|
|
348
|
-
}, "Correction draft could not be created.");
|
|
349
|
-
const body = await response.json();
|
|
350
|
-
if (typeof body.replacementBillId !== "string") throw new Error("The billing service did not return the correction bill ID.");
|
|
351
|
-
currentBillId = body.replacementBillId;
|
|
352
|
-
return { replacementBillId: body.replacementBillId, data: normalizeLifecycle(body.data) };
|
|
353
294
|
}
|
|
354
295
|
};
|
|
355
296
|
}
|
|
297
|
+
function createBillReferenceClient(options = {}) {
|
|
298
|
+
const lifecycle = createBillLifecycleClient({
|
|
299
|
+
...options,
|
|
300
|
+
billId: "pre-submission-reference-data"
|
|
301
|
+
});
|
|
302
|
+
return {
|
|
303
|
+
searchClaimsAdministrators: lifecycle.searchClaimsAdministrators,
|
|
304
|
+
clearSession: lifecycle.clearSession
|
|
305
|
+
};
|
|
306
|
+
}
|
|
356
307
|
export {
|
|
357
308
|
DEFAULT_API_BASE_URL,
|
|
358
309
|
DEFAULT_SESSION_ENDPOINT,
|
|
359
310
|
createBillLifecycleClient,
|
|
311
|
+
createBillReferenceClient,
|
|
360
312
|
sanitizeBillReviewSaveInput
|
|
361
313
|
};
|
|
362
314
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export const DEFAULT_API_BASE_URL = \"https://app.mindbill.org\";\nexport const DEFAULT_SESSION_ENDPOINT = \"/api/mindbill/session\";\n\nexport type BillReviewDocumentType =\n | \"final_report\"\n | \"letter_of_attestation\"\n | \"proof_of_service\"\n | \"form_122\"\n | \"return_to_work_voucher\"\n | \"w9\"\n | \"medical_records\"\n | \"appeal\"\n | \"other\";\n\nexport type BillReviewBillingProvider = {\n name: string;\n taxId: string;\n npi: string;\n billType: \"Professional\" | \"Institutional\";\n phone?: string;\n billingStreet?: string;\n billingCity?: string;\n billingState?: string;\n billingZip?: string;\n};\n\nexport type BillReviewClinician = {\n name: string;\n specialty: string;\n npi: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n signaturePng?: string;\n signatureKey?: string;\n isQME?: boolean;\n isAME?: boolean;\n email?: string;\n active?: boolean;\n};\n\nexport type BillReviewLocation = {\n billingProviderId?: string;\n name: string;\n nickname?: string;\n street: string;\n city: string;\n state: string;\n zip: string;\n county?: string;\n posCode?: string;\n isPrimary?: boolean;\n active?: boolean;\n};\n\nexport type BillReviewLineItem = {\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge: number;\n feeSchedule?: number;\n serviceDate?: string | null;\n serviceDateEnd?: string | null;\n diagnosisPointers?: number[];\n};\n\nexport type BillReviewAttachment = {\n id: string;\n filename: string;\n description?: string | null;\n documentType: string;\n reportType?: string | null;\n source?: string;\n addedAt?: string;\n contentUrl?: string;\n};\n\nexport type BillReviewPayer = {\n id: string;\n name: string;\n hasElectronic?: boolean;\n states?: string[];\n confidence?: \"high\" | \"medium\" | \"directory\";\n recommended?: boolean;\n signals?: Array<{\n kind: \"name\" | \"claim_number\";\n state: \"match\" | \"warning\";\n label: string;\n }>;\n};\n\nexport type BillReviewFeatures = {\n authorizationNumber?: boolean;\n serviceDateRange?: boolean;\n wcabNumber?: boolean;\n codingPresets?: boolean;\n};\n\nexport type BillReviewClaimPatternStatus = {\n state: \"match\" | \"warning\" | \"unknown\";\n label: string;\n detail?: string;\n suggestion?: string;\n};\n\nexport type BillReviewData = {\n bill: {\n id: string;\n billNumber: string | number;\n status: string;\n transmissionState?: string;\n billingMode: \"med_legal\" | \"professional\";\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingSnapshot?: {\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n } | null;\n lineItems: BillReviewLineItem[];\n attachments: BillReviewAttachment[];\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n };\n patient: {\n name: string;\n firstName?: string;\n middleName?: string;\n lastName?: string;\n dob?: string;\n };\n injury: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n injuryEndDate?: string;\n cumulativeTrauma?: boolean;\n adjNumber?: string;\n claimsAdminId?: string;\n claimsAdminName?: string;\n claimPatternStatus?: BillReviewClaimPatternStatus;\n };\n};\n\nexport type BillReviewSaveInput = {\n claimsAdminId: string;\n patientOverrides?: {\n firstName: string;\n middleName?: string;\n lastName: string;\n dob?: string;\n };\n injuryOverrides?: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n injuryEndDate?: string;\n cumulativeTrauma?: boolean;\n adjNumber?: string;\n };\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n lineItems: Array<{\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge?: number;\n serviceDate?: string | null;\n serviceDateEnd?: string | null;\n diagnosisPointers?: number[];\n }>;\n};\n\nfunction pickDefined(\n source: object,\n keys: readonly string[],\n): Record<string, unknown> {\n const record = source as Record<string, unknown>;\n return Object.fromEntries(\n keys.flatMap((key) => record[key] === undefined ? [] : [[key, record[key]]]),\n );\n}\n\n/**\n * Removes read-only snapshot metadata before a review mutation is sent.\n * Lifecycle reads can include display-only fields such as entity IDs; the v2\n * write contract accepts only the values that should be frozen onto the bill.\n */\nexport function sanitizeBillReviewSaveInput(\n input: BillReviewSaveInput,\n): BillReviewSaveInput {\n return {\n claimsAdminId: input.claimsAdminId,\n ...(input.patientOverrides ? {\n patientOverrides: pickDefined(input.patientOverrides, [\n \"firstName\", \"middleName\", \"lastName\", \"dob\",\n ]) as NonNullable<BillReviewSaveInput[\"patientOverrides\"]>,\n } : {}),\n ...(input.injuryOverrides ? {\n injuryOverrides: pickDefined(input.injuryOverrides, [\n \"claimNumber\", \"employer\", \"doi\", \"injuryEndDate\",\n \"cumulativeTrauma\", \"adjNumber\",\n ]) as NonNullable<BillReviewSaveInput[\"injuryOverrides\"]>,\n } : {}),\n dos: input.dos,\n ...(input.dosEnd !== undefined ? { dosEnd: input.dosEnd } : {}),\n ...(input.authorizationNumber !== undefined\n ? { authorizationNumber: input.authorizationNumber }\n : {}),\n ...(input.billingProvider ? {\n billingProvider: pickDefined(input.billingProvider, [\n \"name\", \"taxId\", \"npi\", \"billType\", \"phone\", \"billingStreet\",\n \"billingCity\", \"billingState\", \"billingZip\",\n ]) as BillReviewBillingProvider,\n } : {}),\n ...(input.renderingProvider ? {\n renderingProvider: pickDefined(input.renderingProvider, [\n \"name\", \"specialty\", \"npi\", \"taxonomy\", \"licenseNumber\",\n \"licenseState\", \"signaturePng\", \"signatureKey\", \"isQME\", \"isAME\",\n \"email\", \"active\",\n ]) as BillReviewClinician,\n } : {}),\n ...(input.placeOfService ? {\n placeOfService: pickDefined(input.placeOfService, [\n \"billingProviderId\", \"name\", \"nickname\", \"street\", \"city\", \"state\",\n \"zip\", \"county\", \"posCode\", \"isPrimary\", \"active\",\n ]) as BillReviewLocation,\n } : {}),\n lineItems: input.lineItems.map((line) => pickDefined(line, [\n \"id\", \"code\", \"modifiers\", \"units\", \"charge\", \"serviceDate\",\n \"serviceDateEnd\", \"diagnosisPointers\",\n ]) as BillReviewSaveInput[\"lineItems\"][number]),\n };\n}\n\nexport type BillSubmissionRoute = \"ebill\" | \"fax\" | \"mail\" | \"email\";\nexport type BillDeliveryOption = {\n route: BillSubmissionRoute;\n label: string;\n detail: string;\n fallback: boolean;\n confidence: string;\n payerName: string;\n target?: string;\n chKey?: string;\n payerId?: string;\n printAndMail?: boolean;\n costUsd?: number;\n};\nexport type BillDeliveryOptions = {\n payerName: string;\n recommended: BillDeliveryOption;\n options: BillDeliveryOption[];\n contacts: {\n faxNumber?: string | null;\n claimsEmail?: string | null;\n portalUrl?: string | null;\n mailingAddress?: string | null;\n };\n};\nexport type SubmitBillInput = {\n route: BillSubmissionRoute;\n destination?: {\n faxNumber?: string;\n email?: string;\n mailingAddress?: string;\n };\n attention?: string;\n subject?: string;\n note?: string;\n};\nexport type BillLifecycleActionId =\n | \"edit_and_submit\"\n | \"correct_and_resubmit\"\n | \"second_review\"\n | \"independent_bill_review\"\n | \"view_eor\"\n | \"post_payment\"\n | \"close\";\n\nexport type BillLifecycleAction = {\n id: BillLifecycleActionId;\n label: string;\n enabled: boolean;\n primary?: boolean;\n reason?: string;\n};\n\nexport type BillEorDocument = {\n id: string;\n filename: string;\n description: string | null;\n addedAt: string;\n contentUrl: string;\n};\n\nexport type BillLifecycleData = BillReviewData & {\n lifecycle: {\n state: string;\n nativeStatus: string;\n submittedAt?: string | null;\n agingDays?: number | null;\n updatedAt?: string | null;\n actions: BillLifecycleAction[];\n };\n eors: BillEorDocument[];\n};\n\nexport type BillLifecycleSession = {\n token: string;\n expiresAt?: string;\n apiBaseUrl?: string;\n};\n\nexport type BillLifecycleSessionRequest = {\n signal: AbortSignal;\n};\n\nexport type BillLifecycleSessionProvider = (\n request: BillLifecycleSessionRequest,\n) => Promise<BillLifecycleSession>;\n\nexport type CloseBillInput = { reason: string };\nexport type PostBillPaymentInput = {\n amount: number;\n method: \"check\" | \"eft\";\n checkNumber?: string;\n depositDate: string;\n note?: string;\n};\nexport type SubmitSecondReviewInput = {\n reason: string;\n payerClaimControlNumber: string;\n disputedAmount: number | undefined;\n attachmentIds: string[];\n route: BillSubmissionRoute;\n};\n\nexport type BrowserBillAddress = {\n line1: string;\n city: string;\n state: string;\n postalCode: string;\n};\n\n/** Complete bill snapshot accepted by the browser create endpoint. */\nexport type BrowserBillCreateInput = {\n externalId?: string;\n billingMode?: \"med_legal\" | \"professional\";\n patient: {\n id?: string;\n externalId?: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n dateOfBirth?: string;\n ssn?: string;\n gender?: \"M\" | \"F\" | \"X\";\n phone?: string;\n address: BrowserBillAddress;\n };\n claim: {\n id?: string;\n externalId?: string;\n claimNumber: string;\n adjNumber?: string;\n employer?: string;\n dateOfInjury?: string;\n injuryState?: string;\n description?: string;\n claimsAdministrator?: { id?: string; name: string };\n };\n service: { date?: string; endDate?: string | null; authorizationNumber?: string | null };\n billingProvider?: { name?: string; taxId?: string; npi?: string; phone?: string; address?: BrowserBillAddress };\n renderingProvider?: {\n name?: string;\n specialty?: string;\n npi?: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n isQme?: boolean;\n isAme?: boolean;\n };\n serviceLocation?: { name?: string; address?: BrowserBillAddress; placeOfServiceCode?: string };\n diagnoses?: string[];\n serviceLines?: Array<{\n code: string;\n modifiers?: string[];\n units?: number;\n charge?: number;\n serviceDate?: string;\n serviceDateEnd?: string;\n diagnosisPointers?: number[];\n }>;\n};\n\nexport type BillLifecycleClientOptions = {\n /** Open an existing bill. Omit this to create one with `createBill`. */\n billId?: string;\n sessionEndpoint?: string | undefined;\n getSession?: BillLifecycleSessionProvider | undefined;\n apiBaseUrl?: string | undefined;\n fetch?: typeof globalThis.fetch | undefined;\n};\n\nexport type BillLifecycleClient = {\n getBillId: () => string | null;\n createBill: (input: BrowserBillCreateInput) => Promise<{ billId: string; data: BillLifecycleData }>;\n getLifecycle: (signal?: AbortSignal) => Promise<BillLifecycleData>;\n searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;\n getDeliveryOptions: () => Promise<BillDeliveryOptions>;\n saveReview: (input: BillReviewSaveInput) => Promise<BillLifecycleData>;\n submitBill: (input: BillReviewSaveInput, submission: SubmitBillInput) => Promise<BillLifecycleData>;\n addAttachment: (file: File, documentType: BillReviewDocumentType, description?: string) => Promise<BillLifecycleData>;\n removeAttachment: (attachmentId: string) => Promise<BillLifecycleData>;\n getAttachment: (attachmentId: string) => Promise<Blob>;\n getEor: (documentId: string) => Promise<Blob>;\n closeBill: (input: CloseBillInput) => Promise<BillLifecycleData>;\n postPayment: (input: PostBillPaymentInput) => Promise<BillLifecycleData>;\n submitSecondReview: (input: SubmitSecondReviewInput) => Promise<BillLifecycleData>;\n startCorrection: () => Promise<{ replacementBillId: string; data: BillLifecycleData }>;\n clearSession: () => void;\n};\n\nasync function responseError(response: Response, fallback: string): Promise<Error> {\n const body: unknown = await response.json().catch(() => null);\n const detail = body && typeof body === \"object\"\n ? (body as { detail?: unknown; message?: unknown; error?: unknown }).detail\n ?? (body as { message?: unknown }).message\n ?? (body as { error?: unknown }).error\n : null;\n return new Error(typeof detail === \"string\" ? detail : fallback);\n}\n\nfunction isSessionFresh(session: BillLifecycleSession | null): boolean {\n if (!session) return false;\n if (!session.expiresAt) return true;\n const expiresAt = new Date(session.expiresAt).getTime();\n return Number.isFinite(expiresAt) && expiresAt > Date.now() + 30_000;\n}\n\nfunction normalizeSession(value: unknown): BillLifecycleSession {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing session endpoint returned an invalid response.\");\n }\n const candidate = value as { token?: unknown; expiresAt?: unknown; apiBaseUrl?: unknown; session?: unknown; data?: unknown };\n const nested = candidate.session ?? candidate.data;\n const session = nested && typeof nested === \"object\" ? nested as typeof candidate : candidate;\n if (typeof session.token !== \"string\" || session.token.length < 8) {\n throw new Error(\"The billing session endpoint did not return a browser session token.\");\n }\n return {\n token: session.token,\n ...(typeof session.expiresAt === \"string\" ? { expiresAt: session.expiresAt } : {}),\n ...(typeof session.apiBaseUrl === \"string\" ? { apiBaseUrl: session.apiBaseUrl } : {}),\n };\n}\n\nfunction normalizeLifecycle(value: unknown): BillLifecycleData {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n const data = value as Partial<BillLifecycleData>;\n if (!data.bill || !data.patient || !data.injury || !data.lifecycle || !Array.isArray(data.lifecycle.actions) || !Array.isArray(data.eors)) {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n return data as BillLifecycleData;\n}\n\nfunction normalizeDeliveryOptions(value: unknown): BillDeliveryOptions {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing service returned invalid delivery options.\");\n }\n const data = value as Partial<BillDeliveryOptions>;\n if (\n typeof data.payerName !== \"string\"\n || !data.recommended\n || typeof data.recommended !== \"object\"\n || ![\"ebill\", \"fax\", \"mail\", \"email\"].includes(data.recommended.route ?? \"\")\n || !Array.isArray(data.options)\n || !data.contacts\n ) {\n throw new Error(\"The billing service returned invalid delivery options.\");\n }\n return data as BillDeliveryOptions;\n}\n\nfunction idempotencyKey(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") return globalThis.crypto.randomUUID();\n return `mb-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** Browser-safe, framework-neutral client for the complete bill lifecycle. */\nexport function createBillLifecycleClient({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n fetch: fetchOverride,\n}: BillLifecycleClientOptions): BillLifecycleClient {\n const fetcher = fetchOverride ?? globalThis.fetch;\n if (typeof fetcher !== \"function\") throw new Error(\"A Fetch API implementation is required.\");\n let session: BillLifecycleSession | null = null;\n let sessionRequest: Promise<BillLifecycleSession> | null = null;\n let currentBillId = billId?.trim() || null;\n let createRequest: Promise<{ billId: string; data: BillLifecycleData }> | null = null;\n\n const mintSession = async (signal: AbortSignal, force = false): Promise<BillLifecycleSession> => {\n if (!force && isSessionFresh(session)) return session as BillLifecycleSession;\n if (!force && sessionRequest) return sessionRequest;\n const pending = getSession\n ? getSession({ signal })\n : fetcher(sessionEndpoint, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({}),\n signal,\n }).then(async (response) => {\n if (!response.ok) throw await responseError(response, \"The billing session could not be created.\");\n return response.json();\n });\n const request = Promise.resolve(pending).then(normalizeSession).then((nextSession) => {\n session = nextSession;\n return nextSession;\n }).finally(() => {\n if (sessionRequest === request) sessionRequest = null;\n });\n sessionRequest = request;\n return request;\n };\n\n const request = async (path: string, init: RequestInit = {}, providedSignal?: AbortSignal): Promise<Response> => {\n const controller = providedSignal ? null : new AbortController();\n const signal = providedSignal ?? controller?.signal;\n if (!signal) throw new Error(\"An AbortSignal could not be created.\");\n let browserSession = await mintSession(signal);\n const perform = (current: BillLifecycleSession) => {\n const base = (current.apiBaseUrl ?? apiBaseUrl).replace(/\\/$/, \"\");\n const headers = new Headers(init.headers);\n headers.set(\"authorization\", `Bearer ${current.token}`);\n return fetcher(`${base}${path}`, { ...init, headers, signal });\n };\n let response = await perform(browserSession);\n if (response.status === 401) {\n session = null;\n browserSession = await mintSession(signal, true);\n response = await perform(browserSession);\n }\n return response;\n };\n\n const requireBillId = (): string => {\n if (!currentBillId) {\n throw new Error(\"No bill is open. Pass billId or create a bill before using this operation.\");\n }\n return currentBillId;\n };\n const billPath = (suffix = \"\"): string =>\n `/partner/v2/browser/bills/${encodeURIComponent(requireBillId())}${suffix}`;\n\n const loadLifecycle = async (signal?: AbortSignal) => {\n const response = await request(billPath(\"/lifecycle\"), {}, signal);\n if (!response.ok) throw await responseError(response, \"Bill lifecycle could not be loaded.\");\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n\n const searchClaimsAdministrators = async (query: string, claimNumber?: string): Promise<BillReviewPayer[]> => {\n const params = new URLSearchParams();\n if (query.trim()) params.set(\"q\", query.trim());\n if (claimNumber?.trim()) params.set(\"claimNumber\", claimNumber.trim());\n const response = await request(`/partner/v2/browser/claims-administrators?${params.toString()}`);\n if (!response.ok) throw await responseError(response, \"Claims administrator search is unavailable.\");\n const body = await response.json() as { results?: unknown };\n if (!Array.isArray(body.results)) throw new Error(\"Claims administrator search returned an invalid response.\");\n return body.results.flatMap((value): BillReviewPayer[] => {\n if (!value || typeof value !== \"object\") return [];\n const payer = value as Partial<BillReviewPayer>;\n if (typeof payer.id !== \"string\" || typeof payer.name !== \"string\") return [];\n return [{\n id: payer.id,\n name: payer.name,\n ...(typeof payer.hasElectronic === \"boolean\" ? { hasElectronic: payer.hasElectronic } : {}),\n ...(Array.isArray(payer.states)\n ? { states: payer.states.filter((state): state is string => typeof state === \"string\") }\n : {}),\n ...([\"high\", \"medium\", \"directory\"].includes(payer.confidence ?? \"\")\n ? { confidence: payer.confidence as NonNullable<BillReviewPayer[\"confidence\"]> }\n : {}),\n ...(typeof payer.recommended === \"boolean\" ? { recommended: payer.recommended } : {}),\n ...(Array.isArray(payer.signals)\n ? {\n signals: payer.signals.flatMap((signal) => {\n if (!signal || typeof signal !== \"object\") return [];\n const candidate = signal as { kind?: unknown; state?: unknown; label?: unknown };\n if (\n ![\"name\", \"claim_number\"].includes(String(candidate.kind))\n || ![\"match\", \"warning\"].includes(String(candidate.state))\n || typeof candidate.label !== \"string\"\n ) return [];\n return [{\n kind: candidate.kind as \"name\" | \"claim_number\",\n state: candidate.state as \"match\" | \"warning\",\n label: candidate.label,\n }];\n }),\n }\n : {}),\n }];\n });\n };\n\n const mutation = async (path: string, init: RequestInit, fallback: string) => {\n const headers = new Headers(init.headers);\n headers.set(\"idempotency-key\", idempotencyKey());\n const response = await request(path, { ...init, headers });\n if (!response.ok) throw await responseError(response, fallback);\n return response;\n };\n const action = async (input: Record<string, unknown>, fallback: string): Promise<BillLifecycleData> => {\n const response = await mutation(billPath(\"/actions\"), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n }, fallback);\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n const saveReview = async (input: BillReviewSaveInput): Promise<BillLifecycleData> => {\n await mutation(billPath(), {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(sanitizeBillReviewSaveInput(input)),\n }, \"Bill changes could not be saved.\");\n return loadLifecycle();\n };\n\n return {\n getBillId() { return currentBillId; },\n async createBill(input) {\n if (currentBillId) throw new Error(\"A bill is already open in this lifecycle client.\");\n if (createRequest) return createRequest;\n const pending = (async () => {\n const response = await mutation(\"/partner/v2/browser/bills\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n }, \"Bill could not be created.\");\n const body = await response.json() as { id?: unknown; data?: { id?: unknown } };\n const nextBillId = typeof body.id === \"string\"\n ? body.id\n : typeof body.data?.id === \"string\" ? body.data.id : null;\n if (!nextBillId) throw new Error(\"The billing service did not return the new bill ID.\");\n currentBillId = nextBillId;\n return { billId: nextBillId, data: await loadLifecycle() };\n })().finally(() => {\n if (createRequest === pending) createRequest = null;\n });\n createRequest = pending;\n return pending;\n },\n clearSession() { session = null; sessionRequest = null; },\n getLifecycle: loadLifecycle,\n searchClaimsAdministrators,\n async getDeliveryOptions() {\n const response = await request(billPath(\"/delivery-options\"));\n if (!response.ok) throw await responseError(response, \"Delivery options could not be loaded.\");\n const body = await response.json() as { data?: unknown };\n return normalizeDeliveryOptions(body.data ?? body);\n },\n saveReview,\n async submitBill(input, submission) {\n await saveReview(input);\n await mutation(billPath(\"/submissions\"), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(submission),\n }, \"Bill could not be submitted.\");\n return loadLifecycle();\n },\n async addAttachment(file, documentType, description) {\n const body = new FormData();\n body.set(\"file\", file);\n body.set(\"documentType\", documentType);\n if (description) body.set(\"description\", description);\n await mutation(billPath(\"/documents\"), { method: \"POST\", body }, \"Document could not be attached.\");\n return loadLifecycle();\n },\n async removeAttachment(attachmentId) {\n await mutation(billPath(`/documents/${encodeURIComponent(attachmentId)}`), { method: \"DELETE\" }, \"Document could not be removed.\");\n return loadLifecycle();\n },\n async getAttachment(attachmentId) {\n const response = await request(billPath(`/documents/${encodeURIComponent(attachmentId)}`));\n if (!response.ok) throw await responseError(response, \"Document could not be opened.\");\n return response.blob();\n },\n async getEor(documentId) {\n const response = await request(billPath(`/eors/${encodeURIComponent(documentId)}`));\n if (!response.ok) throw await responseError(response, \"EOR could not be opened.\");\n return response.blob();\n },\n closeBill(input) { return action({ action: \"close\", ...input }, \"Bill could not be closed.\"); },\n postPayment(input) { return action({ action: \"post_payment\", ...input, checkNumber: input.checkNumber ?? \"\" }, \"Payment could not be posted.\"); },\n submitSecondReview(input) { return action({ action: \"second_review\", ...input }, \"Second Review could not be submitted.\"); },\n async startCorrection() {\n const response = await mutation(billPath(\"/actions\"), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"start_correction\" }),\n }, \"Correction draft could not be created.\");\n const body = await response.json() as { replacementBillId?: unknown; data?: unknown };\n if (typeof body.replacementBillId !== \"string\") throw new Error(\"The billing service did not return the correction bill ID.\");\n currentBillId = body.replacementBillId;\n return { replacementBillId: body.replacementBillId, data: normalizeLifecycle(body.data) };\n },\n };\n}\n"],"mappings":"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","names":["request"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export const DEFAULT_API_BASE_URL = \"https://app.mindbill.org\";\nexport const DEFAULT_SESSION_ENDPOINT = \"/api/mindbill/session\";\n\nexport type BillReviewDocumentType =\n | \"final_report\"\n | \"letter_of_attestation\"\n | \"proof_of_service\"\n | \"form_122\"\n | \"return_to_work_voucher\"\n | \"w9\"\n | \"medical_records\"\n | \"appeal\"\n | \"other\";\n\nexport type BillReviewBillingProvider = {\n name: string;\n taxId: string;\n npi: string;\n billType: \"Professional\" | \"Institutional\";\n phone?: string;\n billingStreet?: string;\n billingCity?: string;\n billingState?: string;\n billingZip?: string;\n};\n\nexport type BillReviewClinician = {\n name: string;\n specialty: string;\n npi: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n signaturePng?: string;\n signatureKey?: string;\n isQME?: boolean;\n isAME?: boolean;\n email?: string;\n active?: boolean;\n};\n\nexport type BillReviewLocation = {\n billingProviderId?: string;\n name: string;\n nickname?: string;\n street: string;\n city: string;\n state: string;\n zip: string;\n county?: string;\n posCode?: string;\n isPrimary?: boolean;\n active?: boolean;\n};\n\nexport type BillReviewLineItem = {\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge: number;\n feeSchedule?: number;\n serviceDate?: string | null;\n serviceDateEnd?: string | null;\n diagnosisPointers?: number[];\n};\n\nexport type BillReviewAttachment = {\n id: string;\n filename: string;\n description?: string | null;\n documentType: string;\n reportType?: string | null;\n source?: string;\n addedAt?: string;\n contentUrl?: string;\n};\n\nexport type BillReviewPayer = {\n id: string;\n name: string;\n hasElectronic?: boolean;\n states?: string[];\n confidence?: \"high\" | \"medium\" | \"directory\";\n recommended?: boolean;\n signals?: Array<{\n kind: \"name\" | \"claim_number\";\n state: \"match\" | \"warning\";\n label: string;\n }>;\n};\n\nexport type BillReviewFeatures = {\n authorizationNumber?: boolean;\n serviceDateRange?: boolean;\n wcabNumber?: boolean;\n codingPresets?: boolean;\n};\n\nexport type BillReviewClaimPatternStatus = {\n state: \"match\" | \"warning\" | \"unknown\";\n label: string;\n detail?: string;\n suggestion?: string;\n};\n\nexport type BillReviewData = {\n bill: {\n id: string;\n billNumber: string | number;\n status: string;\n transmissionState?: string;\n billingMode: \"med_legal\" | \"professional\";\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingSnapshot?: {\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n } | null;\n lineItems: BillReviewLineItem[];\n attachments: BillReviewAttachment[];\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n };\n patient: {\n name: string;\n firstName?: string;\n middleName?: string;\n lastName?: string;\n dob?: string;\n phone?: string;\n address?: {\n line1?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n };\n };\n injury: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n injuryEndDate?: string;\n cumulativeTrauma?: boolean;\n adjNumber?: string;\n claimsAdminId?: string;\n claimsAdminName?: string;\n injuryDescription?: string;\n diagnosisCodes?: string[];\n claimPatternStatus?: BillReviewClaimPatternStatus;\n };\n};\n\nexport type BillReviewSaveInput = {\n claimsAdminId: string;\n patientOverrides?: {\n firstName: string;\n middleName?: string;\n lastName: string;\n dob?: string;\n };\n injuryOverrides?: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n injuryEndDate?: string;\n cumulativeTrauma?: boolean;\n adjNumber?: string;\n };\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n lineItems: Array<{\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge?: number;\n serviceDate?: string | null;\n serviceDateEnd?: string | null;\n diagnosisPointers?: number[];\n }>;\n};\n\nfunction pickDefined(\n source: object,\n keys: readonly string[],\n): Record<string, unknown> {\n const record = source as Record<string, unknown>;\n return Object.fromEntries(\n keys.flatMap((key) => record[key] === undefined ? [] : [[key, record[key]]]),\n );\n}\n\n/**\n * Removes read-only snapshot metadata before a review mutation is sent.\n * Lifecycle reads can include display-only fields such as entity IDs; the v2\n * write contract accepts only the values that should be frozen onto the bill.\n */\nexport function sanitizeBillReviewSaveInput(\n input: BillReviewSaveInput,\n): BillReviewSaveInput {\n return {\n claimsAdminId: input.claimsAdminId,\n ...(input.patientOverrides ? {\n patientOverrides: pickDefined(input.patientOverrides, [\n \"firstName\", \"middleName\", \"lastName\", \"dob\",\n ]) as NonNullable<BillReviewSaveInput[\"patientOverrides\"]>,\n } : {}),\n ...(input.injuryOverrides ? {\n injuryOverrides: pickDefined(input.injuryOverrides, [\n \"claimNumber\", \"employer\", \"doi\", \"injuryEndDate\",\n \"cumulativeTrauma\", \"adjNumber\",\n ]) as NonNullable<BillReviewSaveInput[\"injuryOverrides\"]>,\n } : {}),\n dos: input.dos,\n ...(input.dosEnd !== undefined ? { dosEnd: input.dosEnd } : {}),\n ...(input.authorizationNumber !== undefined\n ? { authorizationNumber: input.authorizationNumber }\n : {}),\n ...(input.billingProvider ? {\n billingProvider: pickDefined(input.billingProvider, [\n \"name\", \"taxId\", \"npi\", \"billType\", \"phone\", \"billingStreet\",\n \"billingCity\", \"billingState\", \"billingZip\",\n ]) as BillReviewBillingProvider,\n } : {}),\n ...(input.renderingProvider ? {\n renderingProvider: pickDefined(input.renderingProvider, [\n \"name\", \"specialty\", \"npi\", \"taxonomy\", \"licenseNumber\",\n \"licenseState\", \"signaturePng\", \"signatureKey\", \"isQME\", \"isAME\",\n \"email\", \"active\",\n ]) as BillReviewClinician,\n } : {}),\n ...(input.placeOfService ? {\n placeOfService: pickDefined(input.placeOfService, [\n \"billingProviderId\", \"name\", \"nickname\", \"street\", \"city\", \"state\",\n \"zip\", \"county\", \"posCode\", \"isPrimary\", \"active\",\n ]) as BillReviewLocation,\n } : {}),\n lineItems: input.lineItems.map((line) => pickDefined(line, [\n \"id\", \"code\", \"modifiers\", \"units\", \"charge\", \"serviceDate\",\n \"serviceDateEnd\", \"diagnosisPointers\",\n ]) as BillReviewSaveInput[\"lineItems\"][number]),\n };\n}\n\nexport type BillSubmissionRoute = \"ebill\" | \"fax\" | \"mail\" | \"email\";\nexport type BillDeliveryOption = {\n route: BillSubmissionRoute;\n label: string;\n detail: string;\n fallback: boolean;\n confidence: string;\n payerName: string;\n target?: string;\n chKey?: string;\n payerId?: string;\n printAndMail?: boolean;\n costUsd?: number;\n};\nexport type BillDeliveryOptions = {\n payerName: string;\n recommended: BillDeliveryOption;\n options: BillDeliveryOption[];\n contacts: {\n faxNumber?: string | null;\n claimsEmail?: string | null;\n portalUrl?: string | null;\n mailingAddress?: string | null;\n adjusterName?: string | null;\n adjusterPhone?: string | null;\n adjusterEmail?: string | null;\n };\n};\nexport type SubmitBillInput = {\n route: BillSubmissionRoute;\n destination?: {\n faxNumber?: string;\n email?: string;\n mailingAddress?: string;\n };\n attention?: string;\n subject?: string;\n note?: string;\n};\nexport type BillLifecycleActionId =\n | \"second_review\"\n | \"independent_bill_review\"\n | \"view_eor\"\n | \"post_payment\"\n | \"close\"\n | \"reopen\";\n\nexport type BillLifecycleAction = {\n id: BillLifecycleActionId;\n label: string;\n enabled: boolean;\n primary?: boolean;\n reason?: string;\n};\n\nexport type BillEorDocument = {\n id: string;\n filename: string;\n description: string | null;\n addedAt: string;\n contentUrl: string;\n};\n\nexport type BillActivityRecord = {\n id: string;\n type: string;\n createdAt: string;\n title?: string;\n description: string;\n actor: string | null;\n delivery: BillSubmissionRoute | null;\n amount: number | null;\n accepted: boolean | null;\n stcCategory: string | null;\n};\n\nexport type BillPaymentRecord = {\n id: string;\n method: \"check\" | \"eft\";\n checkNumber: string;\n status: string | null;\n depositDate: string | null;\n checkReceived: boolean | null;\n receivedDate: string | null;\n amount: number;\n feeAmount: number | null;\n feeReason: string | null;\n source: \"paper\" | \"835\" | \"portal\";\n postedAt: string;\n updatedAt: string | null;\n note: string | null;\n};\n\nexport type BillRemittanceSummary = {\n payerReportedPaid: number | null;\n totalPaid: number;\n balanceDue: number;\n denialReason: string | null;\n};\n\nexport type BillLifecycleDelivery = {\n payerName: string;\n contacts: BillDeliveryOptions[\"contacts\"];\n};\n\nexport type BillLifecycleData = BillReviewData & {\n lifecycle: {\n state: string;\n nativeStatus: string;\n submittedAt?: string | null;\n agingDays?: number | null;\n updatedAt?: string | null;\n actions: BillLifecycleAction[];\n };\n eors: BillEorDocument[];\n activity: BillActivityRecord[];\n payments: BillPaymentRecord[];\n remittance: BillRemittanceSummary;\n delivery: BillLifecycleDelivery;\n};\n\nexport type BillLifecycleSession = {\n token: string;\n expiresAt?: string;\n apiBaseUrl?: string;\n};\n\nexport type BillLifecycleSessionRequest = {\n signal: AbortSignal;\n};\n\nexport type BillLifecycleSessionProvider = (\n request: BillLifecycleSessionRequest,\n) => Promise<BillLifecycleSession>;\n\nexport type CloseBillInput = { reason: string };\nexport type ReopenBillInput = { reason: string };\nexport type PostBillPaymentInput = {\n amount: number;\n method: \"check\" | \"eft\";\n checkNumber?: string;\n depositDate: string;\n note?: string;\n};\nexport type SubmitSecondReviewInput = {\n reason: string;\n payerClaimControlNumber: string;\n disputedAmount: number | undefined;\n attachmentIds: string[];\n route: BillSubmissionRoute;\n};\n\nexport type BrowserBillAddress = {\n line1: string;\n city: string;\n state: string;\n postalCode: string;\n};\n\n/** Complete bill snapshot accepted by the browser create endpoint. */\nexport type BrowserBillCreateInput = {\n externalId?: string;\n billingMode?: \"med_legal\" | \"professional\";\n patient: {\n id?: string;\n externalId?: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n dateOfBirth: string;\n ssn?: string;\n gender?: \"M\" | \"F\" | \"X\";\n phone?: string;\n address: BrowserBillAddress;\n };\n claim: {\n id?: string;\n externalId?: string;\n claimNumber: string;\n adjNumber?: string;\n employer?: string;\n dateOfInjury?: string;\n injuryState?: string;\n description?: string;\n claimsAdministrator?: { id?: string; name: string };\n };\n service: { date?: string; endDate?: string | null; authorizationNumber?: string | null };\n billingProvider?: { name?: string; taxId?: string; npi?: string; phone?: string; address?: BrowserBillAddress };\n renderingProvider?: {\n name?: string;\n specialty?: string;\n npi?: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n isQme?: boolean;\n isAme?: boolean;\n };\n serviceLocation?: { name?: string; address?: BrowserBillAddress; placeOfServiceCode?: string };\n diagnoses?: string[];\n serviceLines?: Array<{\n code: string;\n modifiers?: string[];\n units?: number;\n charge?: number;\n serviceDate?: string;\n serviceDateEnd?: string;\n diagnosisPointers?: number[];\n }>;\n};\n\nexport type BillLifecycleClientOptions = {\n /** ID of an already-submitted bill. Bills are created only by the atomic server API. */\n billId: string;\n sessionEndpoint?: string | undefined;\n getSession?: BillLifecycleSessionProvider | undefined;\n apiBaseUrl?: string | undefined;\n fetch?: typeof globalThis.fetch | undefined;\n};\n\n/** Browser-session options for pre-submission reference-data lookups. */\nexport type BillReferenceClientOptions = Omit<BillLifecycleClientOptions, \"billId\">;\n\nexport type BillReferenceClient = {\n searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;\n clearSession: () => void;\n};\n\nexport type BillLifecycleClient = {\n getBillId: () => string;\n getLifecycle: (signal?: AbortSignal) => Promise<BillLifecycleData>;\n searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;\n getDeliveryOptions: () => Promise<BillDeliveryOptions>;\n getAttachment: (attachmentId: string) => Promise<Blob>;\n getEor: (documentId: string) => Promise<Blob>;\n getPacket: () => Promise<Blob>;\n closeBill: (input: CloseBillInput) => Promise<BillLifecycleData>;\n reopenBill: (input: ReopenBillInput) => Promise<BillLifecycleData>;\n postPayment: (input: PostBillPaymentInput) => Promise<BillLifecycleData>;\n submitSecondReview: (input: SubmitSecondReviewInput) => Promise<BillLifecycleData>;\n clearSession: () => void;\n};\n\nasync function responseError(response: Response, fallback: string): Promise<Error> {\n const body: unknown = await response.json().catch(() => null);\n const detail = body && typeof body === \"object\"\n ? (body as { detail?: unknown; message?: unknown; error?: unknown }).detail\n ?? (body as { message?: unknown }).message\n ?? (body as { error?: unknown }).error\n : null;\n return new Error(typeof detail === \"string\" ? detail : fallback);\n}\n\nfunction isSessionFresh(session: BillLifecycleSession | null): boolean {\n if (!session) return false;\n if (!session.expiresAt) return true;\n const expiresAt = new Date(session.expiresAt).getTime();\n return Number.isFinite(expiresAt) && expiresAt > Date.now() + 30_000;\n}\n\nfunction normalizeSession(value: unknown): BillLifecycleSession {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing session endpoint returned an invalid response.\");\n }\n const candidate = value as { token?: unknown; expiresAt?: unknown; apiBaseUrl?: unknown; session?: unknown; data?: unknown };\n const nested = candidate.session ?? candidate.data;\n const session = nested && typeof nested === \"object\" ? nested as typeof candidate : candidate;\n if (typeof session.token !== \"string\" || session.token.length < 8) {\n throw new Error(\"The billing session endpoint did not return a browser session token.\");\n }\n return {\n token: session.token,\n ...(typeof session.expiresAt === \"string\" ? { expiresAt: session.expiresAt } : {}),\n ...(typeof session.apiBaseUrl === \"string\" ? { apiBaseUrl: session.apiBaseUrl } : {}),\n };\n}\n\nfunction normalizeLifecycle(value: unknown): BillLifecycleData {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n const data = value as Partial<BillLifecycleData>;\n if (\n !data.bill\n || !data.patient\n || !data.injury\n || !data.lifecycle\n || !Array.isArray(data.lifecycle.actions)\n || !Array.isArray(data.eors)\n || !Array.isArray(data.activity)\n || !Array.isArray(data.payments)\n || !data.remittance\n || typeof data.remittance !== \"object\"\n || !data.delivery\n || typeof data.delivery !== \"object\"\n || !data.delivery.contacts\n || typeof data.delivery.contacts !== \"object\"\n ) {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n return data as BillLifecycleData;\n}\n\nfunction normalizeDeliveryOptions(value: unknown): BillDeliveryOptions {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing service returned invalid delivery options.\");\n }\n const data = value as Partial<BillDeliveryOptions>;\n if (\n typeof data.payerName !== \"string\"\n || !data.recommended\n || typeof data.recommended !== \"object\"\n || ![\"ebill\", \"fax\", \"mail\", \"email\"].includes(data.recommended.route ?? \"\")\n || !Array.isArray(data.options)\n || !data.contacts\n ) {\n throw new Error(\"The billing service returned invalid delivery options.\");\n }\n return data as BillDeliveryOptions;\n}\n\nfunction idempotencyKey(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") return globalThis.crypto.randomUUID();\n return `mb-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** Browser-safe, framework-neutral client for an already-submitted bill. */\nexport function createBillLifecycleClient({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n fetch: fetchOverride,\n}: BillLifecycleClientOptions): BillLifecycleClient {\n const fetcher = fetchOverride ?? globalThis.fetch;\n if (typeof fetcher !== \"function\") throw new Error(\"A Fetch API implementation is required.\");\n let session: BillLifecycleSession | null = null;\n let sessionRequest: Promise<BillLifecycleSession> | null = null;\n const currentBillId = billId.trim();\n if (!currentBillId) throw new Error(\"billId is required for the submitted-bill lifecycle client.\");\n\n const mintSession = async (signal: AbortSignal, force = false): Promise<BillLifecycleSession> => {\n if (!force && isSessionFresh(session)) return session as BillLifecycleSession;\n if (!force && sessionRequest) return sessionRequest;\n const pending = getSession\n ? getSession({ signal })\n : fetcher(sessionEndpoint, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({}),\n signal,\n }).then(async (response) => {\n if (!response.ok) throw await responseError(response, \"The billing session could not be created.\");\n return response.json();\n });\n const request = Promise.resolve(pending).then(normalizeSession).then((nextSession) => {\n session = nextSession;\n return nextSession;\n }).finally(() => {\n if (sessionRequest === request) sessionRequest = null;\n });\n sessionRequest = request;\n return request;\n };\n\n const request = async (path: string, init: RequestInit = {}, providedSignal?: AbortSignal): Promise<Response> => {\n const controller = providedSignal ? null : new AbortController();\n const signal = providedSignal ?? controller?.signal;\n if (!signal) throw new Error(\"An AbortSignal could not be created.\");\n let browserSession = await mintSession(signal);\n const perform = (current: BillLifecycleSession) => {\n const base = (current.apiBaseUrl ?? apiBaseUrl).replace(/\\/$/, \"\");\n const headers = new Headers(init.headers);\n headers.set(\"authorization\", `Bearer ${current.token}`);\n return fetcher(`${base}${path}`, { ...init, headers, signal });\n };\n let response = await perform(browserSession);\n if (response.status === 401) {\n session = null;\n browserSession = await mintSession(signal, true);\n response = await perform(browserSession);\n }\n return response;\n };\n\n const billPath = (suffix = \"\"): string =>\n `/partner/v2/browser/bills/${encodeURIComponent(currentBillId)}${suffix}`;\n\n const loadLifecycle = async (signal?: AbortSignal) => {\n const response = await request(billPath(\"/lifecycle\"), {}, signal);\n if (!response.ok) throw await responseError(response, \"Bill lifecycle could not be loaded.\");\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n\n const searchClaimsAdministrators = async (query: string, claimNumber?: string): Promise<BillReviewPayer[]> => {\n const params = new URLSearchParams();\n if (query.trim()) params.set(\"q\", query.trim());\n if (claimNumber?.trim()) params.set(\"claimNumber\", claimNumber.trim());\n const response = await request(`/partner/v2/browser/claims-administrators?${params.toString()}`);\n if (!response.ok) throw await responseError(response, \"Claims administrator search is unavailable.\");\n const body = await response.json() as { results?: unknown };\n if (!Array.isArray(body.results)) throw new Error(\"Claims administrator search returned an invalid response.\");\n return body.results.flatMap((value): BillReviewPayer[] => {\n if (!value || typeof value !== \"object\") return [];\n const payer = value as Partial<BillReviewPayer>;\n if (typeof payer.id !== \"string\" || typeof payer.name !== \"string\") return [];\n return [{\n id: payer.id,\n name: payer.name,\n ...(typeof payer.hasElectronic === \"boolean\" ? { hasElectronic: payer.hasElectronic } : {}),\n ...(Array.isArray(payer.states)\n ? { states: payer.states.filter((state): state is string => typeof state === \"string\") }\n : {}),\n ...([\"high\", \"medium\", \"directory\"].includes(payer.confidence ?? \"\")\n ? { confidence: payer.confidence as NonNullable<BillReviewPayer[\"confidence\"]> }\n : {}),\n ...(typeof payer.recommended === \"boolean\" ? { recommended: payer.recommended } : {}),\n ...(Array.isArray(payer.signals)\n ? {\n signals: payer.signals.flatMap((signal) => {\n if (!signal || typeof signal !== \"object\") return [];\n const candidate = signal as { kind?: unknown; state?: unknown; label?: unknown };\n if (\n ![\"name\", \"claim_number\"].includes(String(candidate.kind))\n || ![\"match\", \"warning\"].includes(String(candidate.state))\n || typeof candidate.label !== \"string\"\n ) return [];\n return [{\n kind: candidate.kind as \"name\" | \"claim_number\",\n state: candidate.state as \"match\" | \"warning\",\n label: candidate.label,\n }];\n }),\n }\n : {}),\n }];\n });\n };\n\n const mutation = async (path: string, init: RequestInit, fallback: string) => {\n const headers = new Headers(init.headers);\n headers.set(\"idempotency-key\", idempotencyKey());\n const response = await request(path, { ...init, headers });\n if (!response.ok) throw await responseError(response, fallback);\n return response;\n };\n const action = async (input: Record<string, unknown>, fallback: string): Promise<BillLifecycleData> => {\n const response = await mutation(billPath(\"/actions\"), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n }, fallback);\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n return {\n getBillId() { return currentBillId; },\n clearSession() { session = null; sessionRequest = null; },\n getLifecycle: loadLifecycle,\n searchClaimsAdministrators,\n async getDeliveryOptions() {\n const response = await request(billPath(\"/delivery-options\"));\n if (!response.ok) throw await responseError(response, \"Delivery options could not be loaded.\");\n const body = await response.json() as { data?: unknown };\n return normalizeDeliveryOptions(body.data ?? body);\n },\n async getAttachment(attachmentId) {\n const response = await request(billPath(`/documents/${encodeURIComponent(attachmentId)}`));\n if (!response.ok) throw await responseError(response, \"Document could not be opened.\");\n return response.blob();\n },\n async getEor(documentId) {\n const response = await request(billPath(`/eors/${encodeURIComponent(documentId)}`));\n if (!response.ok) throw await responseError(response, \"EOR could not be opened.\");\n return response.blob();\n },\n async getPacket() {\n const response = await request(billPath(\"/packet\"));\n if (!response.ok) throw await responseError(response, \"Submission packet could not be downloaded.\");\n return response.blob();\n },\n closeBill(input) { return action({ action: \"close\", ...input }, \"Bill could not be closed.\"); },\n reopenBill(input) { return action({ action: \"reopen\", ...input }, \"Bill could not be reopened.\"); },\n postPayment(input) { return action({ action: \"post_payment\", ...input, checkNumber: input.checkNumber ?? \"\" }, \"Payment could not be posted.\"); },\n submitSecondReview(input) { return action({ action: \"second_review\", ...input }, \"Second Review could not be submitted.\"); },\n };\n}\n\n/**\n * Browser-safe client for reference data needed before a bill exists.\n *\n * Partners can pass the same short-lived session provider used by the submitted-bill\n * lifecycle without inventing a draft bill or exposing payer directory credentials.\n */\nexport function createBillReferenceClient(\n options: BillReferenceClientOptions = {},\n): BillReferenceClient {\n const lifecycle = createBillLifecycleClient({\n ...options,\n billId: \"pre-submission-reference-data\",\n });\n return {\n searchClaimsAdministrators: lifecycle.searchClaimsAdministrators,\n clearSession: lifecycle.clearSession,\n };\n}\n"],"mappings":";AAAO,IAAM,uBAAuB;AAC7B,IAAM,2BAA2B;AA6LxC,SAAS,YACP,QACA,MACyB;AACzB,QAAM,SAAS;AACf,SAAO,OAAO;AAAA,IACZ,KAAK,QAAQ,CAAC,QAAQ,OAAO,GAAG,MAAM,SAAY,CAAC,IAAI,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC;AAAA,EAC7E;AACF;AAOO,SAAS,4BACd,OACqB;AACrB,SAAO;AAAA,IACL,eAAe,MAAM;AAAA,IACrB,GAAI,MAAM,mBAAmB;AAAA,MAC3B,kBAAkB,YAAY,MAAM,kBAAkB;AAAA,QACpD;AAAA,QAAa;AAAA,QAAc;AAAA,QAAY;AAAA,MACzC,CAAC;AAAA,IACH,IAAI,CAAC;AAAA,IACL,GAAI,MAAM,kBAAkB;AAAA,MAC1B,iBAAiB,YAAY,MAAM,iBAAiB;AAAA,QAClD;AAAA,QAAe;AAAA,QAAY;AAAA,QAAO;AAAA,QAClC;AAAA,QAAoB;AAAA,MACtB,CAAC;AAAA,IACH,IAAI,CAAC;AAAA,IACL,KAAK,MAAM;AAAA,IACX,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,IAC7D,GAAI,MAAM,wBAAwB,SAC9B,EAAE,qBAAqB,MAAM,oBAAoB,IACjD,CAAC;AAAA,IACL,GAAI,MAAM,kBAAkB;AAAA,MAC1B,iBAAiB,YAAY,MAAM,iBAAiB;AAAA,QAClD;AAAA,QAAQ;AAAA,QAAS;AAAA,QAAO;AAAA,QAAY;AAAA,QAAS;AAAA,QAC7C;AAAA,QAAe;AAAA,QAAgB;AAAA,MACjC,CAAC;AAAA,IACH,IAAI,CAAC;AAAA,IACL,GAAI,MAAM,oBAAoB;AAAA,MAC5B,mBAAmB,YAAY,MAAM,mBAAmB;AAAA,QACtD;AAAA,QAAQ;AAAA,QAAa;AAAA,QAAO;AAAA,QAAY;AAAA,QACxC;AAAA,QAAgB;AAAA,QAAgB;AAAA,QAAgB;AAAA,QAAS;AAAA,QACzD;AAAA,QAAS;AAAA,MACX,CAAC;AAAA,IACH,IAAI,CAAC;AAAA,IACL,GAAI,MAAM,iBAAiB;AAAA,MACzB,gBAAgB,YAAY,MAAM,gBAAgB;AAAA,QAChD;AAAA,QAAqB;AAAA,QAAQ;AAAA,QAAY;AAAA,QAAU;AAAA,QAAQ;AAAA,QAC3D;AAAA,QAAO;AAAA,QAAU;AAAA,QAAW;AAAA,QAAa;AAAA,MAC3C,CAAC;AAAA,IACH,IAAI,CAAC;AAAA,IACL,WAAW,MAAM,UAAU,IAAI,CAAC,SAAS,YAAY,MAAM;AAAA,MACzD;AAAA,MAAM;AAAA,MAAQ;AAAA,MAAa;AAAA,MAAS;AAAA,MAAU;AAAA,MAC9C;AAAA,MAAkB;AAAA,IACpB,CAAC,CAA6C;AAAA,EAChD;AACF;AAqPA,eAAe,cAAc,UAAoB,UAAkC;AACjF,QAAM,OAAgB,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AAC5D,QAAM,SAAS,QAAQ,OAAO,SAAS,WAClC,KAAkE,UAC/D,KAA+B,WAC/B,KAA6B,QACjC;AACJ,SAAO,IAAI,MAAM,OAAO,WAAW,WAAW,SAAS,QAAQ;AACjE;AAEA,SAAS,eAAe,SAA+C;AACrE,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,CAAC,QAAQ,UAAW,QAAO;AAC/B,QAAM,YAAY,IAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ;AACtD,SAAO,OAAO,SAAS,SAAS,KAAK,YAAY,KAAK,IAAI,IAAI;AAChE;AAEA,SAAS,iBAAiB,OAAsC;AAC9D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AACA,QAAM,YAAY;AAClB,QAAM,SAAS,UAAU,WAAW,UAAU;AAC9C,QAAM,UAAU,UAAU,OAAO,WAAW,WAAW,SAA6B;AACpF,MAAI,OAAO,QAAQ,UAAU,YAAY,QAAQ,MAAM,SAAS,GAAG;AACjE,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AACA,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,GAAI,OAAO,QAAQ,cAAc,WAAW,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,IAChF,GAAI,OAAO,QAAQ,eAAe,WAAW,EAAE,YAAY,QAAQ,WAAW,IAAI,CAAC;AAAA,EACrF;AACF;AAEA,SAAS,mBAAmB,OAAmC;AAC7D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,QAAM,OAAO;AACb,MACE,CAAC,KAAK,QACH,CAAC,KAAK,WACN,CAAC,KAAK,UACN,CAAC,KAAK,aACN,CAAC,MAAM,QAAQ,KAAK,UAAU,OAAO,KACrC,CAAC,MAAM,QAAQ,KAAK,IAAI,KACxB,CAAC,MAAM,QAAQ,KAAK,QAAQ,KAC5B,CAAC,MAAM,QAAQ,KAAK,QAAQ,KAC5B,CAAC,KAAK,cACN,OAAO,KAAK,eAAe,YAC3B,CAAC,KAAK,YACN,OAAO,KAAK,aAAa,YACzB,CAAC,KAAK,SAAS,YACf,OAAO,KAAK,SAAS,aAAa,UACrC;AACA,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,OAAqC;AACrE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,QAAM,OAAO;AACb,MACE,OAAO,KAAK,cAAc,YACvB,CAAC,KAAK,eACN,OAAO,KAAK,gBAAgB,YAC5B,CAAC,CAAC,SAAS,OAAO,QAAQ,OAAO,EAAE,SAAS,KAAK,YAAY,SAAS,EAAE,KACxE,CAAC,MAAM,QAAQ,KAAK,OAAO,KAC3B,CAAC,KAAK,UACT;AACA,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO;AACT;AAEA,SAAS,iBAAyB;AAChC,MAAI,OAAO,WAAW,QAAQ,eAAe,WAAY,QAAO,WAAW,OAAO,WAAW;AAC7F,SAAO,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAChE;AAGO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,aAAa;AAAA,EACb,OAAO;AACT,GAAoD;AAClD,QAAM,UAAU,iBAAiB,WAAW;AAC5C,MAAI,OAAO,YAAY,WAAY,OAAM,IAAI,MAAM,yCAAyC;AAC5F,MAAI,UAAuC;AAC3C,MAAI,iBAAuD;AAC3D,QAAM,gBAAgB,OAAO,KAAK;AAClC,MAAI,CAAC,cAAe,OAAM,IAAI,MAAM,6DAA6D;AAEjG,QAAM,cAAc,OAAO,QAAqB,QAAQ,UAAyC;AAC/F,QAAI,CAAC,SAAS,eAAe,OAAO,EAAG,QAAO;AAC9C,QAAI,CAAC,SAAS,eAAgB,QAAO;AACrC,UAAM,UAAU,aACZ,WAAW,EAAE,OAAO,CAAC,IACrB,QAAQ,iBAAiB;AAAA,MACzB,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,MACvB;AAAA,IACF,CAAC,EAAE,KAAK,OAAO,aAAa;AAC1B,UAAI,CAAC,SAAS,GAAI,OAAM,MAAM,cAAc,UAAU,2CAA2C;AACjG,aAAO,SAAS,KAAK;AAAA,IACvB,CAAC;AACH,UAAMA,WAAU,QAAQ,QAAQ,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;AACpF,gBAAU;AACV,aAAO;AAAA,IACT,CAAC,EAAE,QAAQ,MAAM;AACf,UAAI,mBAAmBA,SAAS,kBAAiB;AAAA,IACnD,CAAC;AACD,qBAAiBA;AACjB,WAAOA;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,MAAc,OAAoB,CAAC,GAAG,mBAAoD;AAC/G,UAAM,aAAa,iBAAiB,OAAO,IAAI,gBAAgB;AAC/D,UAAM,SAAS,kBAAkB,YAAY;AAC7C,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,sCAAsC;AACnE,QAAI,iBAAiB,MAAM,YAAY,MAAM;AAC7C,UAAM,UAAU,CAAC,YAAkC;AACjD,YAAM,QAAQ,QAAQ,cAAc,YAAY,QAAQ,OAAO,EAAE;AACjE,YAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,cAAQ,IAAI,iBAAiB,UAAU,QAAQ,KAAK,EAAE;AACtD,aAAO,QAAQ,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,MAAM,SAAS,OAAO,CAAC;AAAA,IAC/D;AACA,QAAI,WAAW,MAAM,QAAQ,cAAc;AAC3C,QAAI,SAAS,WAAW,KAAK;AAC3B,gBAAU;AACV,uBAAiB,MAAM,YAAY,QAAQ,IAAI;AAC/C,iBAAW,MAAM,QAAQ,cAAc;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,SAAS,OACzB,6BAA6B,mBAAmB,aAAa,CAAC,GAAG,MAAM;AAEzE,QAAM,gBAAgB,OAAO,WAAyB;AACpD,UAAM,WAAW,MAAM,QAAQ,SAAS,YAAY,GAAG,CAAC,GAAG,MAAM;AACjE,QAAI,CAAC,SAAS,GAAI,OAAM,MAAM,cAAc,UAAU,qCAAqC;AAC3F,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,mBAAmB,KAAK,IAAI;AAAA,EACrC;AAEA,QAAM,6BAA6B,OAAO,OAAe,gBAAqD;AAC5G,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,KAAK,EAAG,QAAO,IAAI,KAAK,MAAM,KAAK,CAAC;AAC9C,QAAI,aAAa,KAAK,EAAG,QAAO,IAAI,eAAe,YAAY,KAAK,CAAC;AACrE,UAAM,WAAW,MAAM,QAAQ,6CAA6C,OAAO,SAAS,CAAC,EAAE;AAC/F,QAAI,CAAC,SAAS,GAAI,OAAM,MAAM,cAAc,UAAU,6CAA6C;AACnG,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,2DAA2D;AAC7G,WAAO,KAAK,QAAQ,QAAQ,CAAC,UAA6B;AACxD,UAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC;AACjD,YAAM,QAAQ;AACd,UAAI,OAAO,MAAM,OAAO,YAAY,OAAO,MAAM,SAAS,SAAU,QAAO,CAAC;AAC5E,aAAO,CAAC;AAAA,QACN,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,GAAI,OAAO,MAAM,kBAAkB,YAAY,EAAE,eAAe,MAAM,cAAc,IAAI,CAAC;AAAA,QACzF,GAAI,MAAM,QAAQ,MAAM,MAAM,IAC1B,EAAE,QAAQ,MAAM,OAAO,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAAE,IACrF,CAAC;AAAA,QACL,GAAI,CAAC,QAAQ,UAAU,WAAW,EAAE,SAAS,MAAM,cAAc,EAAE,IAC/D,EAAE,YAAY,MAAM,WAAyD,IAC7E,CAAC;AAAA,QACL,GAAI,OAAO,MAAM,gBAAgB,YAAY,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,QACnF,GAAI,MAAM,QAAQ,MAAM,OAAO,IAC3B;AAAA,UACE,SAAS,MAAM,QAAQ,QAAQ,CAAC,WAAW;AACzC,gBAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO,CAAC;AACnD,kBAAM,YAAY;AAClB,gBACE,CAAC,CAAC,QAAQ,cAAc,EAAE,SAAS,OAAO,UAAU,IAAI,CAAC,KACtD,CAAC,CAAC,SAAS,SAAS,EAAE,SAAS,OAAO,UAAU,KAAK,CAAC,KACtD,OAAO,UAAU,UAAU,SAC9B,QAAO,CAAC;AACV,mBAAO,CAAC;AAAA,cACN,MAAM,UAAU;AAAA,cAChB,OAAO,UAAU;AAAA,cACjB,OAAO,UAAU;AAAA,YACnB,CAAC;AAAA,UACH,CAAC;AAAA,QACH,IACA,CAAC;AAAA,MACP,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,OAAO,MAAc,MAAmB,aAAqB;AAC5E,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,YAAQ,IAAI,mBAAmB,eAAe,CAAC;AAC/C,UAAM,WAAW,MAAM,QAAQ,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC;AACzD,QAAI,CAAC,SAAS,GAAI,OAAM,MAAM,cAAc,UAAU,QAAQ;AAC9D,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,OAAgC,aAAiD;AACrG,UAAM,WAAW,MAAM,SAAS,SAAS,UAAU,GAAG;AAAA,MACpD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,KAAK;AAAA,IAC5B,GAAG,QAAQ;AACX,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,mBAAmB,KAAK,IAAI;AAAA,EACrC;AACA,SAAO;AAAA,IACL,YAAY;AAAE,aAAO;AAAA,IAAe;AAAA,IACpC,eAAe;AAAE,gBAAU;AAAM,uBAAiB;AAAA,IAAM;AAAA,IACxD,cAAc;AAAA,IACd;AAAA,IACA,MAAM,qBAAqB;AACzB,YAAM,WAAW,MAAM,QAAQ,SAAS,mBAAmB,CAAC;AAC5D,UAAI,CAAC,SAAS,GAAI,OAAM,MAAM,cAAc,UAAU,uCAAuC;AAC7F,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,aAAO,yBAAyB,KAAK,QAAQ,IAAI;AAAA,IACnD;AAAA,IACA,MAAM,cAAc,cAAc;AAChC,YAAM,WAAW,MAAM,QAAQ,SAAS,cAAc,mBAAmB,YAAY,CAAC,EAAE,CAAC;AACzF,UAAI,CAAC,SAAS,GAAI,OAAM,MAAM,cAAc,UAAU,+BAA+B;AACrF,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IACA,MAAM,OAAO,YAAY;AACvB,YAAM,WAAW,MAAM,QAAQ,SAAS,SAAS,mBAAmB,UAAU,CAAC,EAAE,CAAC;AAClF,UAAI,CAAC,SAAS,GAAI,OAAM,MAAM,cAAc,UAAU,0BAA0B;AAChF,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IACA,MAAM,YAAY;AAChB,YAAM,WAAW,MAAM,QAAQ,SAAS,SAAS,CAAC;AAClD,UAAI,CAAC,SAAS,GAAI,OAAM,MAAM,cAAc,UAAU,4CAA4C;AAClG,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IACA,UAAU,OAAO;AAAE,aAAO,OAAO,EAAE,QAAQ,SAAS,GAAG,MAAM,GAAG,2BAA2B;AAAA,IAAG;AAAA,IAC9F,WAAW,OAAO;AAAE,aAAO,OAAO,EAAE,QAAQ,UAAU,GAAG,MAAM,GAAG,6BAA6B;AAAA,IAAG;AAAA,IAClG,YAAY,OAAO;AAAE,aAAO,OAAO,EAAE,QAAQ,gBAAgB,GAAG,OAAO,aAAa,MAAM,eAAe,GAAG,GAAG,8BAA8B;AAAA,IAAG;AAAA,IAChJ,mBAAmB,OAAO;AAAE,aAAO,OAAO,EAAE,QAAQ,iBAAiB,GAAG,MAAM,GAAG,uCAAuC;AAAA,IAAG;AAAA,EAC7H;AACF;AAQO,SAAS,0BACd,UAAsC,CAAC,GAClB;AACrB,QAAM,YAAY,0BAA0B;AAAA,IAC1C,GAAG;AAAA,IACH,QAAQ;AAAA,EACV,CAAC;AACD,SAAO;AAAA,IACL,4BAA4B,UAAU;AAAA,IACtC,cAAc,UAAU;AAAA,EAC1B;AACF;","names":["request"]}
|