@mindbill/angular 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -90,6 +90,14 @@ as a new immutable attempt. The canonical `billId` stays the same and every
|
|
|
90
90
|
attempt remains in the bill history; the Angular host does not need a custom
|
|
91
91
|
correction form or resubmission API adapter.
|
|
92
92
|
|
|
93
|
+
For a **closed** bill MindBill authorizes exactly two actions — **Reopen** and
|
|
94
|
+
**Submit New Bill**. Submit New Bill opens the same
|
|
95
|
+
`MindBillBillSubmissionComponent` prefilled from the closed bill's snapshot
|
|
96
|
+
with its documents carried forward, plus a Cancel control returning to the
|
|
97
|
+
closed-bill view. Submitting creates a fresh original bill linked to the
|
|
98
|
+
closed predecessor: the closed bill stays closed and keeps its record, and the
|
|
99
|
+
bill history chains both records.
|
|
100
|
+
|
|
93
101
|
Procedure codes, modifiers, and rendering taxonomy all use the same styled searchable dropdown (`mindbill-combo-box`) with code + description rows, hover states, and typed custom-code entry for complete CPT/HCPCS/medical-legal codes. Service lines accept multiple modifiers rendered as removable chips. PDFs can be dropped anywhere on the screen — a full-page overlay confirms the drop target — with the same 25 MB per-file, 100 MB total, and 20-document limits as the React form.
|
|
94
102
|
|
|
95
103
|
The default reference directories and field rules live in the component library. Hosts can provide custom procedure, modifier, and taxonomy options without reimplementing the form. For a fixture or Storybook, pass an async `submitter`; omit it in production so the component talks directly to the Partner API.
|
|
@@ -1,6 +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, BILL_TASKS_AGING_BUCKETS, createOrganizationClient } from '@mindbill/browser';
|
|
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';
|
|
4
5
|
import * as i1 from '@angular/common';
|
|
5
6
|
import { CommonModule } from '@angular/common';
|
|
6
7
|
import * as i2 from '@angular/forms';
|
|
@@ -55,7 +56,10 @@ class MindBillLifecycleStore {
|
|
|
55
56
|
closeBill(input) { return this.mutate(() => this.requireClient().closeBill(input)); }
|
|
56
57
|
postPayment(input) { return this.mutate(() => this.requireClient().postPayment(input)); }
|
|
57
58
|
resubmitBill(input) { return this.mutate(() => this.requireClient().resubmitBill(input)); }
|
|
59
|
+
submitNewBill(input) { return this.mutate(() => this.requireClient().submitNewBill(input)); }
|
|
58
60
|
submitSecondReview(input) { return this.mutate(() => this.requireClient().submitSecondReview(input)); }
|
|
61
|
+
sendDuplicateBill(input) { return this.mutate(() => this.requireClient().sendDuplicateBill(input)); }
|
|
62
|
+
reportBillStatus(input) { return this.mutate(() => this.requireClient().reportBillStatus(input)); }
|
|
59
63
|
requireClient() {
|
|
60
64
|
if (!this.client)
|
|
61
65
|
throw new Error("Connect the lifecycle store before using it.");
|
|
@@ -1196,6 +1200,12 @@ class MindBillBillLifecycleComponent {
|
|
|
1196
1200
|
closeReason = "";
|
|
1197
1201
|
payment = { amount: 0, method: "check", depositDate: new Date().toISOString().slice(0, 10) };
|
|
1198
1202
|
review = { reason: "", payerClaimControlNumber: "", disputedAmount: 0 };
|
|
1203
|
+
reportStatusOptions = REPORT_BILL_STATUS_OPTIONS;
|
|
1204
|
+
duplicateDelivery = null;
|
|
1205
|
+
duplicateDeliveryError = "";
|
|
1206
|
+
duplicate = { route: "ebill", faxNumber: "", email: "", mailingAddress: "" };
|
|
1207
|
+
report = { status: null, company: "", representativeName: "", representativeRole: "", phone: "", callReference: "", note: "" };
|
|
1208
|
+
reportContactSummary = "";
|
|
1199
1209
|
correctionInitialBill = null;
|
|
1200
1210
|
correctionAttachments = [];
|
|
1201
1211
|
correctionAttentionFields = [];
|
|
@@ -1234,15 +1244,97 @@ class MindBillBillLifecycleComponent {
|
|
|
1234
1244
|
beginAction(action, data) {
|
|
1235
1245
|
if (action === "resubmit")
|
|
1236
1246
|
this.prepareCorrection(data);
|
|
1247
|
+
else if (action === "submit_new_bill")
|
|
1248
|
+
this.prepareNewBill(data);
|
|
1237
1249
|
else if (action === "post_payment")
|
|
1238
1250
|
this.panel = "payment";
|
|
1239
1251
|
else if (action === "second_review" || action === "independent_bill_review")
|
|
1240
1252
|
this.panel = "review";
|
|
1241
1253
|
else if (action === "close")
|
|
1242
1254
|
this.panel = "close";
|
|
1255
|
+
else if (action === "send_duplicate")
|
|
1256
|
+
this.beginSendDuplicate();
|
|
1257
|
+
else if (action === "report_bill_status")
|
|
1258
|
+
this.beginReportStatus(data);
|
|
1243
1259
|
else if (action === "view_eor" && data.eors[0])
|
|
1244
1260
|
void this.openEor(data.eors[0].id, data.eors[0].filename);
|
|
1245
1261
|
}
|
|
1262
|
+
beginSendDuplicate() { this.panel = "duplicate"; this.loadDuplicateDelivery(); }
|
|
1263
|
+
loadDuplicateDelivery() {
|
|
1264
|
+
this.duplicateDeliveryError = "";
|
|
1265
|
+
if (this.duplicateDelivery)
|
|
1266
|
+
return;
|
|
1267
|
+
this.store.getDeliveryOptions().then((delivery) => {
|
|
1268
|
+
this.duplicateDelivery = delivery;
|
|
1269
|
+
this.duplicate.route = delivery.recommended.route;
|
|
1270
|
+
this.duplicate.faxNumber = delivery.contacts.faxNumber || "";
|
|
1271
|
+
this.duplicate.email = delivery.contacts.claimsEmail || "";
|
|
1272
|
+
this.duplicate.mailingAddress = delivery.contacts.mailingAddress || "";
|
|
1273
|
+
}).catch((cause) => {
|
|
1274
|
+
this.duplicateDeliveryError = cause instanceof Error ? cause.message : "Delivery options could not be loaded.";
|
|
1275
|
+
});
|
|
1276
|
+
}
|
|
1277
|
+
duplicateRoutes() {
|
|
1278
|
+
const seen = new Set();
|
|
1279
|
+
return (this.duplicateDelivery?.options ?? []).filter((option) => {
|
|
1280
|
+
if (seen.has(option.route))
|
|
1281
|
+
return false;
|
|
1282
|
+
seen.add(option.route);
|
|
1283
|
+
return true;
|
|
1284
|
+
});
|
|
1285
|
+
}
|
|
1286
|
+
duplicateReady() {
|
|
1287
|
+
if (this.duplicate.route === "fax")
|
|
1288
|
+
return this.duplicate.faxNumber.replace(/\D/g, "").length >= 10;
|
|
1289
|
+
if (this.duplicate.route === "email")
|
|
1290
|
+
return this.duplicate.email.includes("@");
|
|
1291
|
+
if (this.duplicate.route === "mail")
|
|
1292
|
+
return this.duplicate.mailingAddress.trim().length > 2;
|
|
1293
|
+
return true;
|
|
1294
|
+
}
|
|
1295
|
+
async sendDuplicate() {
|
|
1296
|
+
if (!this.duplicateDelivery || !this.duplicateReady())
|
|
1297
|
+
return;
|
|
1298
|
+
const route = this.duplicate.route;
|
|
1299
|
+
const destination = route === "fax" ? { faxNumber: this.duplicate.faxNumber.trim() }
|
|
1300
|
+
: route === "email" ? { email: this.duplicate.email.trim() }
|
|
1301
|
+
: route === "mail" ? { mailingAddress: this.duplicate.mailingAddress.trim() }
|
|
1302
|
+
: null;
|
|
1303
|
+
await this.store.sendDuplicateBill({ route, ...(destination ? { destination } : {}) });
|
|
1304
|
+
this.panel = "";
|
|
1305
|
+
this.notice = "Duplicate bill sent.";
|
|
1306
|
+
}
|
|
1307
|
+
beginReportStatus(data) {
|
|
1308
|
+
const contacts = reportBillStatusContacts(data.delivery);
|
|
1309
|
+
const parts = [];
|
|
1310
|
+
if (contacts.claimsAdmin) {
|
|
1311
|
+
const phones = contacts.claimsAdmin.phones.map((phone) => `${phone.label} ${phone.value}`).join(", ");
|
|
1312
|
+
parts.push(`${contacts.claimsAdmin.name}${phones ? ` (${phones})` : ""}${contacts.claimsAdmin.hoursOfOperation ? ` · Hours: ${contacts.claimsAdmin.hoursOfOperation}` : ""}`);
|
|
1313
|
+
}
|
|
1314
|
+
if (contacts.billReview)
|
|
1315
|
+
parts.push(`Bill Review: ${contacts.billReview.name}${contacts.billReview.phone ? ` ${contacts.billReview.phone}` : ""}`);
|
|
1316
|
+
this.reportContactSummary = parts.length
|
|
1317
|
+
? `Call ${parts.join(" · ")} to request the payment status of this bill, then record the status reported and who provided it.`
|
|
1318
|
+
: "Call the Claims Administrator or Bill Review vendor for this bill, then record the status reported and who provided it.";
|
|
1319
|
+
this.report = { status: null, company: "", representativeName: "", representativeRole: "", phone: "", callReference: "", note: "" };
|
|
1320
|
+
this.panel = "report_status";
|
|
1321
|
+
}
|
|
1322
|
+
async reportStatus() {
|
|
1323
|
+
const status = this.report.status;
|
|
1324
|
+
if (!status)
|
|
1325
|
+
return;
|
|
1326
|
+
await this.store.reportBillStatus({
|
|
1327
|
+
status,
|
|
1328
|
+
...(this.report.company.trim() ? { company: this.report.company.trim() } : {}),
|
|
1329
|
+
...(this.report.representativeName.trim() ? { representativeName: this.report.representativeName.trim() } : {}),
|
|
1330
|
+
...(this.report.representativeRole.trim() ? { representativeRole: this.report.representativeRole.trim() } : {}),
|
|
1331
|
+
...(this.report.phone.trim() ? { phone: this.report.phone.trim() } : {}),
|
|
1332
|
+
...(this.report.callReference.trim() ? { callReference: this.report.callReference.trim() } : {}),
|
|
1333
|
+
...(this.report.note.trim() ? { note: this.report.note.trim() } : {}),
|
|
1334
|
+
});
|
|
1335
|
+
this.panel = "";
|
|
1336
|
+
this.notice = "Bill status reported.";
|
|
1337
|
+
}
|
|
1246
1338
|
async openAttachment(id, filename) { this.openBlob(await this.store.getAttachment(id), filename); }
|
|
1247
1339
|
async openEor(id, filename) { this.openBlob(await this.store.getEor(id), filename); }
|
|
1248
1340
|
async postPayment() { await this.store.postPayment(this.payment); this.panel = ""; this.notice = "Payment posted."; }
|
|
@@ -1258,6 +1350,18 @@ class MindBillBillLifecycleComponent {
|
|
|
1258
1350
|
return { billId: data.bill.id, bill: { id: data.bill.id, state: data.lifecycle.state } };
|
|
1259
1351
|
};
|
|
1260
1352
|
finishCorrection() { this.panel = ""; this.correctionReason = ""; this.notice = "Corrected submission sent."; }
|
|
1353
|
+
// "Submit New Bill" from a CLOSED bill: same prefilled submission form as the
|
|
1354
|
+
// correction flow, but the server keeps the closed bill closed and creates a
|
|
1355
|
+
// fresh original linked to it (both records chain in the submissions timeline).
|
|
1356
|
+
submitNewBillFromForm = async (input) => {
|
|
1357
|
+
const data = await this.store.submitNewBill({
|
|
1358
|
+
bill: input.bill,
|
|
1359
|
+
...(input.documents?.length ? { documents: input.documents } : {}),
|
|
1360
|
+
...(this.correctionReason.trim() ? { reason: this.correctionReason.trim() } : {}),
|
|
1361
|
+
});
|
|
1362
|
+
return { billId: data.bill.id, bill: { id: data.bill.id, state: data.lifecycle.state } };
|
|
1363
|
+
};
|
|
1364
|
+
finishNewBill() { this.panel = ""; this.correctionReason = ""; this.notice = "New bill submitted."; }
|
|
1261
1365
|
closeCorrectionBackdrop(event) { if (event.currentTarget === event.target)
|
|
1262
1366
|
this.panel = ""; }
|
|
1263
1367
|
prepareCorrection(data) {
|
|
@@ -1274,6 +1378,21 @@ class MindBillBillLifecycleComponent {
|
|
|
1274
1378
|
this.correctionReason = "";
|
|
1275
1379
|
this.panel = "resubmit";
|
|
1276
1380
|
}
|
|
1381
|
+
prepareNewBill(data) {
|
|
1382
|
+
this.correctionInitialBill = correctionBill(data);
|
|
1383
|
+
this.correctionAttachments = data.bill.attachments.map((attachment) => ({
|
|
1384
|
+
filename: attachment.filename,
|
|
1385
|
+
documentType: correctionDocumentType(attachment.documentType),
|
|
1386
|
+
...(attachment.description ? { description: attachment.description } : {}),
|
|
1387
|
+
...(attachment.reportType ? { reportTypeCode: attachment.reportType } : {}),
|
|
1388
|
+
loadBlob: () => this.store.getAttachment(attachment.id),
|
|
1389
|
+
...(attachment.documentType === "w9" ? { locked: true, badge: "Auto-attached" } : {}),
|
|
1390
|
+
}));
|
|
1391
|
+
// No rejection context on a closed bill — nothing to highlight.
|
|
1392
|
+
this.correctionAttentionFields = [];
|
|
1393
|
+
this.correctionReason = "";
|
|
1394
|
+
this.panel = "submit_new_bill";
|
|
1395
|
+
}
|
|
1277
1396
|
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); }
|
|
1278
1397
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: MindBillBillLifecycleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1279
1398
|
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: { billingError: "billingError" }, usesOnChanges: true, ngImport: i0, template: `
|
|
@@ -1360,6 +1479,40 @@ class MindBillBillLifecycleComponent {
|
|
|
1360
1479
|
@if (panel === 'payment') { <form class="card action-form" (submit)="$event.preventDefault(); postPayment()"><h3>Post payment</h3><label>Amount<input required type="number" min="0.01" step="0.01" [(ngModel)]="payment.amount" name="amount"></label><label>Method<select [(ngModel)]="payment.method" name="method"><option value="check">Check</option><option value="eft">EFT</option></select></label><label>Deposit date<input required type="date" [(ngModel)]="payment.depositDate" name="depositDate"></label><div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit">Post payment</button></div></form> }
|
|
1361
1480
|
@if (panel === 'review') { <form class="card action-form" (submit)="$event.preventDefault(); submitReview()"><h3>Submit Second Bill Review</h3><label>Reason<textarea required [(ngModel)]="review.reason" name="reason"></textarea></label><label>Payer claim control number<input required [(ngModel)]="review.payerClaimControlNumber" name="control"></label><label>Disputed amount<input type="number" min="0" step="0.01" [(ngModel)]="review.disputedAmount" name="disputed"></label><div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit">Submit review</button></div></form> }
|
|
1362
1481
|
@if (panel === 'close') { <form class="card action-form" (submit)="$event.preventDefault(); closeBill()"><h3>Close bill</h3><label>Reason<textarea required [(ngModel)]="closeReason" name="closeReason"></textarea></label><div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit">Close bill</button></div></form> }
|
|
1482
|
+
@if (panel === 'duplicate') {
|
|
1483
|
+
<form class="card action-form" (submit)="$event.preventDefault(); sendDuplicate()">
|
|
1484
|
+
<h3>Send duplicate bill</h3>
|
|
1485
|
+
@if (!duplicateDelivery) {
|
|
1486
|
+
<p class="muted">{{ duplicateDeliveryError || 'Loading delivery options…' }}</p>
|
|
1487
|
+
<div><button type="button" (click)="panel=''">Cancel</button>@if (duplicateDeliveryError) { <button class="primary" type="button" (click)="loadDuplicateDelivery()">Try again</button> }</div>
|
|
1488
|
+
} @else {
|
|
1489
|
+
<p class="muted">Resend the unchanged submission packet to {{ duplicateDelivery.payerName }}.</p>
|
|
1490
|
+
<label>Delivery method<select [(ngModel)]="duplicate.route" name="duplicateRoute">@for (option of duplicateRoutes(); track option.route) { <option [ngValue]="option.route">{{ option.label }}</option> }</select></label>
|
|
1491
|
+
@if (duplicate.route === 'fax') { <label>Fax number<input required [(ngModel)]="duplicate.faxNumber" name="duplicateFax" placeholder="(000) 000-0000"></label> }
|
|
1492
|
+
@if (duplicate.route === 'email') { <label>Email<input required type="email" [(ngModel)]="duplicate.email" name="duplicateEmail" placeholder="claims@payer.example"></label> }
|
|
1493
|
+
@if (duplicate.route === 'mail') { <label>Mailing address<textarea required [(ngModel)]="duplicate.mailingAddress" name="duplicateMail"></textarea></label> }
|
|
1494
|
+
<div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit" [disabled]="store.mutating() || !duplicateReady()">Send duplicate</button></div>
|
|
1495
|
+
}
|
|
1496
|
+
</form>
|
|
1497
|
+
}
|
|
1498
|
+
@if (panel === 'report_status') {
|
|
1499
|
+
<form class="card action-form" (submit)="$event.preventDefault(); reportStatus()">
|
|
1500
|
+
<h3>Report Bill Status</h3>
|
|
1501
|
+
<p class="muted">{{ reportContactSummary }}</p>
|
|
1502
|
+
<div class="report-options" role="radiogroup" aria-label="Reported bill payment status">
|
|
1503
|
+
@for (option of reportStatusOptions; track option.id) {
|
|
1504
|
+
<label class="report-option"><input type="radio" [value]="option.id" [(ngModel)]="report.status" name="reportStatus"><span><strong>{{ option.label }}</strong><small>{{ option.description }}</small></span></label>
|
|
1505
|
+
}
|
|
1506
|
+
</div>
|
|
1507
|
+
<label>Company<input [(ngModel)]="report.company" name="reportCompany"></label>
|
|
1508
|
+
<label>Name<input [(ngModel)]="report.representativeName" name="reportRepresentativeName"></label>
|
|
1509
|
+
<label>Role<input [(ngModel)]="report.representativeRole" name="reportRepresentativeRole"></label>
|
|
1510
|
+
<label>Phone Number<input [(ngModel)]="report.phone" name="reportPhone"></label>
|
|
1511
|
+
<label>Call Reference Number<input [(ngModel)]="report.callReference" name="reportCallReference"></label>
|
|
1512
|
+
<label>Message Note<textarea [(ngModel)]="report.note" name="reportNote"></textarea></label>
|
|
1513
|
+
<div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit" [disabled]="!report.status || store.mutating()">Save</button></div>
|
|
1514
|
+
</form>
|
|
1515
|
+
}
|
|
1363
1516
|
@if (panel === 'resubmit' && correctionInitialBill) {
|
|
1364
1517
|
<div class="correction-backdrop" (mousedown)="closeCorrectionBackdrop($event)">
|
|
1365
1518
|
<section class="correction-dialog" role="dialog" aria-modal="true" aria-label="Correct and resubmit">
|
|
@@ -1387,9 +1540,31 @@ class MindBillBillLifecycleComponent {
|
|
|
1387
1540
|
</section>
|
|
1388
1541
|
</div>
|
|
1389
1542
|
}
|
|
1543
|
+
@if (panel === 'submit_new_bill' && correctionInitialBill) {
|
|
1544
|
+
<div class="correction-backdrop" (mousedown)="closeCorrectionBackdrop($event)">
|
|
1545
|
+
<section class="correction-dialog" role="dialog" aria-modal="true" aria-label="Submit New Bill">
|
|
1546
|
+
<button type="button" class="dialog-close" aria-label="Close" (click)="panel=''">×</button>
|
|
1547
|
+
<header><h2>Submit New Bill</h2><p>This closed bill stays closed and keeps its record. Review the carried-over snapshot and submit a fresh bill — both bills stay linked in the submissions timeline.</p><button type="button" class="header-cancel" (click)="panel=''">Cancel</button></header>
|
|
1548
|
+
<label class="correction-note">Submission note (optional)<textarea [(ngModel)]="correctionReason" name="newBillReason" placeholder="Why is a new bill being submitted?"></textarea></label>
|
|
1549
|
+
<mindbill-bill-submission
|
|
1550
|
+
[initialBill]="correctionInitialBill"
|
|
1551
|
+
[attachments]="correctionAttachments"
|
|
1552
|
+
[appearance]="appearance"
|
|
1553
|
+
[sessionEndpoint]="sessionEndpoint"
|
|
1554
|
+
[getSession]="getSession"
|
|
1555
|
+
[apiBaseUrl]="apiBaseUrl"
|
|
1556
|
+
[submitter]="submitNewBillFromForm"
|
|
1557
|
+
heading="New bill information"
|
|
1558
|
+
description="The closed bill stays unchanged. This form submits a fresh bill linked to it."
|
|
1559
|
+
submitLabel="Submit New Bill"
|
|
1560
|
+
(submitted)="finishNewBill()"
|
|
1561
|
+
/>
|
|
1562
|
+
</section>
|
|
1563
|
+
</div>
|
|
1564
|
+
}
|
|
1390
1565
|
}
|
|
1391
1566
|
</section>
|
|
1392
|
-
`, isInline: true, styles: [":host{display:block}.mb{font-family:var(--font);color:var(--t);background:var(--bg);padding:20px}.summary,.card,.columns,.rejection{display:block;max-width:1120px;margin:0 auto 16px}.summary{display:flex;justify-content:space-between;align-items:end}.summary h2{margin:4px 0}.summary p,.muted{color:var(--m)}.eyebrow,dt{font-size:12px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--m)}.money{text-align:right}.money span{display:block;font-size:28px;font-weight:800}.money small{color:var(--m)}.card{background:var(--s);border:1px solid var(--b);border-radius:var(--r);padding:20px}.card-title{display:flex;justify-content:space-between;gap:20px}.card-title h3{margin:0}.card-title p{margin:5px 0;color:var(--m)}.progress ol{display:flex;list-style:none;padding:0;margin:0}.progress li{flex:1;text-align:center;position:relative;color:var(--m)}.progress li:before{content:\"\";position:absolute;top:16px;left:0;right:0;border-top:2px solid var(--b)}.progress li:first-child:before{left:50%}.progress li:last-child:before{right:50%}.progress b{position:relative;z-index:1;display:grid;place-items:center;width:32px;height:32px;margin:auto;border:2px solid var(--b);border-radius:50%;background:var(--s)}.progress .complete b,.progress .current b{border-color:var(--a);background:var(--a);color:var(--ac)}.progress span{display:block;margin-top:8px;font-size:12px;font-weight:700}.snapshot dl,.columns dl{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.snapshot dd,.columns dd{font-weight:700;margin:6px 0}.columns{display:grid;grid-template-columns:1fr 1fr;gap:16px}.columns .card{margin:0}.rows,.timeline{list-style:none;margin:12px 0 0;padding:0}.rows li{display:flex;justify-content:space-between;align-items:center;padding:12px 0;border-top:1px solid var(--b)}.rows small{display:block;color:var(--m);margin-top:3px}.timeline li{display:flex;gap:14px;padding:10px 0}.timeline i{width:10px;height:10px;margin-top:5px;border:3px solid var(--a);border-radius:50%}.timeline p{margin:4px 0}.timeline small{color:var(--m)}button,input,select,textarea{font:inherit;border:1px solid var(--b);border-radius:var(--cr);padding:9px 12px;background:var(--s);color:var(--t)}button{cursor:pointer;font-weight:700}.primary{background:var(--a);border-color:var(--a);color:var(--ac)}.actions{max-width:1120px;margin:0 auto;display:flex;justify-content:flex-end;gap:10px}.action-form{display:grid;gap:12px}.action-form label{display:grid;gap:5px;font-weight:700}.action-form div{display:flex;justify-content:flex-end;gap:10px}.state{max-width:720px;margin:auto;padding:32px;text-align:center}.state span{display:block;margin:8px}.error{color:#9b1c1c}.notice{max-width:1120px;margin:0 auto 12px;color:var(--m)}@media(max-width:760px){.mb{padding:12px}.summary,.columns{display:block}.money{text-align:left;margin-top:12px}.columns .card{margin-bottom:12px}.snapshot dl,.columns dl{grid-template-columns:1fr 1fr}.progress span{font-size:10px}.card{padding:15px}}.history{border:1px solid var(--b);border-radius:10px;overflow:hidden;margin-top:12px}.history-head{display:grid;grid-template-columns:96px 150px 130px minmax(0,1fr);gap:12px;padding:8px 14px;background:color-mix(in srgb,var(--b) 26%,var(--s));color:var(--m);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.history-rows{list-style:none;margin:0;padding:0}.history-rows>li{border-top:1px solid var(--b)}.history-rows>li.is-submission{background:color-mix(in srgb,var(--a) 9%,var(--s))}.history-rows>li.is-note{background:color-mix(in srgb,#f2c344 13%,var(--s))}.history-line{display:grid;grid-template-columns:96px 150px 130px minmax(0,1fr);gap:12px;width:100%;padding:10px 14px;border:0;border-radius:0;background:transparent;text-align:left;font-weight:400;cursor:default}.history-line:not(:disabled){cursor:pointer}.history-line:not(:disabled):hover .h-summary{text-decoration:underline}.h-date,.h-actor{color:var(--m);font-size:13px;overflow-wrap:anywhere}.h-action{font-weight:700;font-size:13.5px}.is-problem .h-action{color:#9b1c1c}.h-summary{display:flex;gap:7px;min-width:0;font-size:13.5px;line-height:1.45;overflow-wrap:anywhere}.h-summary i{flex:0 0 auto;margin-top:5px;width:0;height:0;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--m);border-radius:0;transition:transform .12s ease}.h-summary i.open{transform:rotate(90deg)}.history-details{padding:4px 14px 14px 122px;font-size:13.5px;line-height:1.5}.h-kv,.h-codes,.h-due dl{display:grid;gap:4px;margin:0}.h-kv>div{display:grid;grid-template-columns:180px minmax(0,1fr);gap:12px;border-top:1px solid color-mix(in srgb,var(--b) 60%,transparent);padding-top:4px}.h-kv dt,.h-codes dt,.h-due dt{font-size:13px;font-weight:700;letter-spacing:0;text-transform:none;color:var(--t)}.h-kv dd,.h-codes dd,.h-due dd{margin:0;overflow-wrap:anywhere}.h-doc{display:block}.h-codes>div{display:grid;grid-template-columns:56px minmax(0,1fr);gap:12px}.h-codes dt{font-weight:800}.h-due{margin-top:8px}.h-due em{display:block;color:var(--m);font-size:12.5px;margin-bottom:4px}.h-due dl>div{display:grid;grid-template-columns:96px minmax(0,1fr);gap:12px;border-top:1px solid color-mix(in srgb,var(--b) 60%,transparent);padding-top:4px}.h-text{margin:8px 0 0;white-space:pre-wrap}@media(max-width:760px){.history-head{display:none}.history-line{grid-template-columns:1fr;gap:2px;padding:10px 12px}.history-details{padding:4px 12px 12px}.h-kv>div,.h-due dl>div{grid-template-columns:1fr}}.correction-backdrop{position:fixed;inset:0;z-index:100;overflow:auto;background:#172b37b8;padding:28px}.correction-dialog{position:relative;max-width:1180px;margin:0 auto;background:var(--bg);border-radius:var(--r);box-shadow:0 24px 80px #0006;padding:26px}.correction-dialog>header{padding-right:48px;margin-bottom:18px}.correction-dialog h2{margin:0 0 6px}.correction-dialog p{margin:0;color:var(--m)}.dialog-close{position:absolute;right:20px;top:20px;width:40px;height:40px;padding:0;font-size:24px}.correction-reason{display:grid;gap:8px;margin-bottom:14px;border-left:4px solid #c43d3d;border-radius:8px;background:#fff5f5;padding:14px;color:#8f2525}.correction-reason span{display:block}.correction-reason b{margin-right:6px}.contact-hint{margin:0 0 14px!important;border:1px solid var(--b);border-radius:8px;background:var(--s);padding:12px!important;color:var(--t)!important}.correction-note{display:grid;gap:6px;margin-bottom:18px;font-weight:700}.correction-note textarea{min-height:76px}.correction-dialog mindbill-bill-submission{display:block}.correction-dialog .mb{padding:0}@media(max-width:760px){.correction-backdrop{padding:0}.correction-dialog{min-height:100%;border-radius:0;padding:18px 12px}.dialog-close{right:12px;top:12px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: MindBillBillRejectionNoticeComponent, selector: "mindbill-bill-rejection-notice", inputs: ["rejection", "submittedAt", "title", "appearance"] }, { kind: "component", type: MindBillBillSubmissionComponent, selector: "mindbill-bill-submission", inputs: ["initialBill", "attachments", "appearance", "sessionEndpoint", "getSession", "apiBaseUrl", "heading", "description", "submitLabel", "attentionFields", "procedureOptions", "modifierOptions", "taxonomyOptions", "submitter"], outputs: ["submitted", "submissionError", "billChange"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
1567
|
+
`, isInline: true, styles: [":host{display:block}.mb{font-family:var(--font);color:var(--t);background:var(--bg);padding:20px}.summary,.card,.columns,.rejection{display:block;max-width:1120px;margin:0 auto 16px}.summary{display:flex;justify-content:space-between;align-items:end}.summary h2{margin:4px 0}.summary p,.muted{color:var(--m)}.eyebrow,dt{font-size:12px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--m)}.money{text-align:right}.money span{display:block;font-size:28px;font-weight:800}.money small{color:var(--m)}.card{background:var(--s);border:1px solid var(--b);border-radius:var(--r);padding:20px}.card-title{display:flex;justify-content:space-between;gap:20px}.card-title h3{margin:0}.card-title p{margin:5px 0;color:var(--m)}.progress ol{display:flex;list-style:none;padding:0;margin:0}.progress li{flex:1;text-align:center;position:relative;color:var(--m)}.progress li:before{content:\"\";position:absolute;top:16px;left:0;right:0;border-top:2px solid var(--b)}.progress li:first-child:before{left:50%}.progress li:last-child:before{right:50%}.progress b{position:relative;z-index:1;display:grid;place-items:center;width:32px;height:32px;margin:auto;border:2px solid var(--b);border-radius:50%;background:var(--s)}.progress .complete b,.progress .current b{border-color:var(--a);background:var(--a);color:var(--ac)}.progress span{display:block;margin-top:8px;font-size:12px;font-weight:700}.snapshot dl,.columns dl{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.snapshot dd,.columns dd{font-weight:700;margin:6px 0}.columns{display:grid;grid-template-columns:1fr 1fr;gap:16px}.columns .card{margin:0}.rows,.timeline{list-style:none;margin:12px 0 0;padding:0}.rows li{display:flex;justify-content:space-between;align-items:center;padding:12px 0;border-top:1px solid var(--b)}.rows small{display:block;color:var(--m);margin-top:3px}.timeline li{display:flex;gap:14px;padding:10px 0}.timeline i{width:10px;height:10px;margin-top:5px;border:3px solid var(--a);border-radius:50%}.timeline p{margin:4px 0}.timeline small{color:var(--m)}button,input,select,textarea{font:inherit;border:1px solid var(--b);border-radius:var(--cr);padding:9px 12px;background:var(--s);color:var(--t)}button{cursor:pointer;font-weight:700}.primary{background:var(--a);border-color:var(--a);color:var(--ac)}.actions{max-width:1120px;margin:0 auto;display:flex;justify-content:flex-end;gap:10px}.action-form{display:grid;gap:12px}.action-form label{display:grid;gap:5px;font-weight:700}.action-form div{display:flex;justify-content:flex-end;gap:10px}.state{max-width:720px;margin:auto;padding:32px;text-align:center}.state span{display:block;margin:8px}.error{color:#9b1c1c}.notice{max-width:1120px;margin:0 auto 12px;color:var(--m)}@media(max-width:760px){.mb{padding:12px}.summary,.columns{display:block}.money{text-align:left;margin-top:12px}.columns .card{margin-bottom:12px}.snapshot dl,.columns dl{grid-template-columns:1fr 1fr}.progress span{font-size:10px}.card{padding:15px}}.history{border:1px solid var(--b);border-radius:10px;overflow:hidden;margin-top:12px}.history-head{display:grid;grid-template-columns:96px 150px 130px minmax(0,1fr);gap:12px;padding:8px 14px;background:color-mix(in srgb,var(--b) 26%,var(--s));color:var(--m);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.history-rows{list-style:none;margin:0;padding:0}.history-rows>li{border-top:1px solid var(--b)}.history-rows>li.is-submission{background:color-mix(in srgb,var(--a) 9%,var(--s))}.history-rows>li.is-note{background:color-mix(in srgb,#f2c344 13%,var(--s))}.history-line{display:grid;grid-template-columns:96px 150px 130px minmax(0,1fr);gap:12px;width:100%;padding:10px 14px;border:0;border-radius:0;background:transparent;text-align:left;font-weight:400;cursor:default}.history-line:not(:disabled){cursor:pointer}.history-line:not(:disabled):hover .h-summary{text-decoration:underline}.h-date,.h-actor{color:var(--m);font-size:13px;overflow-wrap:anywhere}.h-action{font-weight:700;font-size:13.5px}.is-problem .h-action{color:#9b1c1c}.h-summary{display:flex;gap:7px;min-width:0;font-size:13.5px;line-height:1.45;overflow-wrap:anywhere}.h-summary i{flex:0 0 auto;margin-top:5px;width:0;height:0;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--m);border-radius:0;transition:transform .12s ease}.h-summary i.open{transform:rotate(90deg)}.history-details{padding:4px 14px 14px 122px;font-size:13.5px;line-height:1.5}.h-kv,.h-codes,.h-due dl{display:grid;gap:4px;margin:0}.h-kv>div{display:grid;grid-template-columns:180px minmax(0,1fr);gap:12px;border-top:1px solid color-mix(in srgb,var(--b) 60%,transparent);padding-top:4px}.h-kv dt,.h-codes dt,.h-due dt{font-size:13px;font-weight:700;letter-spacing:0;text-transform:none;color:var(--t)}.h-kv dd,.h-codes dd,.h-due dd{margin:0;overflow-wrap:anywhere}.h-doc{display:block}.h-codes>div{display:grid;grid-template-columns:56px minmax(0,1fr);gap:12px}.h-codes dt{font-weight:800}.h-due{margin-top:8px}.h-due em{display:block;color:var(--m);font-size:12.5px;margin-bottom:4px}.h-due dl>div{display:grid;grid-template-columns:96px minmax(0,1fr);gap:12px;border-top:1px solid color-mix(in srgb,var(--b) 60%,transparent);padding-top:4px}.h-text{margin:8px 0 0;white-space:pre-wrap}@media(max-width:760px){.history-head{display:none}.history-line{grid-template-columns:1fr;gap:2px;padding:10px 12px}.history-details{padding:4px 12px 12px}.h-kv>div,.h-due dl>div{grid-template-columns:1fr}}.report-options{display:grid;gap:8px}.action-form label.report-option{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--b);border-radius:var(--cr);padding:10px 12px;font-weight:400;cursor:pointer}.report-option input{width:16px;min-height:16px;margin-top:3px;padding:0;border:0}.report-option strong{display:block;font-size:13.5px}.report-option small{display:block;color:var(--m);margin-top:2px;font-size:12.5px}.correction-backdrop{position:fixed;inset:0;z-index:100;overflow:auto;background:#172b37b8;padding:28px}.correction-dialog{position:relative;max-width:1180px;margin:0 auto;background:var(--bg);border-radius:var(--r);box-shadow:0 24px 80px #0006;padding:26px}.correction-dialog>header{padding-right:48px;margin-bottom:18px}.correction-dialog h2{margin:0 0 6px}.correction-dialog p{margin:0;color:var(--m)}.dialog-close{position:absolute;right:20px;top:20px;width:40px;height:40px;padding:0;font-size:24px}.correction-reason{display:grid;gap:8px;margin-bottom:14px;border-left:4px solid #c43d3d;border-radius:8px;background:#fff5f5;padding:14px;color:#8f2525}.correction-reason span{display:block}.correction-reason b{margin-right:6px}.contact-hint{margin:0 0 14px!important;border:1px solid var(--b);border-radius:8px;background:var(--s);padding:12px!important;color:var(--t)!important}.correction-note{display:grid;gap:6px;margin-bottom:18px;font-weight:700}.correction-note textarea{min-height:76px}.correction-dialog mindbill-bill-submission{display:block}.correction-dialog .mb{padding:0}.correction-dialog .header-cancel{margin-top:10px}@media(max-width:760px){.correction-backdrop{padding:0}.correction-dialog{min-height:100%;border-radius:0;padding:18px 12px}.dialog-close{right:12px;top:12px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: MindBillBillRejectionNoticeComponent, selector: "mindbill-bill-rejection-notice", inputs: ["rejection", "submittedAt", "title", "appearance"] }, { kind: "component", type: MindBillBillSubmissionComponent, selector: "mindbill-bill-submission", inputs: ["initialBill", "attachments", "appearance", "sessionEndpoint", "getSession", "apiBaseUrl", "heading", "description", "submitLabel", "attentionFields", "procedureOptions", "modifierOptions", "taxonomyOptions", "submitter"], outputs: ["submitted", "submissionError", "billChange"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
1393
1568
|
}
|
|
1394
1569
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: MindBillBillLifecycleComponent, decorators: [{
|
|
1395
1570
|
type: Component,
|
|
@@ -1477,6 +1652,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
1477
1652
|
@if (panel === 'payment') { <form class="card action-form" (submit)="$event.preventDefault(); postPayment()"><h3>Post payment</h3><label>Amount<input required type="number" min="0.01" step="0.01" [(ngModel)]="payment.amount" name="amount"></label><label>Method<select [(ngModel)]="payment.method" name="method"><option value="check">Check</option><option value="eft">EFT</option></select></label><label>Deposit date<input required type="date" [(ngModel)]="payment.depositDate" name="depositDate"></label><div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit">Post payment</button></div></form> }
|
|
1478
1653
|
@if (panel === 'review') { <form class="card action-form" (submit)="$event.preventDefault(); submitReview()"><h3>Submit Second Bill Review</h3><label>Reason<textarea required [(ngModel)]="review.reason" name="reason"></textarea></label><label>Payer claim control number<input required [(ngModel)]="review.payerClaimControlNumber" name="control"></label><label>Disputed amount<input type="number" min="0" step="0.01" [(ngModel)]="review.disputedAmount" name="disputed"></label><div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit">Submit review</button></div></form> }
|
|
1479
1654
|
@if (panel === 'close') { <form class="card action-form" (submit)="$event.preventDefault(); closeBill()"><h3>Close bill</h3><label>Reason<textarea required [(ngModel)]="closeReason" name="closeReason"></textarea></label><div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit">Close bill</button></div></form> }
|
|
1655
|
+
@if (panel === 'duplicate') {
|
|
1656
|
+
<form class="card action-form" (submit)="$event.preventDefault(); sendDuplicate()">
|
|
1657
|
+
<h3>Send duplicate bill</h3>
|
|
1658
|
+
@if (!duplicateDelivery) {
|
|
1659
|
+
<p class="muted">{{ duplicateDeliveryError || 'Loading delivery options…' }}</p>
|
|
1660
|
+
<div><button type="button" (click)="panel=''">Cancel</button>@if (duplicateDeliveryError) { <button class="primary" type="button" (click)="loadDuplicateDelivery()">Try again</button> }</div>
|
|
1661
|
+
} @else {
|
|
1662
|
+
<p class="muted">Resend the unchanged submission packet to {{ duplicateDelivery.payerName }}.</p>
|
|
1663
|
+
<label>Delivery method<select [(ngModel)]="duplicate.route" name="duplicateRoute">@for (option of duplicateRoutes(); track option.route) { <option [ngValue]="option.route">{{ option.label }}</option> }</select></label>
|
|
1664
|
+
@if (duplicate.route === 'fax') { <label>Fax number<input required [(ngModel)]="duplicate.faxNumber" name="duplicateFax" placeholder="(000) 000-0000"></label> }
|
|
1665
|
+
@if (duplicate.route === 'email') { <label>Email<input required type="email" [(ngModel)]="duplicate.email" name="duplicateEmail" placeholder="claims@payer.example"></label> }
|
|
1666
|
+
@if (duplicate.route === 'mail') { <label>Mailing address<textarea required [(ngModel)]="duplicate.mailingAddress" name="duplicateMail"></textarea></label> }
|
|
1667
|
+
<div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit" [disabled]="store.mutating() || !duplicateReady()">Send duplicate</button></div>
|
|
1668
|
+
}
|
|
1669
|
+
</form>
|
|
1670
|
+
}
|
|
1671
|
+
@if (panel === 'report_status') {
|
|
1672
|
+
<form class="card action-form" (submit)="$event.preventDefault(); reportStatus()">
|
|
1673
|
+
<h3>Report Bill Status</h3>
|
|
1674
|
+
<p class="muted">{{ reportContactSummary }}</p>
|
|
1675
|
+
<div class="report-options" role="radiogroup" aria-label="Reported bill payment status">
|
|
1676
|
+
@for (option of reportStatusOptions; track option.id) {
|
|
1677
|
+
<label class="report-option"><input type="radio" [value]="option.id" [(ngModel)]="report.status" name="reportStatus"><span><strong>{{ option.label }}</strong><small>{{ option.description }}</small></span></label>
|
|
1678
|
+
}
|
|
1679
|
+
</div>
|
|
1680
|
+
<label>Company<input [(ngModel)]="report.company" name="reportCompany"></label>
|
|
1681
|
+
<label>Name<input [(ngModel)]="report.representativeName" name="reportRepresentativeName"></label>
|
|
1682
|
+
<label>Role<input [(ngModel)]="report.representativeRole" name="reportRepresentativeRole"></label>
|
|
1683
|
+
<label>Phone Number<input [(ngModel)]="report.phone" name="reportPhone"></label>
|
|
1684
|
+
<label>Call Reference Number<input [(ngModel)]="report.callReference" name="reportCallReference"></label>
|
|
1685
|
+
<label>Message Note<textarea [(ngModel)]="report.note" name="reportNote"></textarea></label>
|
|
1686
|
+
<div><button type="button" (click)="panel=''">Cancel</button><button class="primary" type="submit" [disabled]="!report.status || store.mutating()">Save</button></div>
|
|
1687
|
+
</form>
|
|
1688
|
+
}
|
|
1480
1689
|
@if (panel === 'resubmit' && correctionInitialBill) {
|
|
1481
1690
|
<div class="correction-backdrop" (mousedown)="closeCorrectionBackdrop($event)">
|
|
1482
1691
|
<section class="correction-dialog" role="dialog" aria-modal="true" aria-label="Correct and resubmit">
|
|
@@ -1504,9 +1713,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImpo
|
|
|
1504
1713
|
</section>
|
|
1505
1714
|
</div>
|
|
1506
1715
|
}
|
|
1716
|
+
@if (panel === 'submit_new_bill' && correctionInitialBill) {
|
|
1717
|
+
<div class="correction-backdrop" (mousedown)="closeCorrectionBackdrop($event)">
|
|
1718
|
+
<section class="correction-dialog" role="dialog" aria-modal="true" aria-label="Submit New Bill">
|
|
1719
|
+
<button type="button" class="dialog-close" aria-label="Close" (click)="panel=''">×</button>
|
|
1720
|
+
<header><h2>Submit New Bill</h2><p>This closed bill stays closed and keeps its record. Review the carried-over snapshot and submit a fresh bill — both bills stay linked in the submissions timeline.</p><button type="button" class="header-cancel" (click)="panel=''">Cancel</button></header>
|
|
1721
|
+
<label class="correction-note">Submission note (optional)<textarea [(ngModel)]="correctionReason" name="newBillReason" placeholder="Why is a new bill being submitted?"></textarea></label>
|
|
1722
|
+
<mindbill-bill-submission
|
|
1723
|
+
[initialBill]="correctionInitialBill"
|
|
1724
|
+
[attachments]="correctionAttachments"
|
|
1725
|
+
[appearance]="appearance"
|
|
1726
|
+
[sessionEndpoint]="sessionEndpoint"
|
|
1727
|
+
[getSession]="getSession"
|
|
1728
|
+
[apiBaseUrl]="apiBaseUrl"
|
|
1729
|
+
[submitter]="submitNewBillFromForm"
|
|
1730
|
+
heading="New bill information"
|
|
1731
|
+
description="The closed bill stays unchanged. This form submits a fresh bill linked to it."
|
|
1732
|
+
submitLabel="Submit New Bill"
|
|
1733
|
+
(submitted)="finishNewBill()"
|
|
1734
|
+
/>
|
|
1735
|
+
</section>
|
|
1736
|
+
</div>
|
|
1737
|
+
}
|
|
1507
1738
|
}
|
|
1508
1739
|
</section>
|
|
1509
|
-
`, styles: [":host{display:block}.mb{font-family:var(--font);color:var(--t);background:var(--bg);padding:20px}.summary,.card,.columns,.rejection{display:block;max-width:1120px;margin:0 auto 16px}.summary{display:flex;justify-content:space-between;align-items:end}.summary h2{margin:4px 0}.summary p,.muted{color:var(--m)}.eyebrow,dt{font-size:12px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--m)}.money{text-align:right}.money span{display:block;font-size:28px;font-weight:800}.money small{color:var(--m)}.card{background:var(--s);border:1px solid var(--b);border-radius:var(--r);padding:20px}.card-title{display:flex;justify-content:space-between;gap:20px}.card-title h3{margin:0}.card-title p{margin:5px 0;color:var(--m)}.progress ol{display:flex;list-style:none;padding:0;margin:0}.progress li{flex:1;text-align:center;position:relative;color:var(--m)}.progress li:before{content:\"\";position:absolute;top:16px;left:0;right:0;border-top:2px solid var(--b)}.progress li:first-child:before{left:50%}.progress li:last-child:before{right:50%}.progress b{position:relative;z-index:1;display:grid;place-items:center;width:32px;height:32px;margin:auto;border:2px solid var(--b);border-radius:50%;background:var(--s)}.progress .complete b,.progress .current b{border-color:var(--a);background:var(--a);color:var(--ac)}.progress span{display:block;margin-top:8px;font-size:12px;font-weight:700}.snapshot dl,.columns dl{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.snapshot dd,.columns dd{font-weight:700;margin:6px 0}.columns{display:grid;grid-template-columns:1fr 1fr;gap:16px}.columns .card{margin:0}.rows,.timeline{list-style:none;margin:12px 0 0;padding:0}.rows li{display:flex;justify-content:space-between;align-items:center;padding:12px 0;border-top:1px solid var(--b)}.rows small{display:block;color:var(--m);margin-top:3px}.timeline li{display:flex;gap:14px;padding:10px 0}.timeline i{width:10px;height:10px;margin-top:5px;border:3px solid var(--a);border-radius:50%}.timeline p{margin:4px 0}.timeline small{color:var(--m)}button,input,select,textarea{font:inherit;border:1px solid var(--b);border-radius:var(--cr);padding:9px 12px;background:var(--s);color:var(--t)}button{cursor:pointer;font-weight:700}.primary{background:var(--a);border-color:var(--a);color:var(--ac)}.actions{max-width:1120px;margin:0 auto;display:flex;justify-content:flex-end;gap:10px}.action-form{display:grid;gap:12px}.action-form label{display:grid;gap:5px;font-weight:700}.action-form div{display:flex;justify-content:flex-end;gap:10px}.state{max-width:720px;margin:auto;padding:32px;text-align:center}.state span{display:block;margin:8px}.error{color:#9b1c1c}.notice{max-width:1120px;margin:0 auto 12px;color:var(--m)}@media(max-width:760px){.mb{padding:12px}.summary,.columns{display:block}.money{text-align:left;margin-top:12px}.columns .card{margin-bottom:12px}.snapshot dl,.columns dl{grid-template-columns:1fr 1fr}.progress span{font-size:10px}.card{padding:15px}}.history{border:1px solid var(--b);border-radius:10px;overflow:hidden;margin-top:12px}.history-head{display:grid;grid-template-columns:96px 150px 130px minmax(0,1fr);gap:12px;padding:8px 14px;background:color-mix(in srgb,var(--b) 26%,var(--s));color:var(--m);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.history-rows{list-style:none;margin:0;padding:0}.history-rows>li{border-top:1px solid var(--b)}.history-rows>li.is-submission{background:color-mix(in srgb,var(--a) 9%,var(--s))}.history-rows>li.is-note{background:color-mix(in srgb,#f2c344 13%,var(--s))}.history-line{display:grid;grid-template-columns:96px 150px 130px minmax(0,1fr);gap:12px;width:100%;padding:10px 14px;border:0;border-radius:0;background:transparent;text-align:left;font-weight:400;cursor:default}.history-line:not(:disabled){cursor:pointer}.history-line:not(:disabled):hover .h-summary{text-decoration:underline}.h-date,.h-actor{color:var(--m);font-size:13px;overflow-wrap:anywhere}.h-action{font-weight:700;font-size:13.5px}.is-problem .h-action{color:#9b1c1c}.h-summary{display:flex;gap:7px;min-width:0;font-size:13.5px;line-height:1.45;overflow-wrap:anywhere}.h-summary i{flex:0 0 auto;margin-top:5px;width:0;height:0;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--m);border-radius:0;transition:transform .12s ease}.h-summary i.open{transform:rotate(90deg)}.history-details{padding:4px 14px 14px 122px;font-size:13.5px;line-height:1.5}.h-kv,.h-codes,.h-due dl{display:grid;gap:4px;margin:0}.h-kv>div{display:grid;grid-template-columns:180px minmax(0,1fr);gap:12px;border-top:1px solid color-mix(in srgb,var(--b) 60%,transparent);padding-top:4px}.h-kv dt,.h-codes dt,.h-due dt{font-size:13px;font-weight:700;letter-spacing:0;text-transform:none;color:var(--t)}.h-kv dd,.h-codes dd,.h-due dd{margin:0;overflow-wrap:anywhere}.h-doc{display:block}.h-codes>div{display:grid;grid-template-columns:56px minmax(0,1fr);gap:12px}.h-codes dt{font-weight:800}.h-due{margin-top:8px}.h-due em{display:block;color:var(--m);font-size:12.5px;margin-bottom:4px}.h-due dl>div{display:grid;grid-template-columns:96px minmax(0,1fr);gap:12px;border-top:1px solid color-mix(in srgb,var(--b) 60%,transparent);padding-top:4px}.h-text{margin:8px 0 0;white-space:pre-wrap}@media(max-width:760px){.history-head{display:none}.history-line{grid-template-columns:1fr;gap:2px;padding:10px 12px}.history-details{padding:4px 12px 12px}.h-kv>div,.h-due dl>div{grid-template-columns:1fr}}.correction-backdrop{position:fixed;inset:0;z-index:100;overflow:auto;background:#172b37b8;padding:28px}.correction-dialog{position:relative;max-width:1180px;margin:0 auto;background:var(--bg);border-radius:var(--r);box-shadow:0 24px 80px #0006;padding:26px}.correction-dialog>header{padding-right:48px;margin-bottom:18px}.correction-dialog h2{margin:0 0 6px}.correction-dialog p{margin:0;color:var(--m)}.dialog-close{position:absolute;right:20px;top:20px;width:40px;height:40px;padding:0;font-size:24px}.correction-reason{display:grid;gap:8px;margin-bottom:14px;border-left:4px solid #c43d3d;border-radius:8px;background:#fff5f5;padding:14px;color:#8f2525}.correction-reason span{display:block}.correction-reason b{margin-right:6px}.contact-hint{margin:0 0 14px!important;border:1px solid var(--b);border-radius:8px;background:var(--s);padding:12px!important;color:var(--t)!important}.correction-note{display:grid;gap:6px;margin-bottom:18px;font-weight:700}.correction-note textarea{min-height:76px}.correction-dialog mindbill-bill-submission{display:block}.correction-dialog .mb{padding:0}@media(max-width:760px){.correction-backdrop{padding:0}.correction-dialog{min-height:100%;border-radius:0;padding:18px 12px}.dialog-close{right:12px;top:12px}}\n"] }]
|
|
1740
|
+
`, styles: [":host{display:block}.mb{font-family:var(--font);color:var(--t);background:var(--bg);padding:20px}.summary,.card,.columns,.rejection{display:block;max-width:1120px;margin:0 auto 16px}.summary{display:flex;justify-content:space-between;align-items:end}.summary h2{margin:4px 0}.summary p,.muted{color:var(--m)}.eyebrow,dt{font-size:12px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--m)}.money{text-align:right}.money span{display:block;font-size:28px;font-weight:800}.money small{color:var(--m)}.card{background:var(--s);border:1px solid var(--b);border-radius:var(--r);padding:20px}.card-title{display:flex;justify-content:space-between;gap:20px}.card-title h3{margin:0}.card-title p{margin:5px 0;color:var(--m)}.progress ol{display:flex;list-style:none;padding:0;margin:0}.progress li{flex:1;text-align:center;position:relative;color:var(--m)}.progress li:before{content:\"\";position:absolute;top:16px;left:0;right:0;border-top:2px solid var(--b)}.progress li:first-child:before{left:50%}.progress li:last-child:before{right:50%}.progress b{position:relative;z-index:1;display:grid;place-items:center;width:32px;height:32px;margin:auto;border:2px solid var(--b);border-radius:50%;background:var(--s)}.progress .complete b,.progress .current b{border-color:var(--a);background:var(--a);color:var(--ac)}.progress span{display:block;margin-top:8px;font-size:12px;font-weight:700}.snapshot dl,.columns dl{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.snapshot dd,.columns dd{font-weight:700;margin:6px 0}.columns{display:grid;grid-template-columns:1fr 1fr;gap:16px}.columns .card{margin:0}.rows,.timeline{list-style:none;margin:12px 0 0;padding:0}.rows li{display:flex;justify-content:space-between;align-items:center;padding:12px 0;border-top:1px solid var(--b)}.rows small{display:block;color:var(--m);margin-top:3px}.timeline li{display:flex;gap:14px;padding:10px 0}.timeline i{width:10px;height:10px;margin-top:5px;border:3px solid var(--a);border-radius:50%}.timeline p{margin:4px 0}.timeline small{color:var(--m)}button,input,select,textarea{font:inherit;border:1px solid var(--b);border-radius:var(--cr);padding:9px 12px;background:var(--s);color:var(--t)}button{cursor:pointer;font-weight:700}.primary{background:var(--a);border-color:var(--a);color:var(--ac)}.actions{max-width:1120px;margin:0 auto;display:flex;justify-content:flex-end;gap:10px}.action-form{display:grid;gap:12px}.action-form label{display:grid;gap:5px;font-weight:700}.action-form div{display:flex;justify-content:flex-end;gap:10px}.state{max-width:720px;margin:auto;padding:32px;text-align:center}.state span{display:block;margin:8px}.error{color:#9b1c1c}.notice{max-width:1120px;margin:0 auto 12px;color:var(--m)}@media(max-width:760px){.mb{padding:12px}.summary,.columns{display:block}.money{text-align:left;margin-top:12px}.columns .card{margin-bottom:12px}.snapshot dl,.columns dl{grid-template-columns:1fr 1fr}.progress span{font-size:10px}.card{padding:15px}}.history{border:1px solid var(--b);border-radius:10px;overflow:hidden;margin-top:12px}.history-head{display:grid;grid-template-columns:96px 150px 130px minmax(0,1fr);gap:12px;padding:8px 14px;background:color-mix(in srgb,var(--b) 26%,var(--s));color:var(--m);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.history-rows{list-style:none;margin:0;padding:0}.history-rows>li{border-top:1px solid var(--b)}.history-rows>li.is-submission{background:color-mix(in srgb,var(--a) 9%,var(--s))}.history-rows>li.is-note{background:color-mix(in srgb,#f2c344 13%,var(--s))}.history-line{display:grid;grid-template-columns:96px 150px 130px minmax(0,1fr);gap:12px;width:100%;padding:10px 14px;border:0;border-radius:0;background:transparent;text-align:left;font-weight:400;cursor:default}.history-line:not(:disabled){cursor:pointer}.history-line:not(:disabled):hover .h-summary{text-decoration:underline}.h-date,.h-actor{color:var(--m);font-size:13px;overflow-wrap:anywhere}.h-action{font-weight:700;font-size:13.5px}.is-problem .h-action{color:#9b1c1c}.h-summary{display:flex;gap:7px;min-width:0;font-size:13.5px;line-height:1.45;overflow-wrap:anywhere}.h-summary i{flex:0 0 auto;margin-top:5px;width:0;height:0;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--m);border-radius:0;transition:transform .12s ease}.h-summary i.open{transform:rotate(90deg)}.history-details{padding:4px 14px 14px 122px;font-size:13.5px;line-height:1.5}.h-kv,.h-codes,.h-due dl{display:grid;gap:4px;margin:0}.h-kv>div{display:grid;grid-template-columns:180px minmax(0,1fr);gap:12px;border-top:1px solid color-mix(in srgb,var(--b) 60%,transparent);padding-top:4px}.h-kv dt,.h-codes dt,.h-due dt{font-size:13px;font-weight:700;letter-spacing:0;text-transform:none;color:var(--t)}.h-kv dd,.h-codes dd,.h-due dd{margin:0;overflow-wrap:anywhere}.h-doc{display:block}.h-codes>div{display:grid;grid-template-columns:56px minmax(0,1fr);gap:12px}.h-codes dt{font-weight:800}.h-due{margin-top:8px}.h-due em{display:block;color:var(--m);font-size:12.5px;margin-bottom:4px}.h-due dl>div{display:grid;grid-template-columns:96px minmax(0,1fr);gap:12px;border-top:1px solid color-mix(in srgb,var(--b) 60%,transparent);padding-top:4px}.h-text{margin:8px 0 0;white-space:pre-wrap}@media(max-width:760px){.history-head{display:none}.history-line{grid-template-columns:1fr;gap:2px;padding:10px 12px}.history-details{padding:4px 12px 12px}.h-kv>div,.h-due dl>div{grid-template-columns:1fr}}.report-options{display:grid;gap:8px}.action-form label.report-option{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--b);border-radius:var(--cr);padding:10px 12px;font-weight:400;cursor:pointer}.report-option input{width:16px;min-height:16px;margin-top:3px;padding:0;border:0}.report-option strong{display:block;font-size:13.5px}.report-option small{display:block;color:var(--m);margin-top:2px;font-size:12.5px}.correction-backdrop{position:fixed;inset:0;z-index:100;overflow:auto;background:#172b37b8;padding:28px}.correction-dialog{position:relative;max-width:1180px;margin:0 auto;background:var(--bg);border-radius:var(--r);box-shadow:0 24px 80px #0006;padding:26px}.correction-dialog>header{padding-right:48px;margin-bottom:18px}.correction-dialog h2{margin:0 0 6px}.correction-dialog p{margin:0;color:var(--m)}.dialog-close{position:absolute;right:20px;top:20px;width:40px;height:40px;padding:0;font-size:24px}.correction-reason{display:grid;gap:8px;margin-bottom:14px;border-left:4px solid #c43d3d;border-radius:8px;background:#fff5f5;padding:14px;color:#8f2525}.correction-reason span{display:block}.correction-reason b{margin-right:6px}.contact-hint{margin:0 0 14px!important;border:1px solid var(--b);border-radius:8px;background:var(--s);padding:12px!important;color:var(--t)!important}.correction-note{display:grid;gap:6px;margin-bottom:18px;font-weight:700}.correction-note textarea{min-height:76px}.correction-dialog mindbill-bill-submission{display:block}.correction-dialog .mb{padding:0}.correction-dialog .header-cancel{margin-top:10px}@media(max-width:760px){.correction-backdrop{padding:0}.correction-dialog{min-height:100%;border-radius:0;padding:18px 12px}.dialog-close{right:12px;top:12px}}\n"] }]
|
|
1510
1741
|
}], ctorParameters: () => [], propDecorators: { billId: [{
|
|
1511
1742
|
type: Input
|
|
1512
1743
|
}], sessionEndpoint: [{
|