@mindbill/react 0.38.0 → 0.40.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/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { MindBillAppearance, MindBillEventDetail, MindBillErrorDetail } from '@mindbill/embed';
2
2
  export { MindBillAppearance, MindBillErrorDetail, MindBillEventDetail } from '@mindbill/embed';
3
3
  import { CSSProperties, ReactElement, ReactNode } from 'react';
4
- import { BillReviewData as BillReviewData$1, BillLifecycleDelivery, BillReviewAttachment as BillReviewAttachment$1, BrowserBillSubmissionResult, BillLifecycleSessionProvider, BillReviewPayer as BillReviewPayer$1, BrowserBillSubmissionDocument, BillDeliveryOptions as BillDeliveryOptions$1, SubmitBillInput, BillTasksDashboardData, BillTasksAgingBucket, BillHistoryEntry, ReportBillStatusInput, OrganizationProfileData, BillRemittanceSummary, BillEorDocument, BillPaymentRecord, BillLifecycleAction, BillRejection, BillLifecycleData, BillLifecycleClientOptions, BillLifecycleClient } from '@mindbill/browser';
5
- export { BILL_TASKS_AGING_BUCKETS, BillActivityRecord, BillClaimsAdministratorContact, BillClaimsAdministratorDirectory, BillClaimsAdministratorMailingAddress, BillClaimsAdministratorPattern, BillEorDocument, BillLifecycleAction, BillLifecycleActionId, BillLifecycleClient, BillLifecycleClientOptions, BillLifecycleData, BillLifecycleDelivery, BillLifecycleSession, BillLifecycleSessionProvider, BillLifecycleSessionRequest, BillPaymentRecord, BillRejection, BillRemittanceSummary, BillTasksAgingBucket, BillTasksDashboardData, BillTasksDashboardItem, BillTasksDashboardRow, BillTasksDashboardSection, BillTasksDashboardSectionInput, BillTasksDashboardTone, BrowserBillSubmissionResult, CloseBillInput, PostBillPaymentInput, REPORT_BILL_STATUS_OPTIONS, ReopenBillInput, ReportBillStatusContacts, ReportBillStatusId, ReportBillStatusInput, SECOND_REVIEW_REASON_TEMPLATE, SECOND_REVIEW_WINDOW_DAYS, SecondReviewDeadline, SendDuplicateBillInput, SubmitSecondReviewInput, billTasksAgingBucketIndex, buildBillTasksDashboard, createBillLifecycleClient, reportBillStatusContacts, secondReviewDeadline } from '@mindbill/browser';
4
+ import { BillReviewData as BillReviewData$1, BillLifecycleDelivery, BillReviewAttachment as BillReviewAttachment$1, BillReviewPayerOption, BrowserBillSubmissionResult, BillLifecycleSessionProvider, BillReviewPayer as BillReviewPayer$1, BrowserBillSubmissionDocument, BillDeliveryOptions as BillDeliveryOptions$1, SubmitBillInput, BillTasksDashboardData, BillTasksAgingBucket, BillHistoryEntry, ReportBillStatusInput, OrganizationProfileData, BillRemittanceSummary, BillEorDocument, BillPaymentRecord, BillLifecycleAction, BillRejection, BillLifecycleData, BillLifecycleClientOptions, BillLifecycleClient } from '@mindbill/browser';
5
+ export { BILL_TASKS_AGING_BUCKETS, BillActivityRecord, BillClaimsAdministratorContact, BillClaimsAdministratorDirectory, BillClaimsAdministratorMailingAddress, BillClaimsAdministratorPattern, BillEorDocument, BillLifecycleAction, BillLifecycleActionId, BillLifecycleClient, BillLifecycleClientOptions, BillLifecycleData, BillLifecycleDelivery, BillLifecycleSession, BillLifecycleSessionProvider, BillLifecycleSessionRequest, BillPaymentRecord, BillRejection, BillRemittanceSummary, BillReviewPayerOption, BillTasksAgingBucket, BillTasksDashboardData, BillTasksDashboardItem, BillTasksDashboardRow, BillTasksDashboardSection, BillTasksDashboardSectionInput, BillTasksDashboardTone, BrowserBillSubmissionResult, CloseBillInput, PostBillPaymentInput, REPORT_BILL_STATUS_OPTIONS, ReopenBillInput, ReportBillStatusContacts, ReportBillStatusId, ReportBillStatusInput, SECOND_REVIEW_REASON_TEMPLATE, SECOND_REVIEW_WINDOW_DAYS, SecondReviewDeadline, SendDuplicateBillInput, SubmitSecondReviewInput, billTasksAgingBucketIndex, buildBillTasksDashboard, createBillLifecycleClient, reportBillStatusContacts, secondReviewDeadline } from '@mindbill/browser';
6
6
 
7
7
  type MindBillThemePreset = "mindbill" | "qme-companion" | "orange-bright" | "clinical-blue" | "midnight-cyan";
8
8
  type MindBillReactAppearance = MindBillAppearance & {
@@ -179,6 +179,14 @@ type BillReviewPayer = {
179
179
  state: "match" | "warning";
180
180
  label: string;
181
181
  }>;
182
+ /** True when a bill for this claims administrator must name one of `payers`. */
183
+ payerSelectionRequired?: boolean;
184
+ /** Selectable payers (subpayors) under this claims administrator. */
185
+ payers?: Array<{
186
+ id: string;
187
+ label: string;
188
+ default?: boolean;
189
+ }>;
182
190
  };
183
191
  type BillReviewFeatures = {
184
192
  authorizationNumber?: boolean;
@@ -234,6 +242,8 @@ type BillReviewData = {
234
242
  };
235
243
  type BillReviewSaveInput = {
236
244
  claimsAdminId: string;
245
+ /** The chosen payer (subpayor) when the claims administrator requires payer selection. */
246
+ payerId?: string;
237
247
  patientOverrides?: {
238
248
  firstName: string;
239
249
  middleName?: string;
@@ -439,6 +449,11 @@ type BillSubmissionInput = {
439
449
  claimsAdministrator?: {
440
450
  id?: string;
441
451
  name: string;
452
+ /** The chosen payer (subpayor) when the claims administrator requires payer selection. */
453
+ payerId?: string;
454
+ /** Directory metadata carried while editing; stripped from the submitted bill. */
455
+ payerSelectionRequired?: boolean;
456
+ payers?: BillReviewPayerOption[];
442
457
  };
443
458
  };
444
459
  service: {
@@ -488,6 +503,7 @@ type CompleteBillSubmissionInput = Omit<BillSubmissionInput, "claim" | "billingP
488
503
  claimsAdministrator: {
489
504
  id: string;
490
505
  name: string;
506
+ payerId?: string;
491
507
  };
492
508
  };
493
509
  billingProvider: {
@@ -609,6 +625,23 @@ declare function validateBillSubmission(bill: BillSubmissionInput): BillSubmissi
609
625
  declare function normalizeClaimsAdministratorName(value: string): string;
610
626
  declare function exactClaimsAdministratorMatch(results: BillReviewPayer$1[], suppliedName: string): BillReviewPayer$1 | undefined;
611
627
  declare function claimsAdministratorRecommendations(results: BillReviewPayer$1[], limit?: number): BillReviewPayer$1[];
628
+ /**
629
+ * Form-state claims administrator for a directory pick. When the administrator
630
+ * requires payer selection it carries the payer (subpayor) choices and
631
+ * preselects the directory default; administrators without subpayors stay a
632
+ * plain `{ id, name }` reference.
633
+ */
634
+ declare function chooseClaimsAdministrator(payer: Pick<BillReviewPayer$1, "id" | "name" | "payerSelectionRequired" | "payers">): NonNullable<BillSubmissionInput["claim"]["claimsAdministrator"]>;
635
+ /**
636
+ * The claims administrator reference exactly as submitted to MindBill: picker
637
+ * metadata (payerSelectionRequired, payers) stays client-side and the chosen
638
+ * payerId rides on the wire only when set.
639
+ */
640
+ declare function submittedClaimsAdministrator(administrator: NonNullable<BillSubmissionInput["claim"]["claimsAdministrator"]>): {
641
+ id: string;
642
+ name: string;
643
+ payerId?: string;
644
+ };
612
645
  type BillSubmissionSectionId = "header" | "patient" | "claim" | "providers" | "serviceLines" | "attachments" | "actions";
613
646
  declare function BillSubmissionHeader(): ReactElement;
614
647
  declare function BillSubmissionPatientSection(): ReactElement;
@@ -987,6 +1020,18 @@ declare function BillHistoryTable({ entries, emptyLabel, appearance, className,
987
1020
  type BillLifecycleStage = "submitted" | "accepted" | "processed" | "closed";
988
1021
  /** Maps MindBill's detailed lifecycle state into a compact progress stage. */
989
1022
  declare function billLifecycleStage(state: string): BillLifecycleStage;
1023
+ type BillLifecycleProgressStepsOptions = {
1024
+ /**
1025
+ * Render pre-submission bills ("draft") as a dedicated leading Draft stage
1026
+ * ahead of the Sent→Closed rail. Off by default: hosts whose bills are always
1027
+ * already submitted (the typical partner embed) never see a Draft stage, and
1028
+ * without the flag a draft state keeps the legacy rendering (Sent as the
1029
+ * current stage). Post-submission states render identically either way.
1030
+ */
1031
+ draftStage?: boolean;
1032
+ };
1033
+ /** True when the lifecycle state is a pre-submission draft. */
1034
+ declare function isBillLifecycleDraft(state: string): boolean;
990
1035
  /** Returns the end-user label for a canonical lifecycle state. */
991
1036
  declare function billLifecycleDisplayLabel(state: string, nativeStatus?: string): string;
992
1037
  type BillLifecycleProgressProps = SurfaceProps & {
@@ -994,8 +1039,10 @@ type BillLifecycleProgressProps = SurfaceProps & {
994
1039
  nativeStatus?: string;
995
1040
  submittedAt?: string | null;
996
1041
  agingDays?: number | null;
1042
+ /** Opt-in leading Draft stage for pre-submission bills. See {@link BillLifecycleProgressStepsOptions}. */
1043
+ draftStage?: boolean;
997
1044
  };
998
- declare function BillLifecycleProgress({ state, nativeStatus, submittedAt, agingDays, appearance, className, style }: BillLifecycleProgressProps): ReactElement;
1045
+ declare function BillLifecycleProgress({ state, nativeStatus, submittedAt, agingDays, draftStage, appearance, className, style }: BillLifecycleProgressProps): ReactElement;
999
1046
  type BillRejectionNoticeProps = SurfaceProps & {
1000
1047
  rejection: BillRejection;
1001
1048
  title?: string;
@@ -1088,4 +1135,4 @@ type MindBillWidgetProps = {
1088
1135
  declare function MindBillBillTimeline(props: MindBillWidgetProps): ReactElement;
1089
1136
  declare function MindBillBillReview(props: MindBillWidgetProps): ReactElement;
1090
1137
 
1091
- export { BILL_STATUS_AGING_BUCKETS, BILL_SUBMISSION_DIAGNOSIS_QUICK_PICKS, BILL_SUBMISSION_DOCUMENT_TYPES, BILL_SUBMISSION_REPORT_TYPES, BILL_SUBMISSION_REQUIRED_FIELDS, type BillActivityEvent, BillActivityTimeline, type BillActivityTimelineProps, type BillAgingBucket, type BillAgingBucketId, BillAgingSummary, type BillAgingSummaryProps, BillExplanationOfReview, type BillExplanationOfReviewProps, BillHistoryTable, type BillHistoryTableProps, BillLifecycleActions, type BillLifecycleActionsProps, BillLifecycleProgress, type BillLifecycleProgressProps, type BillLifecycleStage, BillList, type BillListProps, BillPayerContactCard, type BillPayerContactCardProps, BillPaymentLedger, type BillPaymentLedgerProps, BillReadOnlyForm, type BillReadOnlyFormProps, BillRejectionNotice, type BillRejectionNoticeProps, BillRemittanceCard, type BillRemittanceCardProps, type BillReviewAttachment, type BillReviewBillingProvider, type BillReviewClinician, type BillReviewData, type BillReviewDocumentType, type BillReviewDraft, type BillReviewFeatures, BillReviewForm, type BillReviewFormProps, type BillReviewLineItem, type BillReviewLocation, type BillReviewPayer, type BillReviewSaveInput, BillSnapshotSummary, type BillSnapshotSummaryProps, type BillStatusAction, type BillStatusAgingCell, BillStatusAgingMatrix, type BillStatusAgingMatrixData, type BillStatusAgingMatrixProps, type BillStatusAgingRow, type BillStatusClient, type BillStatusClientOptions, type BillStatusData, type BillStatusSession, type BillStatusSessionProvider, type BillStatusSessionRequest, BillStatusSummary, type BillStatusSummaryProps, BillSubmissionActions, type BillSubmissionAddress, type BillSubmissionAttachmentReportTypeMode, BillSubmissionAttachmentsSection, BillSubmissionClaimSection, type BillSubmissionDiagnosisOption, type BillSubmissionDocumentType, type BillSubmissionEvaluationType, BillSubmissionForm, type BillSubmissionFormProps, type BillSubmissionFormValue, BillSubmissionHeader, type BillSubmissionInput, type BillSubmissionModifierOption, BillSubmissionPatientSection, type BillSubmissionPostalPlace, type BillSubmissionProcedureOption, BillSubmissionProvidersSection, type BillSubmissionReportTypeOption, type BillSubmissionRibbonItem, type BillSubmissionRoute, type BillSubmissionSectionId, BillSubmissionServiceLinesSection, type BillSubmissionSourceAttachment, type BillSubmissionTaxonomyOption, type BillSubmissionUpload, type BillSubmissionValidation, BillSubmissionsRibbon, type BillSubmissionsRibbonProps, BillTasksDashboard, type BillTasksDashboardCell, type BillTasksDashboardProps, type BillingComponentProps, BillingDashboard, type BillingDashboardBill, type BillingDashboardProps, type BillingDashboardSummary, BillingReport, type BillingReportDimension, type BillingReportProps, type BillingReportRow, BillingSettings, ConnectedBillLifecycle, type ConnectedBillLifecycleProps, ConnectedBillStatus, type ConnectedBillStatusProps, DEFAULT_BILL_SUBMISSION_MODIFIERS, DEFAULT_BILL_SUBMISSION_PROCEDURES, DEFAULT_BILL_SUBMISSION_TAXONOMIES, MED_LEGAL_REPORT_TYPE_CODE, MindBillBillReview, MindBillBillTimeline, type MindBillReactAppearance, type MindBillThemePreset, type MindBillWidgetProps, OrganizationOnboarding, type OrganizationOnboardingProps, PSYCH_QME_DEFAULT_DIAGNOSIS, ReportBillStatusDialog, type ReportBillStatusDialogProps, SendRouteDialog, type SendRouteDialogProps, type SendRouteSubmission, type UseBillLifecycleOptions, type UseBillLifecycleResult, type UseBillStatusOptions, type UseBillStatusResult, applyBillSubmissionEvaluationDiagnoses, applyBillSubmissionEvaluationModifiers, billActivityEventLabel, billAgingBucket, billAgingDays, billLifecycleDisplayLabel, billLifecycleStage, billSubmissionsRibbonDeliveryLabel, billSubmissionsRibbonFromHistory, buildBillReviewSaveInput, buildBillStatusAgingCsv, buildBillStatusAgingMatrix, buildBillingReportCsv, buildBillingReportRows, calculateBillSubmissionAllowedAmount, claimsAdministratorRecommendations, createBillStatusClient, ensureTrailingBillSubmissionLine, ensureTrailingProcedureLine, exactClaimsAdministratorMatch, extractSendRouteEmail, formatBillSubmissionDate, formatSendRouteFax, mindBillAppearanceStyle, mindBillThemePresets, normalizeClaimsAdministratorName, parseBillSubmissionDate, prepareBillSubmissionDocuments, resolveMindBillAppearance, summarizeBillingDashboard, useBillLifecycle, useBillStatus, validateBillSubmission, visibleBillLifecycleActions };
1138
+ export { BILL_STATUS_AGING_BUCKETS, BILL_SUBMISSION_DIAGNOSIS_QUICK_PICKS, BILL_SUBMISSION_DOCUMENT_TYPES, BILL_SUBMISSION_REPORT_TYPES, BILL_SUBMISSION_REQUIRED_FIELDS, type BillActivityEvent, BillActivityTimeline, type BillActivityTimelineProps, type BillAgingBucket, type BillAgingBucketId, BillAgingSummary, type BillAgingSummaryProps, BillExplanationOfReview, type BillExplanationOfReviewProps, BillHistoryTable, type BillHistoryTableProps, BillLifecycleActions, type BillLifecycleActionsProps, BillLifecycleProgress, type BillLifecycleProgressProps, type BillLifecycleProgressStepsOptions, type BillLifecycleStage, BillList, type BillListProps, BillPayerContactCard, type BillPayerContactCardProps, BillPaymentLedger, type BillPaymentLedgerProps, BillReadOnlyForm, type BillReadOnlyFormProps, BillRejectionNotice, type BillRejectionNoticeProps, BillRemittanceCard, type BillRemittanceCardProps, type BillReviewAttachment, type BillReviewBillingProvider, type BillReviewClinician, type BillReviewData, type BillReviewDocumentType, type BillReviewDraft, type BillReviewFeatures, BillReviewForm, type BillReviewFormProps, type BillReviewLineItem, type BillReviewLocation, type BillReviewPayer, type BillReviewSaveInput, BillSnapshotSummary, type BillSnapshotSummaryProps, type BillStatusAction, type BillStatusAgingCell, BillStatusAgingMatrix, type BillStatusAgingMatrixData, type BillStatusAgingMatrixProps, type BillStatusAgingRow, type BillStatusClient, type BillStatusClientOptions, type BillStatusData, type BillStatusSession, type BillStatusSessionProvider, type BillStatusSessionRequest, BillStatusSummary, type BillStatusSummaryProps, BillSubmissionActions, type BillSubmissionAddress, type BillSubmissionAttachmentReportTypeMode, BillSubmissionAttachmentsSection, BillSubmissionClaimSection, type BillSubmissionDiagnosisOption, type BillSubmissionDocumentType, type BillSubmissionEvaluationType, BillSubmissionForm, type BillSubmissionFormProps, type BillSubmissionFormValue, BillSubmissionHeader, type BillSubmissionInput, type BillSubmissionModifierOption, BillSubmissionPatientSection, type BillSubmissionPostalPlace, type BillSubmissionProcedureOption, BillSubmissionProvidersSection, type BillSubmissionReportTypeOption, type BillSubmissionRibbonItem, type BillSubmissionRoute, type BillSubmissionSectionId, BillSubmissionServiceLinesSection, type BillSubmissionSourceAttachment, type BillSubmissionTaxonomyOption, type BillSubmissionUpload, type BillSubmissionValidation, BillSubmissionsRibbon, type BillSubmissionsRibbonProps, BillTasksDashboard, type BillTasksDashboardCell, type BillTasksDashboardProps, type BillingComponentProps, BillingDashboard, type BillingDashboardBill, type BillingDashboardProps, type BillingDashboardSummary, BillingReport, type BillingReportDimension, type BillingReportProps, type BillingReportRow, BillingSettings, ConnectedBillLifecycle, type ConnectedBillLifecycleProps, ConnectedBillStatus, type ConnectedBillStatusProps, DEFAULT_BILL_SUBMISSION_MODIFIERS, DEFAULT_BILL_SUBMISSION_PROCEDURES, DEFAULT_BILL_SUBMISSION_TAXONOMIES, MED_LEGAL_REPORT_TYPE_CODE, MindBillBillReview, MindBillBillTimeline, type MindBillReactAppearance, type MindBillThemePreset, type MindBillWidgetProps, OrganizationOnboarding, type OrganizationOnboardingProps, PSYCH_QME_DEFAULT_DIAGNOSIS, ReportBillStatusDialog, type ReportBillStatusDialogProps, SendRouteDialog, type SendRouteDialogProps, type SendRouteSubmission, type UseBillLifecycleOptions, type UseBillLifecycleResult, type UseBillStatusOptions, type UseBillStatusResult, applyBillSubmissionEvaluationDiagnoses, applyBillSubmissionEvaluationModifiers, billActivityEventLabel, billAgingBucket, billAgingDays, billLifecycleDisplayLabel, billLifecycleStage, billSubmissionsRibbonDeliveryLabel, billSubmissionsRibbonFromHistory, buildBillReviewSaveInput, buildBillStatusAgingCsv, buildBillStatusAgingMatrix, buildBillingReportCsv, buildBillingReportRows, calculateBillSubmissionAllowedAmount, chooseClaimsAdministrator, claimsAdministratorRecommendations, createBillStatusClient, ensureTrailingBillSubmissionLine, ensureTrailingProcedureLine, exactClaimsAdministratorMatch, extractSendRouteEmail, formatBillSubmissionDate, formatSendRouteFax, isBillLifecycleDraft, mindBillAppearanceStyle, mindBillThemePresets, normalizeClaimsAdministratorName, parseBillSubmissionDate, prepareBillSubmissionDocuments, resolveMindBillAppearance, submittedClaimsAdministrator, summarizeBillingDashboard, useBillLifecycle, useBillStatus, validateBillSubmission, visibleBillLifecycleActions };
package/dist/index.js CHANGED
@@ -1296,7 +1296,8 @@ var READ_ONLY_STYLES = `
1296
1296
  import { createContext, useCallback, useContext, useEffect as useEffect4, useMemo as useMemo3, useRef as useRef2, useState as useState4 } from "react";
1297
1297
  import {
1298
1298
  createBillReferenceClient,
1299
- createBillSubmissionClient
1299
+ createBillSubmissionClient,
1300
+ defaultBillReviewPayerOption
1300
1301
  } from "@mindbill/browser";
1301
1302
 
1302
1303
  // src/send-route-dialog.tsx
@@ -2153,6 +2154,9 @@ function validateBillSubmission(bill) {
2153
2154
  if (bill.claim.claimsAdministrator?.name && !bill.claim.claimsAdministrator.id) {
2154
2155
  errors["claim.claimsAdministrator"] = "Select a claims administrator from the payer directory.";
2155
2156
  }
2157
+ if (bill.claim.claimsAdministrator?.payerSelectionRequired && !bill.claim.claimsAdministrator.payerId?.trim()) {
2158
+ errors["claim.claimsAdministrator.payerId"] = "Select the payer for this claims administrator.";
2159
+ }
2156
2160
  if (bill.patient.dateOfBirth && !parseBillSubmissionDate(bill.patient.dateOfBirth)) errors["patient.dateOfBirth"] = "Use MM/DD/YYYY";
2157
2161
  if (bill.claim.dateOfInjury && !parseBillSubmissionDate(bill.claim.dateOfInjury)) errors["claim.dateOfInjury"] = "Use MM/DD/YYYY";
2158
2162
  if (bill.patient.address.state.trim().length !== 2) errors["patient.address.state"] = "Use a 2-letter state code";
@@ -2298,6 +2302,25 @@ function exactClaimsAdministratorMatch(results, suppliedName) {
2298
2302
  function claimsAdministratorRecommendations(results, limit = 5) {
2299
2303
  return [...results].sort((left, right) => Number(Boolean(right.recommended)) - Number(Boolean(left.recommended))).slice(0, Math.max(0, limit));
2300
2304
  }
2305
+ function chooseClaimsAdministrator(payer) {
2306
+ if (!payer.payerSelectionRequired) return { id: payer.id, name: payer.name };
2307
+ const payers = (payer.payers ?? []).map((option) => ({ ...option }));
2308
+ const preselected = defaultBillReviewPayerOption(payer);
2309
+ return {
2310
+ id: payer.id,
2311
+ name: payer.name,
2312
+ payerSelectionRequired: true,
2313
+ ...payers.length ? { payers } : {},
2314
+ ...preselected ? { payerId: preselected.id } : {}
2315
+ };
2316
+ }
2317
+ function submittedClaimsAdministrator(administrator) {
2318
+ return {
2319
+ id: administrator.id ?? "",
2320
+ name: administrator.name,
2321
+ ...administrator.payerId ? { payerId: administrator.payerId } : {}
2322
+ };
2323
+ }
2301
2324
  var BillSubmissionSectionsContext = createContext(null);
2302
2325
  function BillSubmissionSection({ id }) {
2303
2326
  const sections = useContext(BillSubmissionSectionsContext);
@@ -2497,7 +2520,7 @@ function BillSubmissionForm({
2497
2520
  if (request !== payerRequest.current) return;
2498
2521
  setPayerResults(results);
2499
2522
  const exact = autoSelect ? exactClaimsAdministratorMatch(results, trimmed) : void 0;
2500
- if (exact) setBill((current) => ({ ...current, claim: { ...current.claim, claimsAdministrator: { id: exact.id, name: exact.name } } }));
2523
+ if (exact) setBill((current) => ({ ...current, claim: { ...current.claim, claimsAdministrator: chooseClaimsAdministrator(exact) } }));
2501
2524
  } catch (caught) {
2502
2525
  if (request === payerRequest.current) setFormError(caught instanceof Error ? caught.message : "Claims administrator search is unavailable.");
2503
2526
  } finally {
@@ -2592,7 +2615,14 @@ function BillSubmissionForm({
2592
2615
  return;
2593
2616
  }
2594
2617
  if (selectedIds.length + uploads.length > MAX_DOCUMENTS) return setFormError(`A bill can include at most ${MAX_DOCUMENTS} attachments.`);
2595
- const complete = clean;
2618
+ const administrator2 = clean.claim.claimsAdministrator;
2619
+ const complete = {
2620
+ ...clean,
2621
+ claim: {
2622
+ ...clean.claim,
2623
+ ...administrator2 ? { claimsAdministrator: submittedClaimsAdministrator(administrator2) } : {}
2624
+ }
2625
+ };
2596
2626
  if (onSubmit) {
2597
2627
  setSubmitting(true);
2598
2628
  try {
@@ -2652,7 +2682,12 @@ function BillSubmissionForm({
2652
2682
  const claimsAdministratorError = errors["claim.claimsAdministrator"];
2653
2683
  const selectedPayer = payerResults.find((payer) => payer.id === bill.claim.claimsAdministrator?.id);
2654
2684
  const payerRecommendations = bill.claim.claimsAdministrator?.id ? [] : claimsAdministratorRecommendations(payerResults);
2655
- const choosePayer = (payer) => setBill((current) => ({ ...current, claim: { ...current.claim, claimsAdministrator: { id: payer.id, name: payer.name } } }));
2685
+ const choosePayer = (payer) => setBill((current) => ({ ...current, claim: { ...current.claim, claimsAdministrator: chooseClaimsAdministrator(payer) } }));
2686
+ const administrator = bill.claim.claimsAdministrator;
2687
+ const subpayorOptions = administrator?.payerSelectionRequired ? administrator.payers ?? [] : [];
2688
+ const subpayorError = errors["claim.claimsAdministrator.payerId"];
2689
+ const selectedSubpayor = subpayorOptions.find((option) => option.id === administrator?.payerId);
2690
+ const chooseSubpayor = (payerId) => setBill((current) => current.claim.claimsAdministrator ? { ...current, claim: { ...current.claim, claimsAdministrator: { ...current.claim.claimsAdministrator, payerId } } } : current);
2656
2691
  const headerSection = /* @__PURE__ */ jsxs4("div", { className: "mbsf-head", children: [
2657
2692
  /* @__PURE__ */ jsxs4("div", { children: [
2658
2693
  /* @__PURE__ */ jsx4("h3", { className: "mbsf-title", children: heading }),
@@ -2693,7 +2728,7 @@ function BillSubmissionForm({
2693
2728
  /* @__PURE__ */ jsx4(Field2, { path: "claim.claimNumber", label: "Claim number", required: true, error: errors["claim.claimNumber"], children: text(bill.claim.claimNumber, (claimNumber) => setBill((c) => ({ ...c, claim: { ...c.claim, claimNumber } }))) }),
2694
2729
  /* @__PURE__ */ jsx4(Field2, { label: "WCAB / ADJ number (optional)", children: text(bill.claim.adjNumber, (adjNumber) => setBill((c) => ({ ...c, claim: { ...c.claim, adjNumber } }))) }),
2695
2730
  /* @__PURE__ */ jsxs4(Field2, { path: "claim.claimsAdministrator", label: "Claims administrator", required: true, span: true, error: claimsAdministratorError, children: [
2696
- /* @__PURE__ */ jsx4(ComboBox, { ariaLabel: "Claims administrator", invalid: Boolean(claimsAdministratorError), disabled: locked, loading: payerLoading, preserveValueOnOpen: true, value: bill.claim.claimsAdministrator?.name ?? "", placeholder: "Search the payer directory\u2026", options: payerResults.map((payer) => ({ id: payer.id, label: payer.name, detail: [payer.hasElectronic ? "Electronic" : "Work comp", ...payer.states ?? []].join(" \xB7 ") })), onQuery: searchPayers, onSelect: (option) => choosePayer({ id: option.id, name: option.label }) }),
2731
+ /* @__PURE__ */ jsx4(ComboBox, { ariaLabel: "Claims administrator", invalid: Boolean(claimsAdministratorError), disabled: locked, loading: payerLoading, preserveValueOnOpen: true, value: bill.claim.claimsAdministrator?.name ?? "", placeholder: "Search the payer directory\u2026", options: payerResults.map((payer) => ({ id: payer.id, label: payer.name, detail: [payer.hasElectronic ? "Electronic" : "Work comp", ...payer.states ?? []].join(" \xB7 ") })), onQuery: searchPayers, onSelect: (option) => choosePayer(payerResults.find((payer) => payer.id === option.id) ?? { id: option.id, name: option.label }) }),
2697
2732
  selectedPayer ? /* @__PURE__ */ jsxs4("div", { className: "mbsf-payer-status", role: "status", children: [
2698
2733
  /* @__PURE__ */ jsx4("strong", { children: "\u2713 Routing match set:" }),
2699
2734
  " ",
@@ -2724,6 +2759,14 @@ function BillSubmissionForm({
2724
2759
  ] }) : null,
2725
2760
  !selectedPayer && !payerLoading && !payerRecommendations.length && (bill.claim.claimsAdministrator?.name.trim().length ?? 0) >= 2 ? /* @__PURE__ */ jsx4("small", { className: "mbsf-help", children: "No confident route selected yet. Search the directory and choose a claims administrator." }) : null
2726
2761
  ] }),
2762
+ administrator?.payerSelectionRequired && subpayorOptions.length ? /* @__PURE__ */ jsxs4(Field2, { path: "claim.claimsAdministrator.payerId", label: "Payer", required: true, span: true, error: subpayorError, children: [
2763
+ /* @__PURE__ */ jsx4(ComboBox, { ariaLabel: "Payer", invalid: Boolean(subpayorError), disabled: locked, preserveValueOnOpen: true, value: selectedSubpayor?.label ?? "", placeholder: "Select the payer for this claims administrator\u2026", options: subpayorOptions.map((option) => ({ id: option.id, label: option.label, ...option.default ? { detail: "Default" } : {} })), onSelect: (option) => chooseSubpayor(option.id) }),
2764
+ selectedSubpayor ? /* @__PURE__ */ jsxs4("div", { className: "mbsf-payer-status", role: "status", children: [
2765
+ /* @__PURE__ */ jsx4("strong", { children: "\u2713 Payer set:" }),
2766
+ " ",
2767
+ selectedSubpayor.label
2768
+ ] }) : /* @__PURE__ */ jsx4("small", { className: "mbsf-help", children: "This claims administrator routes bills per payer. Choose the payer that should receive this bill." })
2769
+ ] }) : null,
2727
2770
  /* @__PURE__ */ jsx4(Field2, { label: "Injury description (optional)", span: true, children: text(bill.claim.description, (description2) => setBill((c) => ({ ...c, claim: { ...c.claim, description: description2 } }))) }),
2728
2771
  /* @__PURE__ */ jsxs4(Field2, { path: "diagnoses", label: "Diagnosis codes (ICD-10)", required: true, span: true, error: errors.diagnoses, children: [
2729
2772
  /* @__PURE__ */ jsx4("div", { className: "mbsf-quick-picks", "aria-label": "Common diagnosis codes", children: BILL_SUBMISSION_DIAGNOSIS_QUICK_PICKS.map((option) => {
@@ -4500,13 +4543,22 @@ function billLifecycleStage(state) {
4500
4543
  if (value.includes("accepted")) return "accepted";
4501
4544
  return "submitted";
4502
4545
  }
4503
- function billLifecycleProgressSteps(state) {
4546
+ function isBillLifecycleDraft(state) {
4547
+ return state.toLowerCase() === "draft";
4548
+ }
4549
+ function billLifecycleProgressSteps(state, options) {
4504
4550
  if (state.toLowerCase() === "rejected") {
4505
4551
  return [
4506
4552
  { id: "submitted", label: "Sent", status: "complete" },
4507
4553
  { id: "rejected", label: "Rejected", status: "current" }
4508
4554
  ];
4509
4555
  }
4556
+ if (options?.draftStage && isBillLifecycleDraft(state)) {
4557
+ return [
4558
+ { id: "draft", label: "Draft", status: "current" },
4559
+ ...lifecycleStages.map((stage) => ({ ...stage, status: "upcoming" }))
4560
+ ];
4561
+ }
4510
4562
  const current = billLifecycleStage(state);
4511
4563
  const currentIndex = lifecycleStages.findIndex((stage) => stage.id === current);
4512
4564
  return lifecycleStages.map((stage, index) => ({
@@ -4524,14 +4576,15 @@ function billLifecycleDisplayLabel(state, nativeStatus) {
4524
4576
  if (value === "written_off") return "Written off";
4525
4577
  return humanize(state || nativeStatus || "submitted");
4526
4578
  }
4527
- function BillLifecycleProgress({ state, nativeStatus, submittedAt, agingDays, appearance, className, style }) {
4579
+ function BillLifecycleProgress({ state, nativeStatus, submittedAt, agingDays, draftStage, appearance, className, style }) {
4528
4580
  const rejected = state.toLowerCase() === "rejected";
4529
- const steps = billLifecycleProgressSteps(state);
4581
+ const draft = Boolean(draftStage) && isBillLifecycleDraft(state);
4582
+ const steps = billLifecycleProgressSteps(state, { draftStage: Boolean(draftStage) });
4530
4583
  return /* @__PURE__ */ jsxs12("section", { className: classes(`mb-surface mb-progress${rejected ? " is-rejected" : ""}`, className), style: mindBillAppearanceStyle(appearance, style), "aria-label": "Bill lifecycle", children: [
4531
4584
  /* @__PURE__ */ jsx12("style", { children: lifecycleSurfaceStyles }),
4532
4585
  /* @__PURE__ */ jsx12("header", { className: "mb-surface-heading", children: /* @__PURE__ */ jsxs12("div", { children: [
4533
4586
  /* @__PURE__ */ jsx12("strong", { children: billLifecycleDisplayLabel(state, nativeStatus) }),
4534
- /* @__PURE__ */ jsx12("span", { children: rejected ? "The payer rejected this submission." : `${submittedAt ? `Submitted ${defaultFormatDate(submittedAt)}` : "Submitted"}${typeof agingDays === "number" ? ` \xB7 ${agingDays} days old` : ""}` })
4587
+ /* @__PURE__ */ jsx12("span", { children: rejected ? "The payer rejected this submission." : draft ? "Not yet sent" : `${submittedAt ? `Submitted ${defaultFormatDate(submittedAt)}` : "Submitted"}${typeof agingDays === "number" ? ` \xB7 ${agingDays} days old` : ""}` })
4535
4588
  ] }) }),
4536
4589
  /* @__PURE__ */ jsx12("ol", { className: "mb-progress-list", style: { gridTemplateColumns: `repeat(${steps.length}, minmax(0, 1fr))` }, children: steps.map((step, index) => /* @__PURE__ */ jsxs12("li", { className: `is-${step.status}`, "aria-current": step.status === "current" ? "step" : void 0, children: [
4537
4590
  /* @__PURE__ */ jsx12("span", { "aria-hidden": "true", children: step.status === "complete" ? "\u2713" : rejected && step.status === "current" ? "!" : index + 1 }),
@@ -5729,6 +5782,7 @@ export {
5729
5782
  buildBillingReportCsv,
5730
5783
  buildBillingReportRows,
5731
5784
  calculateBillSubmissionAllowedAmount,
5785
+ chooseClaimsAdministrator,
5732
5786
  claimsAdministratorRecommendations,
5733
5787
  createBillLifecycleClient2 as createBillLifecycleClient,
5734
5788
  createBillStatusClient,
@@ -5738,6 +5792,7 @@ export {
5738
5792
  extractSendRouteEmail,
5739
5793
  formatBillSubmissionDate,
5740
5794
  formatSendRouteFax,
5795
+ isBillLifecycleDraft,
5741
5796
  mindBillAppearanceStyle,
5742
5797
  mindBillThemePresets,
5743
5798
  normalizeClaimsAdministratorName,
@@ -5746,6 +5801,7 @@ export {
5746
5801
  reportBillStatusContacts2 as reportBillStatusContacts,
5747
5802
  resolveMindBillAppearance,
5748
5803
  secondReviewDeadline2 as secondReviewDeadline,
5804
+ submittedClaimsAdministrator,
5749
5805
  summarizeBillingDashboard,
5750
5806
  useBillLifecycle,
5751
5807
  useBillStatus,