healthcare: two-tier (standard paper / expedited surrogate) filing model
- Verified Standard(no-login)/Expedited(surrogate) matrix from official CMS-855 PDFs (docs/healthcare-filing-tiers-verified.md): reactivation+revalidation are 855I paper-to-MAC reasons, original-signature, routed by state; sig may not be delegated; 855B needs PECOS app fee. - Add scripts/workers/mac_routing.py: state->MAC routing (all 56 jurisdictions, 12 destinations) for envelope addressing + daily batch grouping. Addresses marked VERIFY before live mail. - npi_provider.py: fix access strings to two-tier framing; NPPES update/reactivation no longer 'online-only'; note 855B fee. - checkout.ts + service pages: strip client-facing mechanics & the paper-vs-tier choice; surrogate is the only optional, positively-framed ask (faster, never required, never share password).
This commit is contained in:
parent
74c1259c9a
commit
258d23bdc6
7 changed files with 417 additions and 289 deletions
118
scripts/workers/mac_routing.py
Normal file
118
scripts/workers/mac_routing.py
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
"""State -> Medicare Administrative Contractor (MAC) routing for CMS-855 mailing.
|
||||
|
||||
CMS-855 paper applications are mailed to the provider's *designated MAC*, which is
|
||||
determined by the provider's STATE/jurisdiction (per the official 855I/855B/855O
|
||||
instructions: "The MAC that services your State is responsible for processing your
|
||||
enrollment application").
|
||||
|
||||
This module maps each US state/territory -> its A/B MAC name + provider-enrollment
|
||||
mailing address. It is used to:
|
||||
1. Address the outgoing envelope for the Standard (paper) filing path.
|
||||
2. Group the daily batched mailing by destination agency (one Priority Mail
|
||||
envelope per MAC address).
|
||||
|
||||
IMPORTANT — verify before first live mail run: MAC jurisdiction assignments and
|
||||
(especially) the provider-enrollment PO Box addresses change when CMS re-competes
|
||||
a jurisdiction. Confirm each MAC's current enrollment mailing address against the
|
||||
MAC's website / CMS.gov/Medicare/Provider-Enrollment-and-Certification right
|
||||
before the first batch, then keep this table the single source of truth.
|
||||
|
||||
Jurisdiction assignments below reflect the long-standing A/B MAC map. Addresses
|
||||
are marked TODO where they must be filled from the MAC's current enrollment page.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class MAC:
|
||||
key: str # short stable id (used for batch grouping)
|
||||
name: str # MAC contractor + jurisdiction
|
||||
# Provider-enrollment mailing address lines. VERIFY before live use.
|
||||
address_lines: tuple[str, ...]
|
||||
|
||||
|
||||
# A/B MAC jurisdictions (long-standing assignments). Addresses TODO-verify.
|
||||
NORIDIAN_JE = MAC("noridian_je", "Noridian Healthcare Solutions — Jurisdiction E",
|
||||
("Noridian Healthcare Solutions", "Provider Enrollment (JE)",
|
||||
"P.O. Box — VERIFY", "Fargo, ND — VERIFY"))
|
||||
NORIDIAN_JF = MAC("noridian_jf", "Noridian Healthcare Solutions — Jurisdiction F",
|
||||
("Noridian Healthcare Solutions", "Provider Enrollment (JF)",
|
||||
"P.O. Box — VERIFY", "Fargo, ND — VERIFY"))
|
||||
NOVITAS_JH = MAC("novitas_jh", "Novitas Solutions — Jurisdiction H",
|
||||
("Novitas Solutions", "Provider Enrollment (JH)",
|
||||
"P.O. Box — VERIFY", "Mechanicsburg, PA — VERIFY"))
|
||||
NOVITAS_JL = MAC("novitas_jl", "Novitas Solutions — Jurisdiction L",
|
||||
("Novitas Solutions", "Provider Enrollment (JL)",
|
||||
"P.O. Box — VERIFY", "Mechanicsburg, PA — VERIFY"))
|
||||
FCSO_JN = MAC("fcso_jn", "First Coast Service Options — Jurisdiction N",
|
||||
("First Coast Service Options", "Provider Enrollment (JN)",
|
||||
"P.O. Box — VERIFY", "Jacksonville, FL — VERIFY"))
|
||||
PALMETTO_JJ = MAC("palmetto_jj", "Palmetto GBA — Jurisdiction J",
|
||||
("Palmetto GBA", "Provider Enrollment (JJ)",
|
||||
"P.O. Box — VERIFY", "Columbia, SC — VERIFY"))
|
||||
PALMETTO_JM = MAC("palmetto_jm", "Palmetto GBA — Jurisdiction M",
|
||||
("Palmetto GBA", "Provider Enrollment (JM)",
|
||||
"P.O. Box — VERIFY", "Columbia, SC — VERIFY"))
|
||||
CGS_J15 = MAC("cgs_j15", "CGS Administrators — Jurisdiction 15",
|
||||
("CGS Administrators", "Provider Enrollment (J15)",
|
||||
"P.O. Box — VERIFY", "Nashville, TN — VERIFY"))
|
||||
WPS_J5 = MAC("wps_j5", "WPS Government Health Administrators — Jurisdiction 5",
|
||||
("WPS GHA", "Provider Enrollment (J5)",
|
||||
"P.O. Box — VERIFY", "Madison, WI — VERIFY"))
|
||||
WPS_J8 = MAC("wps_j8", "WPS Government Health Administrators — Jurisdiction 8",
|
||||
("WPS GHA", "Provider Enrollment (J8)",
|
||||
"P.O. Box — VERIFY", "Madison, WI — VERIFY"))
|
||||
NGS_J6 = MAC("ngs_j6", "National Government Services — Jurisdiction 6",
|
||||
("National Government Services", "Provider Enrollment (J6)",
|
||||
"P.O. Box — VERIFY", "VERIFY"))
|
||||
NGS_JK = MAC("ngs_jk", "National Government Services — Jurisdiction K",
|
||||
("National Government Services", "Provider Enrollment (JK)",
|
||||
"P.O. Box — VERIFY", "VERIFY"))
|
||||
|
||||
# State (USPS) -> MAC. Based on the established A/B MAC jurisdiction map.
|
||||
STATE_TO_MAC: dict[str, MAC] = {
|
||||
# Noridian JE
|
||||
"CA": NORIDIAN_JE, "HI": NORIDIAN_JE, "NV": NORIDIAN_JE,
|
||||
"AS": NORIDIAN_JE, "GU": NORIDIAN_JE, "MP": NORIDIAN_JE,
|
||||
# Noridian JF
|
||||
"AK": NORIDIAN_JF, "AZ": NORIDIAN_JF, "ID": NORIDIAN_JF, "MT": NORIDIAN_JF,
|
||||
"ND": NORIDIAN_JF, "OR": NORIDIAN_JF, "SD": NORIDIAN_JF, "UT": NORIDIAN_JF,
|
||||
"WA": NORIDIAN_JF, "WY": NORIDIAN_JF,
|
||||
# Novitas JH
|
||||
"AR": NOVITAS_JH, "CO": NOVITAS_JH, "LA": NOVITAS_JH, "MS": NOVITAS_JH,
|
||||
"NM": NOVITAS_JH, "OK": NOVITAS_JH, "TX": NOVITAS_JH,
|
||||
# Novitas JL
|
||||
"DE": NOVITAS_JL, "DC": NOVITAS_JL, "MD": NOVITAS_JL, "NJ": NOVITAS_JL,
|
||||
"PA": NOVITAS_JL,
|
||||
# First Coast JN
|
||||
"FL": FCSO_JN, "PR": FCSO_JN, "VI": FCSO_JN,
|
||||
# Palmetto JJ
|
||||
"AL": PALMETTO_JJ, "GA": PALMETTO_JJ, "TN": PALMETTO_JJ,
|
||||
# Palmetto JM
|
||||
"NC": PALMETTO_JM, "SC": PALMETTO_JM, "VA": PALMETTO_JM, "WV": PALMETTO_JM,
|
||||
# CGS J15
|
||||
"KY": CGS_J15, "OH": CGS_J15,
|
||||
# WPS J5
|
||||
"IA": WPS_J5, "KS": WPS_J5, "MO": WPS_J5, "NE": WPS_J5,
|
||||
# WPS J8
|
||||
"IN": WPS_J8, "MI": WPS_J8,
|
||||
# NGS J6
|
||||
"IL": NGS_J6, "MN": NGS_J6, "WI": NGS_J6,
|
||||
# NGS JK
|
||||
"CT": NGS_JK, "ME": NGS_JK, "MA": NGS_JK, "NH": NGS_JK,
|
||||
"NY": NGS_JK, "RI": NGS_JK, "VT": NGS_JK,
|
||||
}
|
||||
|
||||
# NPI Enumerator paper address (NPPES / CMS-10114 paper path) — not a MAC, but a
|
||||
# destination the daily batch groups by, same as a MAC.
|
||||
NPI_ENUMERATOR = MAC(
|
||||
"npi_enumerator", "NPI Enumerator (NPPES / CMS-10114 paper)",
|
||||
("NPI Enumerator", "P.O. Box 6059", "Fargo, ND 58108-6059"),
|
||||
)
|
||||
|
||||
|
||||
def mac_for_state(state: str) -> MAC | None:
|
||||
"""Return the designated MAC for a USPS state code, or None if unknown."""
|
||||
return STATE_TO_MAC.get((state or "").strip().upper())
|
||||
|
|
@ -46,7 +46,8 @@ _SLUG_META = {
|
|||
"enrollment record, and submit. Capture the PECOS tracking ID."
|
||||
),
|
||||
"access": (
|
||||
"Standard: prepare CMS-855I/B/R, provider signs cert, submit to MAC. Expedited: file in PECOS via CMS I&A surrogate access."
|
||||
"Standard (default): prepare CMS-855I/B, provider e-signs cert, mail to MAC (daily batch). "
|
||||
"Expedited (if surrogate granted at intake): file in PECOS via CMS I&A surrogate access, same-day tracking."
|
||||
),
|
||||
"priority": "high",
|
||||
},
|
||||
|
|
@ -54,11 +55,12 @@ _SLUG_META = {
|
|||
"name": "NPI Reactivation",
|
||||
"portal": "https://nppes.cms.hhs.gov/",
|
||||
"action": (
|
||||
"Reactivate the deactivated NPI in NPPES. Verify the deactivation "
|
||||
"Reactivate the deactivated NPI. Verify the deactivation "
|
||||
"reason, correct any stale data, and re-certify the record."
|
||||
),
|
||||
"access": (
|
||||
"NPPES via CMS I&A surrogate access (online-only)."
|
||||
"Standard (default): prepare CMS-855I (reactivation reason), provider e-signs, mail to MAC (daily batch). "
|
||||
"Expedited (if surrogate granted): reactivate online in PECOS/NPPES via I&A surrogate access."
|
||||
),
|
||||
"priority": "high",
|
||||
},
|
||||
|
|
@ -71,7 +73,8 @@ _SLUG_META = {
|
|||
"changes and certify."
|
||||
),
|
||||
"access": (
|
||||
"NPPES via CMS I&A surrogate access (online-only)."
|
||||
"Standard (default): prepare CMS-10114 NPPES update, provider e-signs, mail to NPI Enumerator (Fargo, daily batch). "
|
||||
"Expedited (if surrogate granted): update online in NPPES via I&A surrogate access."
|
||||
),
|
||||
"priority": "normal",
|
||||
},
|
||||
|
|
@ -83,7 +86,9 @@ _SLUG_META = {
|
|||
"Confirm taxonomy, practice location, and authorized official."
|
||||
),
|
||||
"access": (
|
||||
"Standard: prepare CMS-855, provider signs cert, submit to MAC. Expedited: file in PECOS via CMS I&A surrogate access."
|
||||
"Standard (default): prepare CMS-855, provider e-signs cert, mail to MAC (daily batch). "
|
||||
"Expedited (if surrogate granted): file in PECOS via CMS I&A surrogate access, same-day tracking. "
|
||||
"NOTE: org (855B) enrollment/revalidation requires the CMS application fee paid via PECOS before submission."
|
||||
),
|
||||
"priority": "high",
|
||||
},
|
||||
|
|
@ -109,16 +114,22 @@ _SLUG_META = {
|
|||
"record. Set the next revalidation reminder."
|
||||
),
|
||||
"access": (
|
||||
"Standard CMS-855 filing for the enrollment/revalidation piece; NPPES + PECOS via CMS I&A surrogate access; screening is public."
|
||||
"Standard (default): CMS-855 paper filing for the enrollment/revalidation piece, mailed to MAC (daily batch); screening is public (no client action). "
|
||||
"Expedited (if surrogate granted): NPPES + PECOS pieces filed online via CMS I&A surrogate access."
|
||||
),
|
||||
"priority": "high",
|
||||
},
|
||||
}
|
||||
|
||||
# Slugs whose fulfilment includes a CMS-855 (auto-filled official form, signed
|
||||
# via the secure e-sign link, then submitted to the provider's MAC). The
|
||||
# bundle's revalidation piece is handled by the dedicated revalidation order it
|
||||
# spawns, so it is not listed here.
|
||||
# via the secure e-sign link, then submitted to the provider's MAC via the daily
|
||||
# batched mailing). The bundle's revalidation piece is handled by the dedicated
|
||||
# revalidation order it spawns, so it is not listed here.
|
||||
#
|
||||
# nppes-update is intentionally NOT here: its Standard path is the CMS-10114 (NPPES
|
||||
# update mailed to the NPI Enumerator in Fargo), handled by a separate filler when
|
||||
# built. Until then, nppes-update falls to the admin todo (Expedited if surrogate
|
||||
# granted, otherwise manual CMS-10114 prep).
|
||||
_STANDARD_FILING_SLUGS = {
|
||||
"npi-revalidation",
|
||||
"npi-reactivation",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue