healthcare: optional surrogate-access intake question (expedited path)

- NpiIntakeStep: add positively-framed 'can you grant electronic I&A Surrogate
  access?' question for all filing slugs (reval/reactivation/nppes-update/
  enrollment/bundle). Optional, never required, never mentions paper; captured
  as intake_data.surrogate_access (yes/no/blank). Astro build green (58 pages).
- npi_provider.py: surface the surrogate answer in the admin todo so fulfillment
  knows EXPEDITED (online via surrogate) vs STANDARD (e-sign + daily mail batch).
This commit is contained in:
justin 2026-06-07 00:33:33 -05:00
parent 138fec17e9
commit 7ea18dd3d8
2 changed files with 39 additions and 6 deletions

View file

@ -159,6 +159,7 @@ class _BaseNPIHandler:
specialty = intake.get("specialty", "") specialty = intake.get("specialty", "")
practice_state = intake.get("practice_state", "") practice_state = intake.get("practice_state", "")
pecos_id = intake.get("pecos_enrollment_id", "") pecos_id = intake.get("pecos_enrollment_id", "")
surrogate = (intake.get("surrogate_access") or "").lower()
customer_email = ( customer_email = (
intake.get("email") intake.get("email")
or order_data.get("customer_email") or order_data.get("customer_email")
@ -178,6 +179,11 @@ class _BaseNPIHandler:
LOG.error("[%s] CMS-855 generation failed: %s", order_number, exc) LOG.error("[%s] CMS-855 generation failed: %s", order_number, exc)
filing_note = f"CMS-855 auto-generation FAILED ({exc}); prepare the form manually." filing_note = f"CMS-855 auto-generation FAILED ({exc}); prepare the form manually."
surrogate_label = {
"yes": "YES — client can grant I&A Surrogate access -> file the EXPEDITED way (online via surrogate).",
"no": "NO — client declined surrogate -> use the STANDARD path (prepare form, e-sign, daily mail batch).",
}.get(surrogate, "UNDECIDED — confirm with client; default to STANDARD path if not granted.")
description = ( description = (
f"{meta['action']}\n\n" f"{meta['action']}\n\n"
f"Provider: {provider}\n" f"Provider: {provider}\n"
@ -185,12 +191,14 @@ class _BaseNPIHandler:
f"PECOS Enrollment ID: {pecos_id or 'not provided'}\n" f"PECOS Enrollment ID: {pecos_id or 'not provided'}\n"
f"Specialty: {specialty or 'not provided'}\n" f"Specialty: {specialty or 'not provided'}\n"
f"Practice state: {practice_state or 'not provided'}\n" f"Practice state: {practice_state or 'not provided'}\n"
f"Surrogate access (expedited): {surrogate_label}\n"
f"Portal: {meta['portal']}\n" f"Portal: {meta['portal']}\n"
f"Access model: {meta['access']}\n" f"Access model: {meta['access']}\n"
+ (f"\n{filing_note}\n" if filing_note else "") + (f"\n{filing_note}\n" if filing_note else "")
+ "\nReview-staged: complete/verify the form, get it signed, then " + "\nReview-staged: complete/verify the form, get it signed, then "
"submit it to the provider's MAC (standard), or file in " "submit it (STANDARD: signed form joins the daily mail batch to the "
"PECOS if surrogate access was granted). Mark this order complete." "provider's MAC; EXPEDITED: file in PECOS/NPPES via the granted "
"surrogate access). Mark this order complete."
) )
self._create_todo( self._create_todo(

View file

@ -62,6 +62,27 @@
<input type="number" id="npi-staff-count" min="0" placeholder="e.g. 5" /></label> <input type="number" id="npi-staff-count" min="0" placeholder="e.g. 5" /></label>
</div> </div>
</div> </div>
<!-- Optional: speed it up via electronic surrogate access. Shown for filing
services (not pure screening). Framed positively; never required, never
mentions any alternative. -->
<div id="npi-sec-surrogate" hidden>
<h3>Optional: speed up your filing</h3>
<p class="pw-help" style="margin:0 0 0.5rem;">
If you can electronically grant us <strong>CMS Identity &amp; Access
(I&amp;A) Surrogate</strong> access for your NPI, we can file faster &mdash;
it cuts steps on our end. You never share your password, and it's never
required; we'll handle your filing either way.
</p>
<div class="pw-row">
<label class="pw-field"><span>Can you grant electronic Surrogate access?</span>
<select id="npi-surrogate-access">
<option value="">Not sure / decide later</option>
<option value="yes">Yes &mdash; I can grant Surrogate access (faster)</option>
<option value="no">No &mdash; please just handle it for me</option>
</select></label>
</div>
</div>
</div> </div>
<div id="pw-npi-errors" class="pw-err" hidden></div> <div id="pw-npi-errors" class="pw-err" hidden></div>
@ -90,12 +111,14 @@
// Which extra sections to show per slug. // Which extra sections to show per slug.
const NPI_SECTIONS = { const NPI_SECTIONS = {
"npi-reactivation": ["npi-sec-reactivation"], "npi-revalidation": ["npi-sec-surrogate"],
"nppes-update": ["npi-sec-nppes"], "npi-reactivation": ["npi-sec-reactivation", "npi-sec-surrogate"],
"nppes-update": ["npi-sec-nppes", "npi-sec-surrogate"],
"medicare-enrollment": ["npi-sec-surrogate"],
"oig-sam-screening": ["npi-sec-screening"], "oig-sam-screening": ["npi-sec-screening"],
"provider-compliance-bundle": ["npi-sec-screening"], "provider-compliance-bundle": ["npi-sec-screening", "npi-sec-surrogate"],
}; };
const ALL_NPI_SECTIONS = ["npi-sec-reactivation","npi-sec-nppes","npi-sec-screening"]; const ALL_NPI_SECTIONS = ["npi-sec-reactivation","npi-sec-nppes","npi-sec-screening","npi-sec-surrogate"];
function showNpiSections() { function showNpiSections() {
const PW = window.PWIntake; const PW = window.PWIntake;
@ -134,6 +157,7 @@
"npi-fields-to-update": d.fields_to_update || "", "npi-fields-to-update": d.fields_to_update || "",
"npi-org-name": d.organization_name || "", "npi-org-name": d.organization_name || "",
"npi-staff-count": d.staff_count || "", "npi-staff-count": d.staff_count || "",
"npi-surrogate-access": d.surrogate_access || "",
}; };
for (const [id, val] of Object.entries(map)) { for (const [id, val] of Object.entries(map)) {
const el = document.getElementById(id); const el = document.getElementById(id);
@ -186,6 +210,7 @@
fields_to_update: val("npi-fields-to-update"), fields_to_update: val("npi-fields-to-update"),
organization_name: val("npi-org-name"), organization_name: val("npi-org-name"),
staff_count: val("npi-staff-count"), staff_count: val("npi-staff-count"),
surrogate_access: val("npi-surrogate-access"),
}}); }});
}); });