@mindbill/angular 0.15.0 → 0.16.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.
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { signal, computed, Input, Component, EventEmitter, Output, inject, ChangeDetectorRef, HostListener, effect, Directive } from '@angular/core';
3
- import { createBillLifecycleClient, createBillReferenceClient, createBillSubmissionClient, REPORT_BILL_STATUS_OPTIONS, reportBillStatusContacts, BILL_TASKS_AGING_BUCKETS, createOrganizationClient } from '@mindbill/browser';
4
- export { REPORT_BILL_STATUS_OPTIONS, reportBillStatusContacts } from '@mindbill/browser';
3
+ import { createBillLifecycleClient, createBillReferenceClient, defaultBillReviewPayerOption, createBillSubmissionClient, REPORT_BILL_STATUS_OPTIONS, reportBillStatusContacts, BILL_TASKS_AGING_BUCKETS, createOrganizationClient } from '@mindbill/browser';
4
+ export { REPORT_BILL_STATUS_OPTIONS, defaultBillReviewPayerOption, reportBillStatusContacts } from '@mindbill/browser';
5
5
  import * as i1 from '@angular/common';
6
6
  import { CommonModule } from '@angular/common';
7
7
  import * as i2 from '@angular/forms';
@@ -583,6 +583,9 @@ class MindBillBillSubmissionComponent {
583
583
  payerQuery = "";
584
584
  payerResults = [];
585
585
  payerBusy = false;
586
+ /** Payer (subpayor) choices for the selected claims administrator. */
587
+ subpayorOptions = [];
588
+ payerSelectionRequired = false;
586
589
  diagnosisQuery = "";
587
590
  diagnosisResults = [];
588
591
  diagnosisOffset = 0;
@@ -611,6 +614,8 @@ class MindBillBillSubmissionComponent {
611
614
  this.bill.serviceLines = [{ code: "", units: 1 }];
612
615
  this.ensureTrailingLine();
613
616
  this.payerQuery = this.bill.claim.claimsAdministrator.name ?? "";
617
+ this.subpayorOptions = [];
618
+ this.payerSelectionRequired = false;
614
619
  }
615
620
  if (changes["attachments"])
616
621
  this.workingAttachments = this.attachments.map((item) => ({ ...item }));
@@ -696,10 +701,36 @@ class MindBillBillSubmissionComponent {
696
701
  }, 180);
697
702
  }
698
703
  selectPayer(payer) {
699
- this.bill.claim.claimsAdministrator = { id: payer.id, name: payer.name };
704
+ this.payerSelectionRequired = payer.payerSelectionRequired === true;
705
+ this.subpayorOptions = this.payerSelectionRequired
706
+ ? (payer.payers ?? []).map((option) => ({ ...option }))
707
+ : [];
708
+ const preselected = defaultBillReviewPayerOption(payer);
709
+ this.bill.claim.claimsAdministrator = {
710
+ id: payer.id,
711
+ name: payer.name,
712
+ ...(preselected ? { payerId: preselected.id } : {}),
713
+ };
700
714
  this.payerQuery = payer.name;
701
715
  this.payerResults = [];
702
716
  this.invalidFields.delete("claim.claimsAdministrator");
717
+ this.invalidFields.delete("claim.claimsAdministrator.payerId");
718
+ this.billChange.emit(this.bill);
719
+ }
720
+ get subpayorComboOptions() {
721
+ return this.subpayorOptions.map((option) => ({
722
+ id: option.id,
723
+ label: option.label,
724
+ ...(option.default ? { detail: "Default" } : {}),
725
+ }));
726
+ }
727
+ get subpayorLabel() {
728
+ const payerId = this.bill.claim?.claimsAdministrator?.payerId;
729
+ return this.subpayorOptions.find((option) => option.id === payerId)?.label ?? "";
730
+ }
731
+ selectSubpayor(option) {
732
+ this.bill.claim.claimsAdministrator = { ...this.bill.claim.claimsAdministrator, payerId: option.id };
733
+ this.invalidFields.delete("claim.claimsAdministrator.payerId");
703
734
  this.billChange.emit(this.bill);
704
735
  }
705
736
  searchDiagnoses(reset) {
@@ -861,7 +892,9 @@ class MindBillBillSubmissionComponent {
861
892
  ["patient.firstName", this.bill.patient.firstName], ["patient.lastName", this.bill.patient.lastName], ["patient.dateOfBirth", parseMindBillSubmissionDate(this.bill.patient.dateOfBirth ?? "")],
862
893
  ["patient.address.line1", this.bill.patient.address.line1], ["patient.address.city", this.bill.patient.address.city], ["patient.address.state", this.bill.patient.address.state], ["patient.address.postalCode", this.bill.patient.address.postalCode],
863
894
  ["service.date", parseMindBillSubmissionDate(this.bill.service.date ?? "")], ["claim.dateOfInjury", parseMindBillSubmissionDate(this.bill.claim.dateOfInjury ?? "")], ["claim.claimNumber", this.bill.claim.claimNumber], ["claim.employer", this.bill.claim.employer],
864
- ["claim.claimsAdministrator", this.bill.claim.claimsAdministrator.id], ["diagnoses", this.bill.diagnoses.length],
895
+ ["claim.claimsAdministrator", this.bill.claim.claimsAdministrator.id],
896
+ ["claim.claimsAdministrator.payerId", !this.payerSelectionRequired || this.bill.claim.claimsAdministrator.payerId],
897
+ ["diagnoses", this.bill.diagnoses.length],
865
898
  ["billingProvider.name", this.bill.billingProvider.name], ["billingProvider.taxId", this.bill.billingProvider.taxId], ["billingProvider.npi", this.bill.billingProvider.npi], ["billingProvider.phone", this.bill.billingProvider.phone],
866
899
  ["billingProvider.address.line1", this.bill.billingProvider.address.line1], ["billingProvider.address.city", this.bill.billingProvider.address.city], ["billingProvider.address.state", this.bill.billingProvider.address.state], ["billingProvider.address.postalCode", this.bill.billingProvider.address.postalCode],
867
900
  ["renderingProvider.name", this.bill.renderingProvider.name], ["renderingProvider.npi", this.bill.renderingProvider.npi], ["renderingProvider.taxonomy", this.bill.renderingProvider.taxonomy],
@@ -962,6 +995,13 @@ class MindBillBillSubmissionComponent {
962
995
  @if (payerResults.length) { <div class="options">@for (payer of payerResults; track payer.id) { <button type="button" (click)="selectPayer(payer)"><strong>{{ payer.name }}</strong><span>{{ payer.hasElectronic ? 'Electronic routing' : 'Paper / fax' }}@if (payer.confidence) { · {{ payer.confidence }} match }</span></button> }</div> }
963
996
  @if (bill.claim.claimsAdministrator.id) { <small class="selected">✓ Routed to {{ bill.claim.claimsAdministrator.name }}</small> }
964
997
  </div>
998
+ @if (payerSelectionRequired && subpayorOptions.length) {
999
+ <div class="wide lookup" [class.invalid]="bad('claim.claimsAdministrator.payerId')"><label>Payer <b>*</b></label>
1000
+ <mindbill-combo-box ariaLabel="Payer" [value]="subpayorLabel" [invalid]="bad('claim.claimsAdministrator.payerId')" [preserveValueOnOpen]="true" placeholder="Select the payer for this claims administrator…" [options]="subpayorComboOptions" (selected)="selectSubpayor($event)"/>
1001
+ @if (subpayorLabel) { <small class="selected">✓ Payer set: {{ subpayorLabel }}</small> }
1002
+ @else { <small>This claims administrator routes bills per payer. Choose the payer that should receive this bill.</small> }
1003
+ </div>
1004
+ }
965
1005
  <label class="wide">Injury description (optional)<input name="description" [(ngModel)]="bill.claim.description"></label>
966
1006
  <div class="wide diagnosis" [class.invalid]="bad('diagnoses')"><label>Diagnosis codes (ICD-10) <b>*</b></label>
967
1007
  <div class="quick">@for (item of quickDiagnoses; track item.code) { <button type="button" [class.on]="hasDiagnosis(item.code)" (click)="toggleDiagnosis(item)">{{ hasDiagnosis(item.code) ? '✓' : '+' }} {{ item.label }}</button> }</div>
@@ -1064,6 +1104,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
1064
1104
  @if (payerResults.length) { <div class="options">@for (payer of payerResults; track payer.id) { <button type="button" (click)="selectPayer(payer)"><strong>{{ payer.name }}</strong><span>{{ payer.hasElectronic ? 'Electronic routing' : 'Paper / fax' }}@if (payer.confidence) { · {{ payer.confidence }} match }</span></button> }</div> }
1065
1105
  @if (bill.claim.claimsAdministrator.id) { <small class="selected">✓ Routed to {{ bill.claim.claimsAdministrator.name }}</small> }
1066
1106
  </div>
1107
+ @if (payerSelectionRequired && subpayorOptions.length) {
1108
+ <div class="wide lookup" [class.invalid]="bad('claim.claimsAdministrator.payerId')"><label>Payer <b>*</b></label>
1109
+ <mindbill-combo-box ariaLabel="Payer" [value]="subpayorLabel" [invalid]="bad('claim.claimsAdministrator.payerId')" [preserveValueOnOpen]="true" placeholder="Select the payer for this claims administrator…" [options]="subpayorComboOptions" (selected)="selectSubpayor($event)"/>
1110
+ @if (subpayorLabel) { <small class="selected">✓ Payer set: {{ subpayorLabel }}</small> }
1111
+ @else { <small>This claims administrator routes bills per payer. Choose the payer that should receive this bill.</small> }
1112
+ </div>
1113
+ }
1067
1114
  <label class="wide">Injury description (optional)<input name="description" [(ngModel)]="bill.claim.description"></label>
1068
1115
  <div class="wide diagnosis" [class.invalid]="bad('diagnoses')"><label>Diagnosis codes (ICD-10) <b>*</b></label>
1069
1116
  <div class="quick">@for (item of quickDiagnoses; track item.code) { <button type="button" [class.on]="hasDiagnosis(item.code)" (click)="toggleDiagnosis(item)">{{ hasDiagnosis(item.code) ? '✓' : '+' }} {{ item.label }}</button> }</div>