feat: add Deltains claim submission flow

Adds a full "Deltains Claim" button next to Delta MA Claim, mirroring
the DDMA claim flow across frontend, backend queue/routes, and a new
Selenium worker. Reuses the existing Deltains eligibility login/OTP
code and was iteratively wired against the live portal (patient roster
search, per-service-line fields, tooth number/surface selects, review
and submit). Also fixes chatbot/insurance-alias carrier recognition so
"deltains" resolves correctly instead of falling back to MassHealth.
This commit is contained in:
2026-09-17 13:11:58 -04:00
parent 8cbdba092d
commit 37695130d3
14 changed files with 1769 additions and 1 deletions
+47
View File
@@ -23,6 +23,7 @@ import helpers_cca_eligibility as hcca
import helpers_cca_claim as hcca_claim
import helpers_cca_preauth as hcca_preauth
import helpers_ddma_claim as hddma_claim
import helpers_deltains_claim as hdeltains_claim
import helpers_uniteddh_claim as huniteddh_claim
import helpers_uniteddh_preauth as huniteddh_preauth
import helpers_tuftssco_claim as htuftssco_claim
@@ -749,6 +750,48 @@ async def ddma_claim(request: Request):
return {"status": "started", "session_id": sid}
async def _deltains_claim_worker_wrapper(sid: str, data: dict, url: str):
"""Background worker for Deltains claim submission."""
global active_jobs, waiting_jobs
async with semaphore:
async with lock:
waiting_jobs -= 1
active_jobs += 1
try:
await hdeltains_claim.start_deltains_claim_run(sid, data, url)
finally:
async with lock:
active_jobs -= 1
@app.post("/deltains-claim")
async def deltains_claim(request: Request):
"""
Starts a Deltains claim submission session in the background.
Logs in, searches patient, opens the member's eligibility/benefits page,
finds the claim-submission entry point, fills service lines, and submits.
Body: { "claim": { "deltainsUsername": "...", "deltainsPassword": "...", ... } }
Returns: { status: "started", session_id: "<uuid>" }
"""
global waiting_jobs
body = await request.json()
sid = hdeltains_claim.make_session_entry()
hdeltains_claim.sessions[sid]["type"] = "deltains_claim"
hdeltains_claim.sessions[sid]["last_activity"] = time.time()
async with lock:
waiting_jobs += 1
asyncio.create_task(_deltains_claim_worker_wrapper(
sid, body,
url="https://www.deltadentalins.com/ciam/login?TARGET=%2Fprovider-tools%2Fv2"
))
return {"status": "started", "session_id": sid}
async def _uniteddh_claim_worker_wrapper(sid: str, data: dict, url: str):
"""Background worker for United/DentalHub claim submission."""
global active_jobs, waiting_jobs
@@ -1025,6 +1068,8 @@ async def submit_otp(request: Request):
res = hdentaquest.submit_otp(sid, otp)
elif sid in hddma_claim.sessions:
res = hddma_claim.submit_otp(sid, otp)
elif sid in hdeltains_claim.sessions:
res = hdeltains_claim.submit_otp(sid, otp)
elif sid in huniteddh_claim.sessions:
res = huniteddh_claim.submit_otp(sid, otp)
elif sid in huniteddh_preauth.sessions:
@@ -1066,6 +1111,8 @@ async def session_status(sid: str):
s = hcca_preauth.get_session_status(sid)
elif sid in hddma_claim.sessions:
s = hddma_claim.get_session_status(sid)
elif sid in hdeltains_claim.sessions:
s = hdeltains_claim.get_session_status(sid)
elif sid in huniteddh_claim.sessions:
s = huniteddh_claim.get_session_status(sid)
elif sid in huniteddh_preauth.sessions: