@mindbill/angular 0.1.1 → 0.1.2

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 CHANGED
@@ -32,6 +32,8 @@ export class CaseBillingComponent {
32
32
 
33
33
  The component loads and refreshes status, searches the payer directory, saves bill edits, manages the explicit payer packet, submits the bill, shows EORs, and exposes the correct payment, review, correction, resubmission, and close actions for the current state.
34
34
 
35
+ Procedure entry always keeps one empty row after the entered lines. Starting a code, modifier, or non-default unit count opens the next row automatically; the empty row is never included in save or submit payloads.
36
+
35
37
  Add one authenticated server endpoint. It verifies that the signed-in user may access the bill, then mints a short-lived token bound to that bill and browser origin.
36
38
 
37
39
  ```ts
@@ -103,6 +103,25 @@ class MindBillLifecycleStore {
103
103
  }
104
104
  }
105
105
 
106
+ const EMPTY_PROCEDURE_LINE = {
107
+ code: "",
108
+ modifiers: [],
109
+ units: 1,
110
+ charge: 0,
111
+ };
112
+ function isEmptyProcedureLine(line) {
113
+ return !line.code.trim() && line.modifiers.length === 0 && line.units === 1;
114
+ }
115
+ /** Keeps completed/partial lines plus one keyboard-ready empty row. */
116
+ function ensureTrailingProcedureLine(lines) {
117
+ const entered = lines
118
+ .filter((line) => !isEmptyProcedureLine(line))
119
+ .map((line) => ({ ...line, modifiers: [...line.modifiers] }));
120
+ return entered.length < 50
121
+ ? [...entered, { ...EMPTY_PROCEDURE_LINE, modifiers: [] }]
122
+ : entered;
123
+ }
124
+
106
125
  const THEMES = {
107
126
  mindbill: { preset: "mindbill", accentColor: "#238dbd", accentTextColor: "#fff", backgroundColor: "#f3f8fa", surfaceColor: "#fff", textColor: "#203743", mutedColor: "#657982", borderColor: "#dbe6ea", borderRadius: "14px", controlRadius: "8px", fontFamily: "Inter,system-ui,sans-serif" },
108
127
  "qme-companion": { preset: "qme-companion", accentColor: "#53b5dc", accentTextColor: "#173542", backgroundColor: "#f2f8fb", surfaceColor: "#fff", textColor: "#1d3440", mutedColor: "#617783", borderColor: "#d7e5eb", borderRadius: "12px", controlRadius: "8px", fontFamily: "Inter,system-ui,sans-serif" },
@@ -191,9 +210,9 @@ class MindBillBillLifecycleComponent {
191
210
  return; this.draft.injury.claimsAdminId = payer.id; this.draft.injury.claimsAdminName = payer.name; this.payerQuery = ""; this.payerResults = []; this.dirty = true; }
192
211
  clearPayer() { if (!this.draft)
193
212
  return; this.draft.injury.claimsAdminId = ""; this.draft.injury.claimsAdminName = ""; this.dirty = true; }
194
- addLine() { this.draft?.bill.lineItems.push({ code: "", modifiers: [], units: 1, charge: 0 }); this.dirty = true; }
195
- removeLine(index) { this.draft?.bill.lineItems.splice(index, 1); this.dirty = true; }
196
- setModifiers(line, value) { line.modifiers = value.split(",").map((item) => item.trim().replace(/^-/, "")).filter(Boolean); this.dirty = true; }
213
+ lineChanged() { this.normalizeLineItems(); this.dirty = true; }
214
+ removeLine(index) { this.draft?.bill.lineItems.splice(index, 1); this.normalizeLineItems(); this.dirty = true; }
215
+ setModifiers(line, value) { line.modifiers = value.split(",").map((item) => item.trim().replace(/^-/, "")).filter(Boolean); this.normalizeLineItems(); this.dirty = true; }
197
216
  fileSelected(event) { this.pendingFile = event.target.files?.[0] ?? null; }
198
217
  async attach() { if (!this.pendingFile)
199
218
  return; await this.store.addAttachment(this.pendingFile, this.documentType); this.pendingFile = null; this.notice = "Document attached."; }
@@ -246,7 +265,7 @@ class MindBillBillLifecycleComponent {
246
265
  billingProvider: this.draft.billingProvider,
247
266
  renderingProvider: this.draft.clinician,
248
267
  placeOfService: this.draft.location,
249
- lineItems: this.draft.bill.lineItems.map((line) => ({
268
+ lineItems: this.draft.bill.lineItems.filter((line) => line.code.trim()).map((line) => ({
250
269
  ...(line.id ? { id: line.id } : {}),
251
270
  code: line.code,
252
271
  modifiers: line.modifiers,
@@ -257,8 +276,10 @@ class MindBillBillLifecycleComponent {
257
276
  makeDraft(data) {
258
277
  const snapshot = data.bill.billingSnapshot ?? {};
259
278
  const names = data.patient.name.trim().split(/\s+/);
260
- return { patient: { ...data.patient, firstName: data.patient.firstName ?? names[0] ?? "", lastName: data.patient.lastName ?? names.slice(1).join(" ") }, injury: { ...data.injury }, bill: { ...data.bill, lineItems: data.bill.lineItems.map((line) => ({ ...line, modifiers: [...line.modifiers] })) }, billingProvider: snapshot.billingProvider ?? { name: "", taxId: "", npi: "", billType: "Professional" }, clinician: snapshot.renderingProvider ?? { name: "", specialty: "", npi: "" }, location: snapshot.placeOfService ?? { name: "", street: "", city: "", state: "", zip: "", posCode: "11" } };
279
+ return { patient: { ...data.patient, firstName: data.patient.firstName ?? names[0] ?? "", lastName: data.patient.lastName ?? names.slice(1).join(" ") }, injury: { ...data.injury }, bill: { ...data.bill, lineItems: ensureTrailingProcedureLine(data.bill.lineItems) }, billingProvider: snapshot.billingProvider ?? { name: "", taxId: "", npi: "", billType: "Professional" }, clinician: snapshot.renderingProvider ?? { name: "", specialty: "", npi: "" }, location: snapshot.placeOfService ?? { name: "", street: "", city: "", state: "", zip: "", posCode: "11" } };
261
280
  }
281
+ normalizeLineItems() { if (this.draft)
282
+ this.draft.bill.lineItems = ensureTrailingProcedureLine(this.draft.bill.lineItems); }
262
283
  openBlob(blob, filename) { const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.target = "_blank"; link.rel = "noopener"; link.download = filename; link.click(); setTimeout(() => URL.revokeObjectURL(url), 60_000); }
263
284
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: MindBillBillLifecycleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
264
285
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: MindBillBillLifecycleComponent, isStandalone: true, selector: "mindbill-bill-lifecycle", inputs: { billId: "billId", sessionEndpoint: "sessionEndpoint", apiBaseUrl: "apiBaseUrl", getSession: "getSession", refreshInterval: "refreshInterval", appearance: "appearance" }, outputs: { billIdChange: "billIdChange", submitted: "submitted", billingError: "billingError" }, usesOnChanges: true, ngImport: i0, template: `
@@ -324,8 +345,8 @@ class MindBillBillLifecycleComponent {
324
345
  </section>
325
346
 
326
347
  <section class="card">
327
- <div class="card-title"><div><h3>Charges</h3><p>Review procedure codes, modifiers, units, and allowed amounts.</p></div><button type="button" (click)="addLine()">+ Add line</button></div>
328
- <div class="lines">@for (line of draft.bill.lineItems; track $index; let i=$index) { <div class="line"><label><span>Procedure</span><input required [(ngModel)]="line.code" [name]="'code'+i" (ngModelChange)="dirty=true"></label><label><span>Modifiers</span><input [ngModel]="line.modifiers.join(', ')" (ngModelChange)="setModifiers(line,$any($event))" [name]="'modifiers'+i" placeholder="95, 93"></label><label><span>Units</span><input required type="number" min="1" [(ngModel)]="line.units" [name]="'units'+i" (ngModelChange)="dirty=true"></label><div class="allowed"><span>Allowed</span><strong>{{ line.charge | currency }}</strong></div><button type="button" class="remove" (click)="removeLine(i)" aria-label="Remove line">×</button></div> }</div>
348
+ <div class="card-title"><div><h3>Charges</h3><p>Review procedure codes, modifiers, units, and allowed amounts. A new row appears as you type.</p></div></div>
349
+ <div class="lines">@for (line of draft.bill.lineItems; track $index; let i=$index) { <div class="line"><label><span>Procedure</span><input required [(ngModel)]="line.code" [name]="'code'+i" (ngModelChange)="lineChanged()"></label><label><span>Modifiers</span><input [ngModel]="line.modifiers.join(', ')" (ngModelChange)="setModifiers(line,$any($event))" [name]="'modifiers'+i" placeholder="95, 93"></label><label><span>Units</span><input required type="number" min="1" [(ngModel)]="line.units" [name]="'units'+i" (ngModelChange)="lineChanged()"></label><div class="allowed"><span>Allowed</span><strong>{{ line.charge | currency }}</strong></div><button type="button" class="remove" (click)="removeLine(i)" aria-label="Remove line">×</button></div> }</div>
329
350
  </section>
330
351
 
331
352
  <section class="card">
@@ -419,8 +440,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
419
440
  </section>
420
441
 
421
442
  <section class="card">
422
- <div class="card-title"><div><h3>Charges</h3><p>Review procedure codes, modifiers, units, and allowed amounts.</p></div><button type="button" (click)="addLine()">+ Add line</button></div>
423
- <div class="lines">@for (line of draft.bill.lineItems; track $index; let i=$index) { <div class="line"><label><span>Procedure</span><input required [(ngModel)]="line.code" [name]="'code'+i" (ngModelChange)="dirty=true"></label><label><span>Modifiers</span><input [ngModel]="line.modifiers.join(', ')" (ngModelChange)="setModifiers(line,$any($event))" [name]="'modifiers'+i" placeholder="95, 93"></label><label><span>Units</span><input required type="number" min="1" [(ngModel)]="line.units" [name]="'units'+i" (ngModelChange)="dirty=true"></label><div class="allowed"><span>Allowed</span><strong>{{ line.charge | currency }}</strong></div><button type="button" class="remove" (click)="removeLine(i)" aria-label="Remove line">×</button></div> }</div>
443
+ <div class="card-title"><div><h3>Charges</h3><p>Review procedure codes, modifiers, units, and allowed amounts. A new row appears as you type.</p></div></div>
444
+ <div class="lines">@for (line of draft.bill.lineItems; track $index; let i=$index) { <div class="line"><label><span>Procedure</span><input required [(ngModel)]="line.code" [name]="'code'+i" (ngModelChange)="lineChanged()"></label><label><span>Modifiers</span><input [ngModel]="line.modifiers.join(', ')" (ngModelChange)="setModifiers(line,$any($event))" [name]="'modifiers'+i" placeholder="95, 93"></label><label><span>Units</span><input required type="number" min="1" [(ngModel)]="line.units" [name]="'units'+i" (ngModelChange)="lineChanged()"></label><div class="allowed"><span>Allowed</span><strong>{{ line.charge | currency }}</strong></div><button type="button" class="remove" (click)="removeLine(i)" aria-label="Remove line">×</button></div> }</div>
424
445
  </section>
425
446
 
426
447
  <section class="card">
@@ -473,5 +494,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
473
494
  * Generated bundle index. Do not edit.
474
495
  */
475
496
 
476
- export { MindBillBillLifecycleComponent, MindBillLifecycleStore };
497
+ export { MindBillBillLifecycleComponent, MindBillLifecycleStore, ensureTrailingProcedureLine };
477
498
  //# sourceMappingURL=mindbill-angular.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mindbill-angular.mjs","sources":["../../src/lib/lifecycle-store.ts","../../src/lib/bill-lifecycle.component.ts","../../src/mindbill-angular.ts"],"sourcesContent":["import { computed, signal } from \"@angular/core\";\nimport {\n createBillLifecycleClient,\n type BillLifecycleClient,\n type BillLifecycleClientOptions,\n type BillLifecycleData,\n type BillReviewDocumentType,\n type BillReviewSaveInput,\n type BillSubmissionRoute,\n type CloseBillInput,\n type PostBillPaymentInput,\n type SubmitSecondReviewInput,\n} from \"@mindbill/browser\";\n\nexport class MindBillLifecycleStore {\n readonly billId = signal(\"\");\n readonly data = signal<BillLifecycleData | null>(null);\n readonly error = signal<Error | null>(null);\n readonly loading = signal(false);\n readonly mutating = signal(false);\n readonly ready = computed(() => this.data() !== null && !this.loading());\n private client: BillLifecycleClient | null = null;\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n connect(options: BillLifecycleClientOptions, refreshInterval = 60_000): void {\n this.disconnect();\n this.billId.set(options.billId);\n this.client = createBillLifecycleClient(options);\n void this.refresh();\n if (refreshInterval > 0) {\n this.refreshTimer = setInterval(() => void this.refresh(), refreshInterval);\n }\n }\n\n disconnect(): void {\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n this.client?.clearSession();\n this.client = null;\n }\n\n async refresh(): Promise<BillLifecycleData | null> {\n if (!this.client) return null;\n this.loading.set(this.data() === null);\n try {\n const data = await this.client.getLifecycle();\n this.data.set(data);\n this.error.set(null);\n return data;\n } catch (cause) {\n this.error.set(cause instanceof Error ? cause : new Error(\"Bill could not be loaded.\"));\n return null;\n } finally {\n this.loading.set(false);\n }\n }\n\n searchClaimsAdministrators(query: string, claimNumber?: string) {\n return this.requireClient().searchClaimsAdministrators(query, claimNumber);\n }\n saveReview(input: BillReviewSaveInput) { return this.mutate(() => this.requireClient().saveReview(input)); }\n submitBill(input: BillReviewSaveInput, route: BillSubmissionRoute) { return this.mutate(() => this.requireClient().submitBill(input, route)); }\n addAttachment(file: File, type: BillReviewDocumentType, description?: string) { return this.mutate(() => this.requireClient().addAttachment(file, type, description)); }\n removeAttachment(id: string) { return this.mutate(() => this.requireClient().removeAttachment(id)); }\n getAttachment(id: string) { return this.requireClient().getAttachment(id); }\n getEor(id: string) { return this.requireClient().getEor(id); }\n closeBill(input: CloseBillInput) { return this.mutate(() => this.requireClient().closeBill(input)); }\n postPayment(input: PostBillPaymentInput) { return this.mutate(() => this.requireClient().postPayment(input)); }\n submitSecondReview(input: SubmitSecondReviewInput) { return this.mutate(() => this.requireClient().submitSecondReview(input)); }\n\n async startCorrection(): Promise<BillLifecycleData> {\n this.mutating.set(true);\n try {\n const result = await this.requireClient().startCorrection();\n this.billId.set(result.replacementBillId);\n this.data.set(result.data);\n this.error.set(null);\n return result.data;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(\"Correction draft could not be created.\");\n this.error.set(error);\n throw error;\n } finally {\n this.mutating.set(false);\n }\n }\n\n private requireClient(): BillLifecycleClient {\n if (!this.client) throw new Error(\"Connect the lifecycle store before using it.\");\n return this.client;\n }\n\n private async mutate(task: () => Promise<BillLifecycleData>): Promise<BillLifecycleData> {\n this.mutating.set(true);\n this.error.set(null);\n try {\n const data = await task();\n this.data.set(data);\n return data;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(\"The billing request could not be completed.\");\n this.error.set(error);\n throw error;\n } finally {\n this.mutating.set(false);\n }\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n effect,\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport type {\n BillLifecycleData,\n BillLifecycleSessionProvider,\n BillReviewDocumentType,\n BillReviewBillingProvider,\n BillReviewClinician,\n BillReviewLocation,\n BillReviewPayer,\n BillReviewSaveInput,\n BillSubmissionRoute,\n} from \"@mindbill/browser\";\nimport { MindBillLifecycleStore } from \"./lifecycle-store\";\n\nexport type MindBillAngularThemePreset = \"mindbill\" | \"qme-companion\" | \"orange-bright\" | \"clinical-blue\";\nexport type MindBillAngularAppearance = {\n preset?: MindBillAngularThemePreset;\n accentColor?: string;\n accentTextColor?: string;\n backgroundColor?: string;\n surfaceColor?: string;\n textColor?: string;\n mutedColor?: string;\n borderColor?: string;\n borderRadius?: string;\n controlRadius?: string;\n fontFamily?: string;\n};\n\nconst THEMES: Record<MindBillAngularThemePreset, Required<MindBillAngularAppearance>> = {\n mindbill: { preset: \"mindbill\", accentColor: \"#238dbd\", accentTextColor: \"#fff\", backgroundColor: \"#f3f8fa\", surfaceColor: \"#fff\", textColor: \"#203743\", mutedColor: \"#657982\", borderColor: \"#dbe6ea\", borderRadius: \"14px\", controlRadius: \"8px\", fontFamily: \"Inter,system-ui,sans-serif\" },\n \"qme-companion\": { preset: \"qme-companion\", accentColor: \"#53b5dc\", accentTextColor: \"#173542\", backgroundColor: \"#f2f8fb\", surfaceColor: \"#fff\", textColor: \"#1d3440\", mutedColor: \"#617783\", borderColor: \"#d7e5eb\", borderRadius: \"12px\", controlRadius: \"8px\", fontFamily: \"Inter,system-ui,sans-serif\" },\n \"orange-bright\": { preset: \"orange-bright\", accentColor: \"#ff4f0a\", accentTextColor: \"#fff\", backgroundColor: \"#fffaf6\", surfaceColor: \"#fff\", textColor: \"#111827\", mutedColor: \"#626a73\", borderColor: \"#e5e1dc\", borderRadius: \"8px\", controlRadius: \"6px\", fontFamily: \"Inter,system-ui,sans-serif\" },\n \"clinical-blue\": { preset: \"clinical-blue\", accentColor: \"#1677ff\", accentTextColor: \"#fff\", backgroundColor: \"#f5f7fa\", surfaceColor: \"#fff\", textColor: \"#1f2d3d\", mutedColor: \"#66788a\", borderColor: \"#d9e2ec\", borderRadius: \"8px\", controlRadius: \"6px\", fontFamily: \"Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif\" },\n};\n\nconst DOCUMENT_TYPES: Array<{ value: BillReviewDocumentType; label: string }> = [\n { value: \"final_report\", label: \"Final report\" },\n { value: \"proof_of_service\", label: \"Proof of service\" },\n { value: \"letter_of_attestation\", label: \"Letter of attestation\" },\n { value: \"form_122\", label: \"Required form\" },\n { value: \"w9\", label: \"W-9\" },\n { value: \"appeal\", label: \"Appeal support\" },\n { value: \"medical_records\", label: \"Medical records (intentional)\" },\n { value: \"other\", label: \"Other supporting document\" },\n];\n\ntype BillDraft = {\n patient: BillLifecycleData[\"patient\"] & { firstName: string; lastName: string };\n injury: BillLifecycleData[\"injury\"];\n bill: BillLifecycleData[\"bill\"];\n billingProvider: BillReviewBillingProvider;\n clinician: BillReviewClinician;\n location: BillReviewLocation;\n};\n\n@Component({\n selector: \"mindbill-bill-lifecycle\",\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <section class=\"mb\" [ngStyle]=\"themeStyle\">\n @if (store.loading() && !store.data()) {\n <div class=\"state\">Loading billing…</div>\n } @else if (store.error() && !store.data()) {\n <div class=\"state error\"><strong>Billing is temporarily unavailable</strong><span>{{ store.error()?.message }}</span><button (click)=\"store.refresh()\">Try again</button></div>\n } @else if (store.data(); as data) {\n <header class=\"summary\">\n <div><span class=\"eyebrow\">Bill {{ data.bill.billNumber }}</span><h2>{{ stateLabel(data) }}</h2><p>{{ lifecycleDetail(data) }}</p></div>\n <div class=\"money\"><span>{{ data.bill.balanceDue | currency }}</span><small>balance</small></div>\n </header>\n\n @if (isEditable(data) && draft) {\n <form class=\"review\" (submit)=\"$event.preventDefault(); submit()\">\n <section class=\"card\">\n <div class=\"card-title\"><div><h3>Patient and claim</h3><p>Prefilled from the case. Correct anything that should print differently on this bill.</p></div><span>Required</span></div>\n <div class=\"grid four\">\n <label><span>First name</span><input required [(ngModel)]=\"draft.patient.firstName\" name=\"firstName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Last name</span><input required [(ngModel)]=\"draft.patient.lastName\" name=\"lastName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Date of birth</span><input type=\"date\" [(ngModel)]=\"draft.patient.dob\" name=\"dob\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Date of injury</span><input type=\"date\" [(ngModel)]=\"draft.injury.doi\" name=\"doi\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Claim number</span><input [(ngModel)]=\"draft.injury.claimNumber\" name=\"claimNumber\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Employer</span><input [(ngModel)]=\"draft.injury.employer\" name=\"employer\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>WCAB / case number</span><input [(ngModel)]=\"draft.injury.adjNumber\" name=\"adjNumber\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Date of service</span><input required type=\"date\" [(ngModel)]=\"draft.bill.dos\" name=\"dos\" (ngModelChange)=\"dirty=true\"></label>\n </div>\n </section>\n\n <section class=\"card payer\">\n <div class=\"card-title\"><div><h3>Claims administrator</h3><p>Select who should receive this bill. Search uses payer names and claim-number patterns.</p></div><span>Required</span></div>\n @if (draft.injury.claimsAdminId) { <div class=\"selected\"><div><strong>{{ draft.injury.claimsAdminName }}</strong><small>Selected recipient</small></div><button type=\"button\" (click)=\"clearPayer()\">Change</button></div> }\n @else {\n <label><span>Insurance company or claims administrator</span><input name=\"payerSearch\" [(ngModel)]=\"payerQuery\" (ngModelChange)=\"queuePayerSearch()\" placeholder=\"Search by payer or administrator name\" autocomplete=\"off\"></label>\n @if (payerResults.length) { <div class=\"results\">@for (payer of payerResults; track payer.id) { <button type=\"button\" (click)=\"selectPayer(payer)\"><strong>{{ payer.name }}</strong><span>{{ payerExplanation(payer) }}</span></button> }</div> }\n }\n </section>\n\n <section class=\"card\">\n <div class=\"card-title\"><div><h3>Billing identity</h3><p>The payee, rendering clinician, and place of service are bill snapshots—not synchronization records.</p></div><span>Prefilled</span></div>\n <div class=\"subhead\">Billing provider</div>\n <div class=\"grid three\">\n <label><span>Practice name</span><input required [(ngModel)]=\"draft.billingProvider.name\" name=\"practiceName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Tax ID</span><input required [(ngModel)]=\"draft.billingProvider.taxId\" name=\"taxId\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Billing NPI</span><input required [(ngModel)]=\"draft.billingProvider.npi\" name=\"billingNpi\" (ngModelChange)=\"dirty=true\"></label>\n </div>\n <div class=\"subhead\">Rendering clinician</div>\n <div class=\"grid three\">\n <label><span>Name</span><input required [(ngModel)]=\"draft.clinician.name\" name=\"clinicianName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>NPI</span><input required [(ngModel)]=\"draft.clinician.npi\" name=\"clinicianNpi\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Taxonomy</span><input [(ngModel)]=\"draft.clinician.taxonomy\" name=\"taxonomy\" (ngModelChange)=\"dirty=true\"></label>\n </div>\n <div class=\"subhead\">Service location</div>\n <div class=\"grid three\">\n <label><span>Location</span><input required [(ngModel)]=\"draft.location.name\" name=\"locationName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Street</span><input required [(ngModel)]=\"draft.location.street\" name=\"street\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>City</span><input required [(ngModel)]=\"draft.location.city\" name=\"city\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>State</span><input required list=\"mb-states\" maxlength=\"2\" [(ngModel)]=\"draft.location.state\" name=\"state\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>ZIP</span><input required [(ngModel)]=\"draft.location.zip\" name=\"zip\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Place of service</span><input required [(ngModel)]=\"draft.location.posCode\" name=\"pos\" (ngModelChange)=\"dirty=true\"></label>\n </div>\n </section>\n\n <section class=\"card\">\n <div class=\"card-title\"><div><h3>Charges</h3><p>Review procedure codes, modifiers, units, and allowed amounts.</p></div><button type=\"button\" (click)=\"addLine()\">+ Add line</button></div>\n <div class=\"lines\">@for (line of draft.bill.lineItems; track $index; let i=$index) { <div class=\"line\"><label><span>Procedure</span><input required [(ngModel)]=\"line.code\" [name]=\"'code'+i\" (ngModelChange)=\"dirty=true\"></label><label><span>Modifiers</span><input [ngModel]=\"line.modifiers.join(', ')\" (ngModelChange)=\"setModifiers(line,$any($event))\" [name]=\"'modifiers'+i\" placeholder=\"95, 93\"></label><label><span>Units</span><input required type=\"number\" min=\"1\" [(ngModel)]=\"line.units\" [name]=\"'units'+i\" (ngModelChange)=\"dirty=true\"></label><div class=\"allowed\"><span>Allowed</span><strong>{{ line.charge | currency }}</strong></div><button type=\"button\" class=\"remove\" (click)=\"removeLine(i)\" aria-label=\"Remove line\">×</button></div> }</div>\n </section>\n\n <section class=\"card\">\n <div class=\"card-title\"><div><h3>Payer packet</h3><p>Only these documents will be sent. Medical records are never attached unless selected intentionally.</p></div><span>{{ data.bill.attachments.length }} files</span></div>\n <ul class=\"docs\">@for (doc of data.bill.attachments; track doc.id) { <li><div><strong>{{ doc.filename }}</strong><small>{{ doc.description || doc.documentType }}</small></div><button type=\"button\" (click)=\"openAttachment(doc.id,doc.filename)\">View</button><button type=\"button\" (click)=\"removeAttachment(doc.id)\">Remove</button></li> }</ul>\n <div class=\"upload\"><select [(ngModel)]=\"documentType\" name=\"documentType\">@for (type of documentTypes; track type.value) { <option [value]=\"type.value\">{{ type.label }}</option> }</select><input #fileInput type=\"file\" accept=\"application/pdf\" (change)=\"fileSelected($event)\"><button type=\"button\" [disabled]=\"!pendingFile || store.mutating()\" (click)=\"attach()\">Attach document</button></div>\n </section>\n\n <section class=\"delivery\"><div><span class=\"eyebrow\">Delivery</span><h3>Submit this bill</h3><p>Submission and every later action remain available in this case.</p></div><div><div class=\"routes\">@for (item of routes; track item.value) { <label><input type=\"radio\" name=\"route\" [value]=\"item.value\" [(ngModel)]=\"route\"> {{ item.label }}</label> }</div><div class=\"actions\"><button type=\"button\" (click)=\"save()\" [disabled]=\"store.mutating()\">Save changes</button><button class=\"primary\" type=\"submit\" [disabled]=\"store.mutating() || !canSubmit()\">{{ store.mutating() ? 'Submitting…' : 'Submit bill' }}</button></div></div></section>\n </form>\n } @else {\n <section class=\"card lifecycle\">\n <div class=\"card-title\"><div><h3>Billing activity</h3><p>Available actions change automatically with bill status.</p></div><button (click)=\"store.refresh()\">Refresh</button></div>\n @if (data.eors.length) { <div class=\"eors\"><h4>Explanation of Review</h4>@for (eor of data.eors; track eor.id) { <button (click)=\"openEor(eor.id,eor.filename)\"><span><strong>{{ eor.filename }}</strong><small>{{ eor.description || 'Payer response' }}</small></span><b>View PDF</b></button> }</div> }\n <div class=\"actionbar\">@for (action of data.lifecycle.actions; track action.id) { @if (action.enabled) { <button [class.primary]=\"action.primary\" (click)=\"beginAction(action.id)\">{{ action.label }}</button> } }</div>\n @if (panel === 'payment') { <div class=\"panel\"><h4>Post payment</h4><div class=\"grid three\"><label><span>Amount</span><input type=\"number\" min=\"0.01\" [(ngModel)]=\"payment.amount\"></label><label><span>Method</span><select [(ngModel)]=\"payment.method\"><option value=\"check\">Check</option><option value=\"eft\">EFT</option></select></label><label><span>Deposit date</span><input type=\"date\" [(ngModel)]=\"payment.depositDate\"></label></div><div class=\"actions\"><button (click)=\"panel=''\">Cancel</button><button class=\"primary\" (click)=\"postPayment()\">Post payment</button></div></div> }\n @if (panel === 'review') { <div class=\"panel\"><h4>Submit Second Review</h4><label><span>Reason</span><textarea [(ngModel)]=\"review.reason\"></textarea></label><div class=\"grid two\"><label><span>Payer control number</span><input [(ngModel)]=\"review.payerClaimControlNumber\"></label><label><span>Disputed amount</span><input type=\"number\" [(ngModel)]=\"review.disputedAmount\"></label></div><div class=\"actions\"><button (click)=\"panel=''\">Cancel</button><button class=\"primary\" (click)=\"submitReview()\">Submit review</button></div></div> }\n @if (panel === 'close') { <div class=\"panel\"><h4>Close bill</h4><label><span>Reason</span><textarea [(ngModel)]=\"closeReason\"></textarea></label><div class=\"actions\"><button (click)=\"panel=''\">Cancel</button><button class=\"danger\" (click)=\"closeBill()\">Close bill</button></div></div> }\n </section>\n }\n @if (notice) { <div class=\"notice\">{{ notice }}</div> }\n @if (store.error()) { <div class=\"notice error\">{{ store.error()?.message }}</div> }\n <footer class=\"powered\">Powered by MindBill</footer>\n }\n <datalist id=\"mb-states\"><option value=\"CA\"></option><option value=\"AZ\"></option><option value=\"NV\"></option><option value=\"OR\"></option><option value=\"WA\"></option><option value=\"TX\"></option><option value=\"NY\"></option></datalist>\n </section>\n `,\n styles: [`\n :host{display:block}.mb{--a:#238dbd;--ac:#fff;--bg:#f3f8fa;--s:#fff;--t:#203743;--m:#657982;--b:#dbe6ea;--r:12px;--cr:8px;display:grid;gap:16px;color:var(--t);font:14px/1.45 var(--font,Inter,system-ui,sans-serif)}*{box-sizing:border-box}h2,h3,h4,p{margin:0}.summary,.card,.delivery,.state{border:1px solid var(--b);border-radius:var(--r);background:var(--s)}.summary{display:flex;justify-content:space-between;gap:20px;padding:20px}.summary h2{font-size:24px}.summary p,.card p,.delivery p,small{color:var(--m)}.eyebrow{color:var(--m);font-size:11px;font-weight:800;letter-spacing:.13em;text-transform:uppercase}.money{text-align:right}.money span{display:block;font-size:28px;font-weight:800}.money small{font-size:12px}.review{display:grid;gap:16px}.card{padding:20px}.card-title{display:flex;align-items:start;justify-content:space-between;gap:16px;margin-bottom:18px}.card-title h3,.delivery h3{font-size:18px}.card-title>span{border-radius:999px;background:var(--bg);padding:5px 9px;color:var(--m);font-size:11px;font-weight:800;text-transform:uppercase}.grid{display:grid;gap:14px}.grid.four{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.three{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.two{grid-template-columns:repeat(2,minmax(0,1fr))}label{display:grid;gap:6px;color:var(--t);font-size:12px;font-weight:700}input,select,textarea,button{font:inherit}input,select,textarea{width:100%;min-height:42px;border:1px solid var(--b);border-radius:var(--cr);background:#fff;color:var(--t);padding:9px 11px}textarea{min-height:90px;resize:vertical}button{min-height:38px;border:1px solid var(--b);border-radius:var(--cr);background:#fff;color:var(--t);padding:8px 13px;cursor:pointer;font-weight:700}button.primary{border-color:var(--a);background:var(--a);color:var(--ac)}button.danger{border-color:#d4380d;background:#d4380d;color:#fff}button:disabled{cursor:not-allowed;opacity:.5}.subhead{margin:18px 0 9px;border-top:1px solid var(--b);padding-top:15px;font-size:12px;font-weight:800}.selected{display:flex;align-items:center;justify-content:space-between;border:1px solid var(--b);border-radius:var(--cr);padding:12px}.selected div{display:grid}.results{position:relative;z-index:3;display:grid;margin-top:5px;border:1px solid var(--b);border-radius:var(--cr);background:#fff;box-shadow:0 12px 30px rgba(31,45,61,.12);overflow:hidden}.results button{display:grid;gap:2px;text-align:left;border:0;border-bottom:1px solid var(--b);border-radius:0;padding:12px}.results span{color:var(--m);font-weight:400}.lines{display:grid;gap:10px}.line{display:grid;grid-template-columns:1.2fr 1.2fr 110px 120px 40px;align-items:end;gap:10px;border-radius:var(--cr);background:var(--bg);padding:12px}.allowed{display:grid;gap:7px;text-align:right}.allowed span{color:var(--m);font-size:11px;font-weight:800;text-transform:uppercase}.allowed strong{font-size:17px}.remove{border:0;background:transparent;font-size:20px}.docs{list-style:none;margin:0;padding:0}.docs li{display:flex;align-items:center;gap:8px;border-top:1px solid var(--b);padding:11px 0}.docs li>div{display:grid;flex:1}.upload{display:grid;grid-template-columns:240px 1fr auto;gap:10px;margin-top:12px;border-radius:var(--cr);background:var(--bg);padding:12px}.delivery{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:20px;background:color-mix(in srgb,var(--a) 5%,white)}.routes,.actions,.actionbar{display:flex;justify-content:flex-end;gap:8px}.routes{margin-bottom:10px}.routes label{display:flex;align-items:center;border:1px solid var(--b);border-radius:var(--cr);background:#fff;padding:9px 12px}.routes input{width:auto;min-height:auto}.lifecycle{display:grid;gap:16px}.actionbar{flex-wrap:wrap}.eors{display:grid;gap:8px}.eors>button{display:flex;align-items:center;justify-content:space-between;text-align:left}.eors span{display:grid}.panel{display:grid;gap:14px;border-top:1px solid var(--b);padding-top:16px}.notice,.state{padding:13px 15px}.notice{border-radius:var(--cr);background:#edf8f2;color:#23734c}.notice.error,.state.error{background:#fff2f0;color:#b42318}.state{display:grid;gap:10px}.state button{justify-self:start}.powered{text-align:right;color:var(--m);font-size:11px}@media(max-width:900px){.grid.four,.grid.three{grid-template-columns:repeat(2,minmax(0,1fr))}.line{grid-template-columns:1fr 1fr 90px}.allowed{grid-column:1/-2;text-align:left}.upload{grid-template-columns:1fr}.delivery{align-items:stretch;flex-direction:column}.routes,.actions{justify-content:flex-start}}@media(max-width:600px){.summary,.card-title{align-items:stretch;flex-direction:column}.money{text-align:left}.grid.four,.grid.three,.grid.two,.line{grid-template-columns:1fr}.allowed{grid-column:auto}.routes{flex-wrap:wrap}.docs li{align-items:flex-start;flex-wrap:wrap}}\n `],\n})\nexport class MindBillBillLifecycleComponent implements OnChanges, OnDestroy {\n @Input({ required: true }) billId = \"\";\n @Input() sessionEndpoint = \"/api/mindbill/bill-session\";\n @Input() apiBaseUrl = \"https://app.mindbill.org\";\n @Input() getSession?: BillLifecycleSessionProvider;\n @Input() refreshInterval = 60_000;\n @Input() appearance: MindBillAngularAppearance = { preset: \"mindbill\" };\n @Output() billIdChange = new EventEmitter<string>();\n @Output() submitted = new EventEmitter<BillLifecycleData>();\n @Output() billingError = new EventEmitter<Error>();\n\n readonly store = new MindBillLifecycleStore();\n readonly documentTypes = DOCUMENT_TYPES;\n readonly routes: Array<{ value: BillSubmissionRoute; label: string }> = [{ value: \"ebill\", label: \"E-bill\" }, { value: \"fax\", label: \"Fax\" }, { value: \"mail\", label: \"Mail\" }, { value: \"email\", label: \"Email\" }];\n draft: BillDraft | null = null;\n dirty = false;\n payerQuery = \"\";\n payerResults: BillReviewPayer[] = [];\n documentType: BillReviewDocumentType = \"other\";\n pendingFile: File | null = null;\n route: BillSubmissionRoute = \"ebill\";\n panel = \"\";\n notice = \"\";\n closeReason = \"\";\n payment = { amount: 0, method: \"check\" as \"check\" | \"eft\", depositDate: new Date().toISOString().slice(0, 10) };\n review = { reason: \"\", payerClaimControlNumber: \"\", disputedAmount: 0 };\n private payerTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n effect(() => {\n const data = this.store.data();\n if (data && !this.dirty) this.draft = this.makeDraft(data);\n const error = this.store.error();\n if (error) this.billingError.emit(error);\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes[\"billId\"] || changes[\"sessionEndpoint\"] || changes[\"apiBaseUrl\"] || changes[\"getSession\"]) && this.billId) {\n this.store.connect({ billId: this.billId, sessionEndpoint: this.sessionEndpoint, apiBaseUrl: this.apiBaseUrl, ...(this.getSession ? { getSession: this.getSession } : {}) }, this.refreshInterval);\n }\n }\n ngOnDestroy(): void { this.store.disconnect(); if (this.payerTimer) clearTimeout(this.payerTimer); }\n\n get themeStyle(): Record<string, string> {\n const base = THEMES[this.appearance.preset ?? \"mindbill\"];\n return {\n \"--a\": this.appearance.accentColor ?? base.accentColor,\n \"--ac\": this.appearance.accentTextColor ?? base.accentTextColor,\n \"--bg\": this.appearance.backgroundColor ?? base.backgroundColor,\n \"--s\": this.appearance.surfaceColor ?? base.surfaceColor,\n \"--t\": this.appearance.textColor ?? base.textColor,\n \"--m\": this.appearance.mutedColor ?? base.mutedColor,\n \"--b\": this.appearance.borderColor ?? base.borderColor,\n \"--r\": this.appearance.borderRadius ?? base.borderRadius,\n \"--cr\": this.appearance.controlRadius ?? base.controlRadius,\n \"--font\": this.appearance.fontFamily ?? base.fontFamily,\n };\n }\n stateLabel(data: BillLifecycleData) { return data.lifecycle.state.replace(/_/g, \" \").replace(/\\b\\w/g, (value) => value.toUpperCase()); }\n lifecycleDetail(data: BillLifecycleData) { return data.lifecycle.submittedAt ? `Submitted ${new Date(data.lifecycle.submittedAt).toLocaleDateString()}${data.lifecycle.agingDays != null ? ` · ${data.lifecycle.agingDays} days old` : \"\"}` : \"Review the prefilled bill and payer packet before submission.\"; }\n isEditable(data: BillLifecycleData) { return data.lifecycle.actions.some((action) => action.id === \"edit_and_submit\" && action.enabled) || [\"incomplete\", \"draft\", \"not_submitted\"].includes(data.lifecycle.state.toLowerCase()); }\n payerExplanation(payer: BillReviewPayer) { return payer.signals?.map((signal) => signal.label).join(\" · \") || (payer.hasElectronic ? \"Electronic billing available\" : \"Available in payer directory\"); }\n queuePayerSearch(): void { if (this.payerTimer) clearTimeout(this.payerTimer); this.payerTimer = setTimeout(() => void this.searchPayers(), 250); }\n async searchPayers(): Promise<void> { if (!this.payerQuery.trim()) { this.payerResults = []; return; } this.payerResults = await this.store.searchClaimsAdministrators(this.payerQuery, this.draft?.injury.claimNumber); }\n selectPayer(payer: BillReviewPayer): void { if (!this.draft) return; this.draft.injury.claimsAdminId = payer.id; this.draft.injury.claimsAdminName = payer.name; this.payerQuery = \"\"; this.payerResults = []; this.dirty = true; }\n clearPayer(): void { if (!this.draft) return; this.draft.injury.claimsAdminId = \"\"; this.draft.injury.claimsAdminName = \"\"; this.dirty = true; }\n addLine(): void { this.draft?.bill.lineItems.push({ code: \"\", modifiers: [], units: 1, charge: 0 }); this.dirty = true; }\n removeLine(index: number): void { this.draft?.bill.lineItems.splice(index, 1); this.dirty = true; }\n setModifiers(line: { modifiers: string[] }, value: string): void { line.modifiers = value.split(\",\").map((item) => item.trim().replace(/^-/, \"\")).filter(Boolean); this.dirty = true; }\n fileSelected(event: Event): void { this.pendingFile = (event.target as HTMLInputElement).files?.[0] ?? null; }\n async attach(): Promise<void> { if (!this.pendingFile) return; await this.store.addAttachment(this.pendingFile, this.documentType); this.pendingFile = null; this.notice = \"Document attached.\"; }\n async removeAttachment(id: string): Promise<void> { await this.store.removeAttachment(id); this.notice = \"Document removed.\"; }\n async openAttachment(id: string, filename: string): Promise<void> { this.openBlob(await this.store.getAttachment(id), filename); }\n async openEor(id: string, filename: string): Promise<void> { this.openBlob(await this.store.getEor(id), filename); }\n canSubmit(): boolean { const input = this.buildInput(); return Boolean(input && input.claimsAdminId && input.dos && input.billingProvider?.name && input.billingProvider.taxId && input.billingProvider.npi && input.renderingProvider?.name && input.renderingProvider.npi && input.lineItems.some((line) => line.code && line.units > 0)); }\n async save(): Promise<void> { const input = this.buildInput(); if (!input) return; const data = await this.store.saveReview(input); this.dirty = false; this.draft = this.makeDraft(data); this.notice = \"Bill saved.\"; }\n async submit(): Promise<void> { const input = this.buildInput(); if (!input || !this.canSubmit()) return; const data = await this.store.submitBill(input, this.route); this.dirty = false; this.draft = this.makeDraft(data); this.notice = \"Bill submitted.\"; this.submitted.emit(data); }\n beginAction(action: string): void { if (action === \"post_payment\") this.panel = \"payment\"; else if (action === \"second_review\" || action === \"independent_bill_review\") this.panel = \"review\"; else if (action === \"close\") this.panel = \"close\"; else if (action === \"view_eor\" && this.store.data()?.eors[0]) { const eor = this.store.data()!.eors[0]!; void this.openEor(eor.id, eor.filename); } else if (action === \"correct_and_resubmit\") void this.correct(); }\n async correct(): Promise<void> { const data = await this.store.startCorrection(); this.billIdChange.emit(this.store.billId()); this.dirty = false; this.draft = this.makeDraft(data); this.notice = \"Correction draft created.\"; }\n async postPayment(): Promise<void> { await this.store.postPayment({ ...this.payment }); this.panel = \"\"; this.notice = \"Payment posted.\"; }\n async submitReview(): Promise<void> { const data = this.store.data(); if (!data) return; await this.store.submitSecondReview({ ...this.review, disputedAmount: this.review.disputedAmount || undefined, route: \"ebill\", attachmentIds: data.bill.attachments.map((doc) => doc.id) }); this.panel = \"\"; this.notice = \"Second Review submitted.\"; }\n async closeBill(): Promise<void> { if (!this.closeReason.trim()) return; await this.store.closeBill({ reason: this.closeReason }); this.panel = \"\"; this.notice = \"Bill closed.\"; }\n\n private buildInput(): BillReviewSaveInput | null {\n if (!this.draft) return null;\n return {\n claimsAdminId: this.draft.injury.claimsAdminId ?? \"\",\n patientOverrides: {\n firstName: this.draft.patient.firstName,\n lastName: this.draft.patient.lastName,\n ...(this.draft.patient.middleName ? { middleName: this.draft.patient.middleName } : {}),\n ...(this.draft.patient.dob ? { dob: this.draft.patient.dob } : {}),\n },\n injuryOverrides: {\n ...(this.draft.injury.claimNumber ? { claimNumber: this.draft.injury.claimNumber } : {}),\n ...(this.draft.injury.employer ? { employer: this.draft.injury.employer } : {}),\n ...(this.draft.injury.doi ? { doi: this.draft.injury.doi } : {}),\n ...(this.draft.injury.injuryEndDate ? { injuryEndDate: this.draft.injury.injuryEndDate } : {}),\n ...(typeof this.draft.injury.cumulativeTrauma === \"boolean\" ? { cumulativeTrauma: this.draft.injury.cumulativeTrauma } : {}),\n ...(this.draft.injury.adjNumber ? { adjNumber: this.draft.injury.adjNumber } : {}),\n },\n dos: this.draft.bill.dos,\n billingProvider: this.draft.billingProvider,\n renderingProvider: this.draft.clinician,\n placeOfService: this.draft.location,\n lineItems: this.draft.bill.lineItems.map((line) => ({\n ...(line.id ? { id: line.id } : {}),\n code: line.code,\n modifiers: line.modifiers,\n units: line.units,\n })),\n };\n }\n private makeDraft(data: BillLifecycleData): BillDraft {\n const snapshot = data.bill.billingSnapshot ?? {};\n const names = data.patient.name.trim().split(/\\s+/);\n return { patient: { ...data.patient, firstName: data.patient.firstName ?? names[0] ?? \"\", lastName: data.patient.lastName ?? names.slice(1).join(\" \") }, injury: { ...data.injury }, bill: { ...data.bill, lineItems: data.bill.lineItems.map((line) => ({ ...line, modifiers: [...line.modifiers] })) }, billingProvider: snapshot.billingProvider ?? { name: \"\", taxId: \"\", npi: \"\", billType: \"Professional\" as const }, clinician: snapshot.renderingProvider ?? { name: \"\", specialty: \"\", npi: \"\" }, location: snapshot.placeOfService ?? { name: \"\", street: \"\", city: \"\", state: \"\", zip: \"\", posCode: \"11\" } };\n }\n private openBlob(blob: Blob, filename: string): void { const url = URL.createObjectURL(blob); const link = document.createElement(\"a\"); link.href = url; link.target = \"_blank\"; link.rel = \"noopener\"; link.download = filename; link.click(); setTimeout(() => URL.revokeObjectURL(url), 60_000); }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mindbill-angular.mjs","sources":["../../src/lib/lifecycle-store.ts","../../src/lib/procedure-lines.ts","../../src/lib/bill-lifecycle.component.ts","../../src/mindbill-angular.ts"],"sourcesContent":["import { computed, signal } from \"@angular/core\";\nimport {\n createBillLifecycleClient,\n type BillLifecycleClient,\n type BillLifecycleClientOptions,\n type BillLifecycleData,\n type BillReviewDocumentType,\n type BillReviewSaveInput,\n type BillSubmissionRoute,\n type CloseBillInput,\n type PostBillPaymentInput,\n type SubmitSecondReviewInput,\n} from \"@mindbill/browser\";\n\nexport class MindBillLifecycleStore {\n readonly billId = signal(\"\");\n readonly data = signal<BillLifecycleData | null>(null);\n readonly error = signal<Error | null>(null);\n readonly loading = signal(false);\n readonly mutating = signal(false);\n readonly ready = computed(() => this.data() !== null && !this.loading());\n private client: BillLifecycleClient | null = null;\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n connect(options: BillLifecycleClientOptions, refreshInterval = 60_000): void {\n this.disconnect();\n this.billId.set(options.billId);\n this.client = createBillLifecycleClient(options);\n void this.refresh();\n if (refreshInterval > 0) {\n this.refreshTimer = setInterval(() => void this.refresh(), refreshInterval);\n }\n }\n\n disconnect(): void {\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n this.client?.clearSession();\n this.client = null;\n }\n\n async refresh(): Promise<BillLifecycleData | null> {\n if (!this.client) return null;\n this.loading.set(this.data() === null);\n try {\n const data = await this.client.getLifecycle();\n this.data.set(data);\n this.error.set(null);\n return data;\n } catch (cause) {\n this.error.set(cause instanceof Error ? cause : new Error(\"Bill could not be loaded.\"));\n return null;\n } finally {\n this.loading.set(false);\n }\n }\n\n searchClaimsAdministrators(query: string, claimNumber?: string) {\n return this.requireClient().searchClaimsAdministrators(query, claimNumber);\n }\n saveReview(input: BillReviewSaveInput) { return this.mutate(() => this.requireClient().saveReview(input)); }\n submitBill(input: BillReviewSaveInput, route: BillSubmissionRoute) { return this.mutate(() => this.requireClient().submitBill(input, route)); }\n addAttachment(file: File, type: BillReviewDocumentType, description?: string) { return this.mutate(() => this.requireClient().addAttachment(file, type, description)); }\n removeAttachment(id: string) { return this.mutate(() => this.requireClient().removeAttachment(id)); }\n getAttachment(id: string) { return this.requireClient().getAttachment(id); }\n getEor(id: string) { return this.requireClient().getEor(id); }\n closeBill(input: CloseBillInput) { return this.mutate(() => this.requireClient().closeBill(input)); }\n postPayment(input: PostBillPaymentInput) { return this.mutate(() => this.requireClient().postPayment(input)); }\n submitSecondReview(input: SubmitSecondReviewInput) { return this.mutate(() => this.requireClient().submitSecondReview(input)); }\n\n async startCorrection(): Promise<BillLifecycleData> {\n this.mutating.set(true);\n try {\n const result = await this.requireClient().startCorrection();\n this.billId.set(result.replacementBillId);\n this.data.set(result.data);\n this.error.set(null);\n return result.data;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(\"Correction draft could not be created.\");\n this.error.set(error);\n throw error;\n } finally {\n this.mutating.set(false);\n }\n }\n\n private requireClient(): BillLifecycleClient {\n if (!this.client) throw new Error(\"Connect the lifecycle store before using it.\");\n return this.client;\n }\n\n private async mutate(task: () => Promise<BillLifecycleData>): Promise<BillLifecycleData> {\n this.mutating.set(true);\n this.error.set(null);\n try {\n const data = await task();\n this.data.set(data);\n return data;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(\"The billing request could not be completed.\");\n this.error.set(error);\n throw error;\n } finally {\n this.mutating.set(false);\n }\n }\n}\n","export type ProcedureLine = {\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge: number;\n feeSchedule?: number;\n};\n\nconst EMPTY_PROCEDURE_LINE: ProcedureLine = {\n code: \"\",\n modifiers: [],\n units: 1,\n charge: 0,\n};\n\nfunction isEmptyProcedureLine(line: ProcedureLine): boolean {\n return !line.code.trim() && line.modifiers.length === 0 && line.units === 1;\n}\n\n/** Keeps completed/partial lines plus one keyboard-ready empty row. */\nexport function ensureTrailingProcedureLine(\n lines: readonly ProcedureLine[],\n): ProcedureLine[] {\n const entered = lines\n .filter((line) => !isEmptyProcedureLine(line))\n .map((line) => ({ ...line, modifiers: [...line.modifiers] }));\n\n return entered.length < 50\n ? [...entered, { ...EMPTY_PROCEDURE_LINE, modifiers: [] }]\n : entered;\n}\n","import { CommonModule } from \"@angular/common\";\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n effect,\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport type {\n BillLifecycleData,\n BillLifecycleSessionProvider,\n BillReviewDocumentType,\n BillReviewBillingProvider,\n BillReviewClinician,\n BillReviewLocation,\n BillReviewPayer,\n BillReviewSaveInput,\n BillSubmissionRoute,\n} from \"@mindbill/browser\";\nimport { MindBillLifecycleStore } from \"./lifecycle-store\";\nimport { ensureTrailingProcedureLine } from \"./procedure-lines\";\n\nexport type MindBillAngularThemePreset = \"mindbill\" | \"qme-companion\" | \"orange-bright\" | \"clinical-blue\";\nexport type MindBillAngularAppearance = {\n preset?: MindBillAngularThemePreset;\n accentColor?: string;\n accentTextColor?: string;\n backgroundColor?: string;\n surfaceColor?: string;\n textColor?: string;\n mutedColor?: string;\n borderColor?: string;\n borderRadius?: string;\n controlRadius?: string;\n fontFamily?: string;\n};\n\nconst THEMES: Record<MindBillAngularThemePreset, Required<MindBillAngularAppearance>> = {\n mindbill: { preset: \"mindbill\", accentColor: \"#238dbd\", accentTextColor: \"#fff\", backgroundColor: \"#f3f8fa\", surfaceColor: \"#fff\", textColor: \"#203743\", mutedColor: \"#657982\", borderColor: \"#dbe6ea\", borderRadius: \"14px\", controlRadius: \"8px\", fontFamily: \"Inter,system-ui,sans-serif\" },\n \"qme-companion\": { preset: \"qme-companion\", accentColor: \"#53b5dc\", accentTextColor: \"#173542\", backgroundColor: \"#f2f8fb\", surfaceColor: \"#fff\", textColor: \"#1d3440\", mutedColor: \"#617783\", borderColor: \"#d7e5eb\", borderRadius: \"12px\", controlRadius: \"8px\", fontFamily: \"Inter,system-ui,sans-serif\" },\n \"orange-bright\": { preset: \"orange-bright\", accentColor: \"#ff4f0a\", accentTextColor: \"#fff\", backgroundColor: \"#fffaf6\", surfaceColor: \"#fff\", textColor: \"#111827\", mutedColor: \"#626a73\", borderColor: \"#e5e1dc\", borderRadius: \"8px\", controlRadius: \"6px\", fontFamily: \"Inter,system-ui,sans-serif\" },\n \"clinical-blue\": { preset: \"clinical-blue\", accentColor: \"#1677ff\", accentTextColor: \"#fff\", backgroundColor: \"#f5f7fa\", surfaceColor: \"#fff\", textColor: \"#1f2d3d\", mutedColor: \"#66788a\", borderColor: \"#d9e2ec\", borderRadius: \"8px\", controlRadius: \"6px\", fontFamily: \"Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif\" },\n};\n\nconst DOCUMENT_TYPES: Array<{ value: BillReviewDocumentType; label: string }> = [\n { value: \"final_report\", label: \"Final report\" },\n { value: \"proof_of_service\", label: \"Proof of service\" },\n { value: \"letter_of_attestation\", label: \"Letter of attestation\" },\n { value: \"form_122\", label: \"Required form\" },\n { value: \"w9\", label: \"W-9\" },\n { value: \"appeal\", label: \"Appeal support\" },\n { value: \"medical_records\", label: \"Medical records (intentional)\" },\n { value: \"other\", label: \"Other supporting document\" },\n];\n\ntype BillDraft = {\n patient: BillLifecycleData[\"patient\"] & { firstName: string; lastName: string };\n injury: BillLifecycleData[\"injury\"];\n bill: BillLifecycleData[\"bill\"];\n billingProvider: BillReviewBillingProvider;\n clinician: BillReviewClinician;\n location: BillReviewLocation;\n};\n\n@Component({\n selector: \"mindbill-bill-lifecycle\",\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <section class=\"mb\" [ngStyle]=\"themeStyle\">\n @if (store.loading() && !store.data()) {\n <div class=\"state\">Loading billing…</div>\n } @else if (store.error() && !store.data()) {\n <div class=\"state error\"><strong>Billing is temporarily unavailable</strong><span>{{ store.error()?.message }}</span><button (click)=\"store.refresh()\">Try again</button></div>\n } @else if (store.data(); as data) {\n <header class=\"summary\">\n <div><span class=\"eyebrow\">Bill {{ data.bill.billNumber }}</span><h2>{{ stateLabel(data) }}</h2><p>{{ lifecycleDetail(data) }}</p></div>\n <div class=\"money\"><span>{{ data.bill.balanceDue | currency }}</span><small>balance</small></div>\n </header>\n\n @if (isEditable(data) && draft) {\n <form class=\"review\" (submit)=\"$event.preventDefault(); submit()\">\n <section class=\"card\">\n <div class=\"card-title\"><div><h3>Patient and claim</h3><p>Prefilled from the case. Correct anything that should print differently on this bill.</p></div><span>Required</span></div>\n <div class=\"grid four\">\n <label><span>First name</span><input required [(ngModel)]=\"draft.patient.firstName\" name=\"firstName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Last name</span><input required [(ngModel)]=\"draft.patient.lastName\" name=\"lastName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Date of birth</span><input type=\"date\" [(ngModel)]=\"draft.patient.dob\" name=\"dob\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Date of injury</span><input type=\"date\" [(ngModel)]=\"draft.injury.doi\" name=\"doi\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Claim number</span><input [(ngModel)]=\"draft.injury.claimNumber\" name=\"claimNumber\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Employer</span><input [(ngModel)]=\"draft.injury.employer\" name=\"employer\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>WCAB / case number</span><input [(ngModel)]=\"draft.injury.adjNumber\" name=\"adjNumber\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Date of service</span><input required type=\"date\" [(ngModel)]=\"draft.bill.dos\" name=\"dos\" (ngModelChange)=\"dirty=true\"></label>\n </div>\n </section>\n\n <section class=\"card payer\">\n <div class=\"card-title\"><div><h3>Claims administrator</h3><p>Select who should receive this bill. Search uses payer names and claim-number patterns.</p></div><span>Required</span></div>\n @if (draft.injury.claimsAdminId) { <div class=\"selected\"><div><strong>{{ draft.injury.claimsAdminName }}</strong><small>Selected recipient</small></div><button type=\"button\" (click)=\"clearPayer()\">Change</button></div> }\n @else {\n <label><span>Insurance company or claims administrator</span><input name=\"payerSearch\" [(ngModel)]=\"payerQuery\" (ngModelChange)=\"queuePayerSearch()\" placeholder=\"Search by payer or administrator name\" autocomplete=\"off\"></label>\n @if (payerResults.length) { <div class=\"results\">@for (payer of payerResults; track payer.id) { <button type=\"button\" (click)=\"selectPayer(payer)\"><strong>{{ payer.name }}</strong><span>{{ payerExplanation(payer) }}</span></button> }</div> }\n }\n </section>\n\n <section class=\"card\">\n <div class=\"card-title\"><div><h3>Billing identity</h3><p>The payee, rendering clinician, and place of service are bill snapshots—not synchronization records.</p></div><span>Prefilled</span></div>\n <div class=\"subhead\">Billing provider</div>\n <div class=\"grid three\">\n <label><span>Practice name</span><input required [(ngModel)]=\"draft.billingProvider.name\" name=\"practiceName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Tax ID</span><input required [(ngModel)]=\"draft.billingProvider.taxId\" name=\"taxId\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Billing NPI</span><input required [(ngModel)]=\"draft.billingProvider.npi\" name=\"billingNpi\" (ngModelChange)=\"dirty=true\"></label>\n </div>\n <div class=\"subhead\">Rendering clinician</div>\n <div class=\"grid three\">\n <label><span>Name</span><input required [(ngModel)]=\"draft.clinician.name\" name=\"clinicianName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>NPI</span><input required [(ngModel)]=\"draft.clinician.npi\" name=\"clinicianNpi\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Taxonomy</span><input [(ngModel)]=\"draft.clinician.taxonomy\" name=\"taxonomy\" (ngModelChange)=\"dirty=true\"></label>\n </div>\n <div class=\"subhead\">Service location</div>\n <div class=\"grid three\">\n <label><span>Location</span><input required [(ngModel)]=\"draft.location.name\" name=\"locationName\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Street</span><input required [(ngModel)]=\"draft.location.street\" name=\"street\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>City</span><input required [(ngModel)]=\"draft.location.city\" name=\"city\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>State</span><input required list=\"mb-states\" maxlength=\"2\" [(ngModel)]=\"draft.location.state\" name=\"state\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>ZIP</span><input required [(ngModel)]=\"draft.location.zip\" name=\"zip\" (ngModelChange)=\"dirty=true\"></label>\n <label><span>Place of service</span><input required [(ngModel)]=\"draft.location.posCode\" name=\"pos\" (ngModelChange)=\"dirty=true\"></label>\n </div>\n </section>\n\n <section class=\"card\">\n <div class=\"card-title\"><div><h3>Charges</h3><p>Review procedure codes, modifiers, units, and allowed amounts. A new row appears as you type.</p></div></div>\n <div class=\"lines\">@for (line of draft.bill.lineItems; track $index; let i=$index) { <div class=\"line\"><label><span>Procedure</span><input required [(ngModel)]=\"line.code\" [name]=\"'code'+i\" (ngModelChange)=\"lineChanged()\"></label><label><span>Modifiers</span><input [ngModel]=\"line.modifiers.join(', ')\" (ngModelChange)=\"setModifiers(line,$any($event))\" [name]=\"'modifiers'+i\" placeholder=\"95, 93\"></label><label><span>Units</span><input required type=\"number\" min=\"1\" [(ngModel)]=\"line.units\" [name]=\"'units'+i\" (ngModelChange)=\"lineChanged()\"></label><div class=\"allowed\"><span>Allowed</span><strong>{{ line.charge | currency }}</strong></div><button type=\"button\" class=\"remove\" (click)=\"removeLine(i)\" aria-label=\"Remove line\">×</button></div> }</div>\n </section>\n\n <section class=\"card\">\n <div class=\"card-title\"><div><h3>Payer packet</h3><p>Only these documents will be sent. Medical records are never attached unless selected intentionally.</p></div><span>{{ data.bill.attachments.length }} files</span></div>\n <ul class=\"docs\">@for (doc of data.bill.attachments; track doc.id) { <li><div><strong>{{ doc.filename }}</strong><small>{{ doc.description || doc.documentType }}</small></div><button type=\"button\" (click)=\"openAttachment(doc.id,doc.filename)\">View</button><button type=\"button\" (click)=\"removeAttachment(doc.id)\">Remove</button></li> }</ul>\n <div class=\"upload\"><select [(ngModel)]=\"documentType\" name=\"documentType\">@for (type of documentTypes; track type.value) { <option [value]=\"type.value\">{{ type.label }}</option> }</select><input #fileInput type=\"file\" accept=\"application/pdf\" (change)=\"fileSelected($event)\"><button type=\"button\" [disabled]=\"!pendingFile || store.mutating()\" (click)=\"attach()\">Attach document</button></div>\n </section>\n\n <section class=\"delivery\"><div><span class=\"eyebrow\">Delivery</span><h3>Submit this bill</h3><p>Submission and every later action remain available in this case.</p></div><div><div class=\"routes\">@for (item of routes; track item.value) { <label><input type=\"radio\" name=\"route\" [value]=\"item.value\" [(ngModel)]=\"route\"> {{ item.label }}</label> }</div><div class=\"actions\"><button type=\"button\" (click)=\"save()\" [disabled]=\"store.mutating()\">Save changes</button><button class=\"primary\" type=\"submit\" [disabled]=\"store.mutating() || !canSubmit()\">{{ store.mutating() ? 'Submitting…' : 'Submit bill' }}</button></div></div></section>\n </form>\n } @else {\n <section class=\"card lifecycle\">\n <div class=\"card-title\"><div><h3>Billing activity</h3><p>Available actions change automatically with bill status.</p></div><button (click)=\"store.refresh()\">Refresh</button></div>\n @if (data.eors.length) { <div class=\"eors\"><h4>Explanation of Review</h4>@for (eor of data.eors; track eor.id) { <button (click)=\"openEor(eor.id,eor.filename)\"><span><strong>{{ eor.filename }}</strong><small>{{ eor.description || 'Payer response' }}</small></span><b>View PDF</b></button> }</div> }\n <div class=\"actionbar\">@for (action of data.lifecycle.actions; track action.id) { @if (action.enabled) { <button [class.primary]=\"action.primary\" (click)=\"beginAction(action.id)\">{{ action.label }}</button> } }</div>\n @if (panel === 'payment') { <div class=\"panel\"><h4>Post payment</h4><div class=\"grid three\"><label><span>Amount</span><input type=\"number\" min=\"0.01\" [(ngModel)]=\"payment.amount\"></label><label><span>Method</span><select [(ngModel)]=\"payment.method\"><option value=\"check\">Check</option><option value=\"eft\">EFT</option></select></label><label><span>Deposit date</span><input type=\"date\" [(ngModel)]=\"payment.depositDate\"></label></div><div class=\"actions\"><button (click)=\"panel=''\">Cancel</button><button class=\"primary\" (click)=\"postPayment()\">Post payment</button></div></div> }\n @if (panel === 'review') { <div class=\"panel\"><h4>Submit Second Review</h4><label><span>Reason</span><textarea [(ngModel)]=\"review.reason\"></textarea></label><div class=\"grid two\"><label><span>Payer control number</span><input [(ngModel)]=\"review.payerClaimControlNumber\"></label><label><span>Disputed amount</span><input type=\"number\" [(ngModel)]=\"review.disputedAmount\"></label></div><div class=\"actions\"><button (click)=\"panel=''\">Cancel</button><button class=\"primary\" (click)=\"submitReview()\">Submit review</button></div></div> }\n @if (panel === 'close') { <div class=\"panel\"><h4>Close bill</h4><label><span>Reason</span><textarea [(ngModel)]=\"closeReason\"></textarea></label><div class=\"actions\"><button (click)=\"panel=''\">Cancel</button><button class=\"danger\" (click)=\"closeBill()\">Close bill</button></div></div> }\n </section>\n }\n @if (notice) { <div class=\"notice\">{{ notice }}</div> }\n @if (store.error()) { <div class=\"notice error\">{{ store.error()?.message }}</div> }\n <footer class=\"powered\">Powered by MindBill</footer>\n }\n <datalist id=\"mb-states\"><option value=\"CA\"></option><option value=\"AZ\"></option><option value=\"NV\"></option><option value=\"OR\"></option><option value=\"WA\"></option><option value=\"TX\"></option><option value=\"NY\"></option></datalist>\n </section>\n `,\n styles: [`\n :host{display:block}.mb{--a:#238dbd;--ac:#fff;--bg:#f3f8fa;--s:#fff;--t:#203743;--m:#657982;--b:#dbe6ea;--r:12px;--cr:8px;display:grid;gap:16px;color:var(--t);font:14px/1.45 var(--font,Inter,system-ui,sans-serif)}*{box-sizing:border-box}h2,h3,h4,p{margin:0}.summary,.card,.delivery,.state{border:1px solid var(--b);border-radius:var(--r);background:var(--s)}.summary{display:flex;justify-content:space-between;gap:20px;padding:20px}.summary h2{font-size:24px}.summary p,.card p,.delivery p,small{color:var(--m)}.eyebrow{color:var(--m);font-size:11px;font-weight:800;letter-spacing:.13em;text-transform:uppercase}.money{text-align:right}.money span{display:block;font-size:28px;font-weight:800}.money small{font-size:12px}.review{display:grid;gap:16px}.card{padding:20px}.card-title{display:flex;align-items:start;justify-content:space-between;gap:16px;margin-bottom:18px}.card-title h3,.delivery h3{font-size:18px}.card-title>span{border-radius:999px;background:var(--bg);padding:5px 9px;color:var(--m);font-size:11px;font-weight:800;text-transform:uppercase}.grid{display:grid;gap:14px}.grid.four{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.three{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.two{grid-template-columns:repeat(2,minmax(0,1fr))}label{display:grid;gap:6px;color:var(--t);font-size:12px;font-weight:700}input,select,textarea,button{font:inherit}input,select,textarea{width:100%;min-height:42px;border:1px solid var(--b);border-radius:var(--cr);background:#fff;color:var(--t);padding:9px 11px}textarea{min-height:90px;resize:vertical}button{min-height:38px;border:1px solid var(--b);border-radius:var(--cr);background:#fff;color:var(--t);padding:8px 13px;cursor:pointer;font-weight:700}button.primary{border-color:var(--a);background:var(--a);color:var(--ac)}button.danger{border-color:#d4380d;background:#d4380d;color:#fff}button:disabled{cursor:not-allowed;opacity:.5}.subhead{margin:18px 0 9px;border-top:1px solid var(--b);padding-top:15px;font-size:12px;font-weight:800}.selected{display:flex;align-items:center;justify-content:space-between;border:1px solid var(--b);border-radius:var(--cr);padding:12px}.selected div{display:grid}.results{position:relative;z-index:3;display:grid;margin-top:5px;border:1px solid var(--b);border-radius:var(--cr);background:#fff;box-shadow:0 12px 30px rgba(31,45,61,.12);overflow:hidden}.results button{display:grid;gap:2px;text-align:left;border:0;border-bottom:1px solid var(--b);border-radius:0;padding:12px}.results span{color:var(--m);font-weight:400}.lines{display:grid;gap:10px}.line{display:grid;grid-template-columns:1.2fr 1.2fr 110px 120px 40px;align-items:end;gap:10px;border-radius:var(--cr);background:var(--bg);padding:12px}.allowed{display:grid;gap:7px;text-align:right}.allowed span{color:var(--m);font-size:11px;font-weight:800;text-transform:uppercase}.allowed strong{font-size:17px}.remove{border:0;background:transparent;font-size:20px}.docs{list-style:none;margin:0;padding:0}.docs li{display:flex;align-items:center;gap:8px;border-top:1px solid var(--b);padding:11px 0}.docs li>div{display:grid;flex:1}.upload{display:grid;grid-template-columns:240px 1fr auto;gap:10px;margin-top:12px;border-radius:var(--cr);background:var(--bg);padding:12px}.delivery{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:20px;background:color-mix(in srgb,var(--a) 5%,white)}.routes,.actions,.actionbar{display:flex;justify-content:flex-end;gap:8px}.routes{margin-bottom:10px}.routes label{display:flex;align-items:center;border:1px solid var(--b);border-radius:var(--cr);background:#fff;padding:9px 12px}.routes input{width:auto;min-height:auto}.lifecycle{display:grid;gap:16px}.actionbar{flex-wrap:wrap}.eors{display:grid;gap:8px}.eors>button{display:flex;align-items:center;justify-content:space-between;text-align:left}.eors span{display:grid}.panel{display:grid;gap:14px;border-top:1px solid var(--b);padding-top:16px}.notice,.state{padding:13px 15px}.notice{border-radius:var(--cr);background:#edf8f2;color:#23734c}.notice.error,.state.error{background:#fff2f0;color:#b42318}.state{display:grid;gap:10px}.state button{justify-self:start}.powered{text-align:right;color:var(--m);font-size:11px}@media(max-width:900px){.grid.four,.grid.three{grid-template-columns:repeat(2,minmax(0,1fr))}.line{grid-template-columns:1fr 1fr 90px}.allowed{grid-column:1/-2;text-align:left}.upload{grid-template-columns:1fr}.delivery{align-items:stretch;flex-direction:column}.routes,.actions{justify-content:flex-start}}@media(max-width:600px){.summary,.card-title{align-items:stretch;flex-direction:column}.money{text-align:left}.grid.four,.grid.three,.grid.two,.line{grid-template-columns:1fr}.allowed{grid-column:auto}.routes{flex-wrap:wrap}.docs li{align-items:flex-start;flex-wrap:wrap}}\n `],\n})\nexport class MindBillBillLifecycleComponent implements OnChanges, OnDestroy {\n @Input({ required: true }) billId = \"\";\n @Input() sessionEndpoint = \"/api/mindbill/bill-session\";\n @Input() apiBaseUrl = \"https://app.mindbill.org\";\n @Input() getSession?: BillLifecycleSessionProvider;\n @Input() refreshInterval = 60_000;\n @Input() appearance: MindBillAngularAppearance = { preset: \"mindbill\" };\n @Output() billIdChange = new EventEmitter<string>();\n @Output() submitted = new EventEmitter<BillLifecycleData>();\n @Output() billingError = new EventEmitter<Error>();\n\n readonly store = new MindBillLifecycleStore();\n readonly documentTypes = DOCUMENT_TYPES;\n readonly routes: Array<{ value: BillSubmissionRoute; label: string }> = [{ value: \"ebill\", label: \"E-bill\" }, { value: \"fax\", label: \"Fax\" }, { value: \"mail\", label: \"Mail\" }, { value: \"email\", label: \"Email\" }];\n draft: BillDraft | null = null;\n dirty = false;\n payerQuery = \"\";\n payerResults: BillReviewPayer[] = [];\n documentType: BillReviewDocumentType = \"other\";\n pendingFile: File | null = null;\n route: BillSubmissionRoute = \"ebill\";\n panel = \"\";\n notice = \"\";\n closeReason = \"\";\n payment = { amount: 0, method: \"check\" as \"check\" | \"eft\", depositDate: new Date().toISOString().slice(0, 10) };\n review = { reason: \"\", payerClaimControlNumber: \"\", disputedAmount: 0 };\n private payerTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n effect(() => {\n const data = this.store.data();\n if (data && !this.dirty) this.draft = this.makeDraft(data);\n const error = this.store.error();\n if (error) this.billingError.emit(error);\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes[\"billId\"] || changes[\"sessionEndpoint\"] || changes[\"apiBaseUrl\"] || changes[\"getSession\"]) && this.billId) {\n this.store.connect({ billId: this.billId, sessionEndpoint: this.sessionEndpoint, apiBaseUrl: this.apiBaseUrl, ...(this.getSession ? { getSession: this.getSession } : {}) }, this.refreshInterval);\n }\n }\n ngOnDestroy(): void { this.store.disconnect(); if (this.payerTimer) clearTimeout(this.payerTimer); }\n\n get themeStyle(): Record<string, string> {\n const base = THEMES[this.appearance.preset ?? \"mindbill\"];\n return {\n \"--a\": this.appearance.accentColor ?? base.accentColor,\n \"--ac\": this.appearance.accentTextColor ?? base.accentTextColor,\n \"--bg\": this.appearance.backgroundColor ?? base.backgroundColor,\n \"--s\": this.appearance.surfaceColor ?? base.surfaceColor,\n \"--t\": this.appearance.textColor ?? base.textColor,\n \"--m\": this.appearance.mutedColor ?? base.mutedColor,\n \"--b\": this.appearance.borderColor ?? base.borderColor,\n \"--r\": this.appearance.borderRadius ?? base.borderRadius,\n \"--cr\": this.appearance.controlRadius ?? base.controlRadius,\n \"--font\": this.appearance.fontFamily ?? base.fontFamily,\n };\n }\n stateLabel(data: BillLifecycleData) { return data.lifecycle.state.replace(/_/g, \" \").replace(/\\b\\w/g, (value) => value.toUpperCase()); }\n lifecycleDetail(data: BillLifecycleData) { return data.lifecycle.submittedAt ? `Submitted ${new Date(data.lifecycle.submittedAt).toLocaleDateString()}${data.lifecycle.agingDays != null ? ` · ${data.lifecycle.agingDays} days old` : \"\"}` : \"Review the prefilled bill and payer packet before submission.\"; }\n isEditable(data: BillLifecycleData) { return data.lifecycle.actions.some((action) => action.id === \"edit_and_submit\" && action.enabled) || [\"incomplete\", \"draft\", \"not_submitted\"].includes(data.lifecycle.state.toLowerCase()); }\n payerExplanation(payer: BillReviewPayer) { return payer.signals?.map((signal) => signal.label).join(\" · \") || (payer.hasElectronic ? \"Electronic billing available\" : \"Available in payer directory\"); }\n queuePayerSearch(): void { if (this.payerTimer) clearTimeout(this.payerTimer); this.payerTimer = setTimeout(() => void this.searchPayers(), 250); }\n async searchPayers(): Promise<void> { if (!this.payerQuery.trim()) { this.payerResults = []; return; } this.payerResults = await this.store.searchClaimsAdministrators(this.payerQuery, this.draft?.injury.claimNumber); }\n selectPayer(payer: BillReviewPayer): void { if (!this.draft) return; this.draft.injury.claimsAdminId = payer.id; this.draft.injury.claimsAdminName = payer.name; this.payerQuery = \"\"; this.payerResults = []; this.dirty = true; }\n clearPayer(): void { if (!this.draft) return; this.draft.injury.claimsAdminId = \"\"; this.draft.injury.claimsAdminName = \"\"; this.dirty = true; }\n lineChanged(): void { this.normalizeLineItems(); this.dirty = true; }\n removeLine(index: number): void { this.draft?.bill.lineItems.splice(index, 1); this.normalizeLineItems(); this.dirty = true; }\n setModifiers(line: { modifiers: string[] }, value: string): void { line.modifiers = value.split(\",\").map((item) => item.trim().replace(/^-/, \"\")).filter(Boolean); this.normalizeLineItems(); this.dirty = true; }\n fileSelected(event: Event): void { this.pendingFile = (event.target as HTMLInputElement).files?.[0] ?? null; }\n async attach(): Promise<void> { if (!this.pendingFile) return; await this.store.addAttachment(this.pendingFile, this.documentType); this.pendingFile = null; this.notice = \"Document attached.\"; }\n async removeAttachment(id: string): Promise<void> { await this.store.removeAttachment(id); this.notice = \"Document removed.\"; }\n async openAttachment(id: string, filename: string): Promise<void> { this.openBlob(await this.store.getAttachment(id), filename); }\n async openEor(id: string, filename: string): Promise<void> { this.openBlob(await this.store.getEor(id), filename); }\n canSubmit(): boolean { const input = this.buildInput(); return Boolean(input && input.claimsAdminId && input.dos && input.billingProvider?.name && input.billingProvider.taxId && input.billingProvider.npi && input.renderingProvider?.name && input.renderingProvider.npi && input.lineItems.some((line) => line.code && line.units > 0)); }\n async save(): Promise<void> { const input = this.buildInput(); if (!input) return; const data = await this.store.saveReview(input); this.dirty = false; this.draft = this.makeDraft(data); this.notice = \"Bill saved.\"; }\n async submit(): Promise<void> { const input = this.buildInput(); if (!input || !this.canSubmit()) return; const data = await this.store.submitBill(input, this.route); this.dirty = false; this.draft = this.makeDraft(data); this.notice = \"Bill submitted.\"; this.submitted.emit(data); }\n beginAction(action: string): void { if (action === \"post_payment\") this.panel = \"payment\"; else if (action === \"second_review\" || action === \"independent_bill_review\") this.panel = \"review\"; else if (action === \"close\") this.panel = \"close\"; else if (action === \"view_eor\" && this.store.data()?.eors[0]) { const eor = this.store.data()!.eors[0]!; void this.openEor(eor.id, eor.filename); } else if (action === \"correct_and_resubmit\") void this.correct(); }\n async correct(): Promise<void> { const data = await this.store.startCorrection(); this.billIdChange.emit(this.store.billId()); this.dirty = false; this.draft = this.makeDraft(data); this.notice = \"Correction draft created.\"; }\n async postPayment(): Promise<void> { await this.store.postPayment({ ...this.payment }); this.panel = \"\"; this.notice = \"Payment posted.\"; }\n async submitReview(): Promise<void> { const data = this.store.data(); if (!data) return; await this.store.submitSecondReview({ ...this.review, disputedAmount: this.review.disputedAmount || undefined, route: \"ebill\", attachmentIds: data.bill.attachments.map((doc) => doc.id) }); this.panel = \"\"; this.notice = \"Second Review submitted.\"; }\n async closeBill(): Promise<void> { if (!this.closeReason.trim()) return; await this.store.closeBill({ reason: this.closeReason }); this.panel = \"\"; this.notice = \"Bill closed.\"; }\n\n private buildInput(): BillReviewSaveInput | null {\n if (!this.draft) return null;\n return {\n claimsAdminId: this.draft.injury.claimsAdminId ?? \"\",\n patientOverrides: {\n firstName: this.draft.patient.firstName,\n lastName: this.draft.patient.lastName,\n ...(this.draft.patient.middleName ? { middleName: this.draft.patient.middleName } : {}),\n ...(this.draft.patient.dob ? { dob: this.draft.patient.dob } : {}),\n },\n injuryOverrides: {\n ...(this.draft.injury.claimNumber ? { claimNumber: this.draft.injury.claimNumber } : {}),\n ...(this.draft.injury.employer ? { employer: this.draft.injury.employer } : {}),\n ...(this.draft.injury.doi ? { doi: this.draft.injury.doi } : {}),\n ...(this.draft.injury.injuryEndDate ? { injuryEndDate: this.draft.injury.injuryEndDate } : {}),\n ...(typeof this.draft.injury.cumulativeTrauma === \"boolean\" ? { cumulativeTrauma: this.draft.injury.cumulativeTrauma } : {}),\n ...(this.draft.injury.adjNumber ? { adjNumber: this.draft.injury.adjNumber } : {}),\n },\n dos: this.draft.bill.dos,\n billingProvider: this.draft.billingProvider,\n renderingProvider: this.draft.clinician,\n placeOfService: this.draft.location,\n lineItems: this.draft.bill.lineItems.filter((line) => line.code.trim()).map((line) => ({\n ...(line.id ? { id: line.id } : {}),\n code: line.code,\n modifiers: line.modifiers,\n units: line.units,\n })),\n };\n }\n private makeDraft(data: BillLifecycleData): BillDraft {\n const snapshot = data.bill.billingSnapshot ?? {};\n const names = data.patient.name.trim().split(/\\s+/);\n return { patient: { ...data.patient, firstName: data.patient.firstName ?? names[0] ?? \"\", lastName: data.patient.lastName ?? names.slice(1).join(\" \") }, injury: { ...data.injury }, bill: { ...data.bill, lineItems: ensureTrailingProcedureLine(data.bill.lineItems) }, billingProvider: snapshot.billingProvider ?? { name: \"\", taxId: \"\", npi: \"\", billType: \"Professional\" as const }, clinician: snapshot.renderingProvider ?? { name: \"\", specialty: \"\", npi: \"\" }, location: snapshot.placeOfService ?? { name: \"\", street: \"\", city: \"\", state: \"\", zip: \"\", posCode: \"11\" } };\n }\n private normalizeLineItems(): void { if (this.draft) this.draft.bill.lineItems = ensureTrailingProcedureLine(this.draft.bill.lineItems); }\n private openBlob(blob: Blob, filename: string): void { const url = URL.createObjectURL(blob); const link = document.createElement(\"a\"); link.href = url; link.target = \"_blank\"; link.rel = \"noopener\"; link.download = filename; link.click(); setTimeout(() => URL.revokeObjectURL(url), 60_000); }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindbill/angular",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Native Angular components for the complete MindBill bill lifecycle",
5
5
  "type": "module",
6
6
  "peerDependencies": {
@@ -108,7 +108,7 @@ declare class MindBillBillLifecycleComponent implements OnChanges, OnDestroy {
108
108
  searchPayers(): Promise<void>;
109
109
  selectPayer(payer: BillReviewPayer): void;
110
110
  clearPayer(): void;
111
- addLine(): void;
111
+ lineChanged(): void;
112
112
  removeLine(index: number): void;
113
113
  setModifiers(line: {
114
114
  modifiers: string[];
@@ -128,10 +128,22 @@ declare class MindBillBillLifecycleComponent implements OnChanges, OnDestroy {
128
128
  closeBill(): Promise<void>;
129
129
  private buildInput;
130
130
  private makeDraft;
131
+ private normalizeLineItems;
131
132
  private openBlob;
132
133
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MindBillBillLifecycleComponent, never>;
133
134
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MindBillBillLifecycleComponent, "mindbill-bill-lifecycle", never, { "billId": { "alias": "billId"; "required": true; }; "sessionEndpoint": { "alias": "sessionEndpoint"; "required": false; }; "apiBaseUrl": { "alias": "apiBaseUrl"; "required": false; }; "getSession": { "alias": "getSession"; "required": false; }; "refreshInterval": { "alias": "refreshInterval"; "required": false; }; "appearance": { "alias": "appearance"; "required": false; }; }, { "billIdChange": "billIdChange"; "submitted": "submitted"; "billingError": "billingError"; }, never, never, true, never>;
134
135
  }
135
136
 
136
- export { MindBillBillLifecycleComponent, MindBillLifecycleStore };
137
- export type { MindBillAngularAppearance, MindBillAngularThemePreset };
137
+ type ProcedureLine = {
138
+ id?: string;
139
+ code: string;
140
+ modifiers: string[];
141
+ units: number;
142
+ charge: number;
143
+ feeSchedule?: number;
144
+ };
145
+ /** Keeps completed/partial lines plus one keyboard-ready empty row. */
146
+ declare function ensureTrailingProcedureLine(lines: readonly ProcedureLine[]): ProcedureLine[];
147
+
148
+ export { MindBillBillLifecycleComponent, MindBillLifecycleStore, ensureTrailingProcedureLine };
149
+ export type { MindBillAngularAppearance, MindBillAngularThemePreset, ProcedureLine };