feat: batch eligibility, batch claim, and batch check+claim from AI chat
- Add batch_eligibility, batch_claim, and batch_check_and_claim intents to AI classifier so multiple patients can be processed one by one - Add queue processing on insurance-status and claims pages to auto-start the next patient after each check/claim completes - Make patient schema firstName, lastName, phone optional so patients can be created with just member ID + DOB from eligibility checks - Cancel buttons now preserve chat history instead of clearing it - Patient-found card shows Check Eligibility, Eligibility & Appointment Today, and Cancel buttons - Claim service date asks user to pick between latest appointment and today when they differ - Login page subtitle styled with animated gradient Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -911,6 +911,79 @@ export default function ClaimsPage() {
|
||||
}
|
||||
}
|
||||
} catch {}
|
||||
|
||||
// If a chatbot batch check+claim queue is pending, navigate to eligibility for the next patient
|
||||
try {
|
||||
const raw = sessionStorage.getItem("chatbot_check_claim_queue");
|
||||
if (raw) {
|
||||
const parsed = JSON.parse(raw);
|
||||
const remaining = parsed?.remaining as any[] | undefined;
|
||||
const matchedCodes = parsed?.matchedCodes ?? [];
|
||||
const renderingProvider = parsed?.renderingProvider ?? null;
|
||||
if (remaining && remaining.length > 0) {
|
||||
const [next, ...rest] = remaining;
|
||||
if (rest.length > 0) {
|
||||
sessionStorage.setItem("chatbot_check_claim_queue", JSON.stringify({ remaining: rest, matchedCodes, renderingProvider }));
|
||||
} else {
|
||||
sessionStorage.removeItem("chatbot_check_claim_queue");
|
||||
}
|
||||
sessionStorage.setItem("chatbot_claim_codes", JSON.stringify({
|
||||
codes: matchedCodes,
|
||||
siteKey: next.siteKey,
|
||||
patientId: next.patient?.id ?? null,
|
||||
memberId: next.memberId,
|
||||
dob: next.dob,
|
||||
serviceDate: null,
|
||||
renderingProvider,
|
||||
}));
|
||||
sessionStorage.setItem("chatbot_eligibility", JSON.stringify({
|
||||
memberId: next.memberId,
|
||||
dob: next.dob,
|
||||
autoCheck: next.autoCheck,
|
||||
}));
|
||||
setTimeout(() => {
|
||||
window.dispatchEvent(new CustomEvent("chatbot:eligibility-prefill"));
|
||||
setWouterLocation("/insurance-status");
|
||||
}, 500);
|
||||
return;
|
||||
}
|
||||
sessionStorage.removeItem("chatbot_check_claim_queue");
|
||||
}
|
||||
} catch {}
|
||||
|
||||
// If a chatbot batch claim queue is pending, open the next patient
|
||||
try {
|
||||
const raw = sessionStorage.getItem("chatbot_claim_queue");
|
||||
if (raw) {
|
||||
const parsed = JSON.parse(raw);
|
||||
const remaining = parsed?.remaining as any[] | undefined;
|
||||
const matchedCodes = parsed?.matchedCodes ?? [];
|
||||
const renderingProvider = parsed?.renderingProvider ?? null;
|
||||
if (remaining && remaining.length > 0) {
|
||||
const [next, ...rest] = remaining;
|
||||
if (rest.length > 0) {
|
||||
sessionStorage.setItem("chatbot_claim_queue", JSON.stringify({ remaining: rest, matchedCodes, renderingProvider }));
|
||||
} else {
|
||||
sessionStorage.removeItem("chatbot_claim_queue");
|
||||
}
|
||||
if (next.patient?.id && matchedCodes.length > 0) {
|
||||
sessionStorage.setItem("chatbot_claim_prefill", JSON.stringify({
|
||||
codes: matchedCodes,
|
||||
siteKey: next.siteKey,
|
||||
serviceDate: next.serviceDate,
|
||||
autoSubmit: true,
|
||||
renderingProvider,
|
||||
dob: next.patient.dateOfBirth ?? null,
|
||||
}));
|
||||
}
|
||||
setTimeout(() => {
|
||||
setWouterLocation(`/claims?newPatient=${next.patient.id}`);
|
||||
}, 500);
|
||||
return;
|
||||
}
|
||||
sessionStorage.removeItem("chatbot_claim_queue");
|
||||
}
|
||||
} catch {}
|
||||
};
|
||||
|
||||
// Pre Auth section
|
||||
|
||||
Reference in New Issue
Block a user