mrfkit 0.1.0__py3-none-any.whl

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.
mrfkit/payers.py ADDED
@@ -0,0 +1,2755 @@
1
+
2
+ """Normalize payer and plan names.
3
+
4
+ The same insurer shows up as "AETNA HMO [1001103]", "JMPN AETNA", "Aetna Inc."
5
+ and "95% Aetna". ``normalize_payer_name`` reduces those to one canonical name
6
+ (plus any plan type it found in the payer string), ``is_self_pay_payer`` spots
7
+ the cash / uninsured price published as if it were a payer, and
8
+ ``normalize_plan_name`` sorts free-text plan names into a small taxonomy.
9
+
10
+ Everything here is pure. Pass a ``ReferenceData`` to add your own payer
11
+ aliases or a match index of payers you already know.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import html
17
+ import re
18
+ from typing import TYPE_CHECKING, Dict, Optional, Tuple
19
+
20
+ if TYPE_CHECKING:
21
+ from mrfkit.reference import ReferenceData
22
+
23
+ # ============================================================================
24
+ # PAYER NAME NORMALIZATION
25
+ # ============================================================================
26
+ # Deterministic rules to clean raw payer_name values from hospital MRF files.
27
+ # Problems addressed:
28
+ # 1. Embedded contract IDs: "AETNA HMO [1001103]" -> "Aetna"
29
+ # 2. Hospital-specific prefixes: "JMPN AETNA [...]" -> "Aetna"
30
+ # 3. Product-line suffixes mixed into name: "BLUE SHIELD PPO" -> "Blue Shield"
31
+ # (product line preserved as plan_type)
32
+ # 4. Junk entries: "#N/A", "GENERIC HMO", etc. -> filtered out
33
+ # 5. Inconsistent casing/spacing
34
+
35
+ # Contract ID pattern: [digits] or [digits+letters] at end of string
36
+ _CONTRACT_ID_RE = re.compile(r'\s*\[[\w]+\]\s*$')
37
+
38
+ # Bracket-wrapped name pattern: entire payer name in matching square or angle brackets
39
+ # e.g., "[Kaiser Foundation Health Plan, Inc.]" or "<Self-Pay>"
40
+ # Uses alternation to enforce matching pairs (no [Aetna> mismatches)
41
+ _BRACKET_WRAPPED_RE = re.compile(r'^\[(.+)\]$|^<(.+)>$')
42
+
43
+ # Self-pay / cash-pay payer names. When a hospital publishes a rate with
44
+ # one of these as the "payer", it is really the cash / uninsured price and
45
+ # belongs in the item's discounted_cash_price, not in a payer rate.
46
+ _SELF_PAY_NAMES = frozenset({
47
+ 'SELF PAY',
48
+ 'SELF-PAY',
49
+ 'SELFPAY',
50
+ 'SELF PAYSELF-PAY', # seen in Partners Healthcare data
51
+ 'CASH',
52
+ 'CASH PAY',
53
+ 'CASH PRICE',
54
+ 'CASH PRICE ESTIMATE',
55
+ 'CASH DISCOUNT',
56
+ 'PATIENT',
57
+ 'PATIENT PAY',
58
+ 'UNINSURED',
59
+ 'UNINSURED/SELF-PAY',
60
+ 'SELF-PAY/UNINSURED',
61
+ 'NO INSURANCE',
62
+ 'SELF',
63
+ 'GROSS CHARGES', # some MRFs publish gross as a "payer"
64
+ 'GROSS CHARGE',
65
+ 'CDM DEFAULT', # Charge Description Master - hospital list price
66
+ 'CDM',
67
+ 'CHARGE MASTER',
68
+ 'CHARGEMASTER',
69
+ 'SELF PAY/UNINSURED DISCOUNT', # seen in William Bee Ririe Hospital
70
+ })
71
+
72
+
73
+ # Keyword substrings that indicate a self-pay / uninsured row even when the
74
+ # full label isn't in _SELF_PAY_NAMES. Required so novel labels like
75
+ # "Self Pay Rate", "Cash/Self Pay Price", "Uninsured Patient Estimate",
76
+ # "Self-Pay (no insurance)" fold into discounted_cash_price instead of
77
+ # being stored as fake payers with plan_category='Other'.
78
+ #
79
+ # Conservative on purpose:
80
+ # * SELF[ -]?PAY and UNINSURED are strong, unambiguous signals: no
81
+ # legitimate insurer name contains them.
82
+ # * CASH is NOT included as a substring (would mis-promote real names
83
+ # like "Cash America Insurance", "BlueCash PPO"). Stand-alone CASH
84
+ # and common CASH * combos are already covered by the exact-set above.
85
+ #
86
+ # Substrings are checked against the normalized uppercase ``working``
87
+ # value (after html-unescape, quote-strip, bracket-unwrap, underscore to
88
+ # space, whitespace collapse), so case and minor punctuation variations
89
+ # don't matter.
90
+ _SELF_PAY_KEYWORD_SUBSTRINGS = (
91
+ 'SELF PAY',
92
+ 'SELF-PAY',
93
+ 'SELFPAY',
94
+ 'UNINSURED',
95
+ )
96
+
97
+
98
+ def _contains_self_pay_keyword(upper_name: str) -> bool:
99
+ """Helper used by both ``is_self_pay_payer`` and (transitively by)
100
+ ``normalize_payer_name``'s ``%``-prefix branch to keep the two
101
+ self-pay matchers in sync."""
102
+ return any(kw in upper_name for kw in _SELF_PAY_KEYWORD_SUBSTRINGS)
103
+
104
+
105
+ def is_self_pay_payer(raw_payer: Optional[str]) -> bool:
106
+ """Return True if the raw payer name represents a self-pay / cash price.
107
+
108
+ The check is case-insensitive and handles bracket/angle-bracket wrapping.
109
+
110
+ Strips a leading ``NN%`` (or ``NN.N%``) prefix before the exact-set /
111
+ keyword check so this matcher agrees with :func:`normalize_payer_name`,
112
+ which strips the same prefix. Without the strip, a row labeled e.g.
113
+ ``"30% Cash"`` was silently lost: the fold-to-cash step gates on
114
+ ``is_self_pay_payer`` (False because of the unstripped ``30%``), and
115
+ ``normalize_payer_name`` then returned None (discard).
116
+
117
+ In addition to the exact-set match against ``_SELF_PAY_NAMES``, accepts
118
+ any name containing the keyword substrings ``SELF PAY``, ``SELF-PAY``,
119
+ ``SELFPAY``, or ``UNINSURED``. Catches novel labels that aren't in the
120
+ exact set (e.g. ``"Self Pay Rate"``, ``"Uninsured Patient Estimate"``)
121
+ so they fold into ``discounted_cash_price`` rather than being stored as
122
+ fake payers. ``CASH`` is intentionally NOT a substring trigger: real
123
+ insurer names like ``"Cash America Insurance"`` / ``"BlueCash PPO"``
124
+ would otherwise mis-promote. Stand-alone CASH and the common CASH *
125
+ combos remain in the exact set.
126
+ """
127
+ if not raw_payer or not raw_payer.strip():
128
+ return False
129
+ working = html.unescape(str(raw_payer)).strip()
130
+ working = working.strip('"\'\u201c\u201d\u2018\u2019`')
131
+ if working.startswith('<') and working.endswith('>'):
132
+ working = working[1:-1].strip()
133
+
134
+ if _NUMERIC_PAYER_RE.match(working):
135
+ return False
136
+ # Unwrap brackets: [Self-Pay] or <Self-Pay>
137
+ m = _BRACKET_WRAPPED_RE.match(working)
138
+ if m:
139
+ working = (m.group(1) or m.group(2)).strip()
140
+ # Normalize underscores and collapse whitespace
141
+ working = working.replace('_', ' ')
142
+ working = re.sub(r'\s+', ' ', working).strip()
143
+ # Strip a leading "NN%" / "NN.N%" so percentage-prefixed self-pay rows
144
+ # match the same _SELF_PAY_NAMES set as unprefixed rows. Mirrors
145
+ # normalize_payer_name(); see _PCT_PREFIX_RE.
146
+ pct_match = _PCT_PREFIX_RE.match(working)
147
+ if pct_match:
148
+ working = pct_match.group(2).strip()
149
+ upper = working.upper()
150
+ if upper in _SELF_PAY_NAMES:
151
+ return True
152
+ # Broaden detection to keyword substrings so novel self-pay labels
153
+ # also fold into cash.
154
+ return _contains_self_pay_keyword(upper)
155
+
156
+ # Hospital-specific prefixes to strip (case-insensitive, checked in order)
157
+ # Longer prefixes first to avoid partial matches
158
+ _HOSPITAL_PREFIXES = [
159
+ 'SHCA COMM ', # Sutter Health Care Alliance - Commercial
160
+ 'HILLS ', # Hills Physicians variant prefix
161
+ 'PSYCH ', # Psychiatric variant prefix (e.g., "PSYCH BLUE SHIELD...")
162
+ 'JMPN ', # John Muir Physician Network
163
+ 'NODE ', # AdventHealth/CHS internal system prefix
164
+ 'MC GENERIC ', # Plan-code prefix leaked into payer names
165
+ 'TUH ', # Temple University Hospital source prefix
166
+ 'JNS ', # Jefferson/Temple source prefix
167
+ 'CHH ', # Catholic Health/Hospice source prefix
168
+ 'FCOD ', # Facility-code prefix in NY payer extracts
169
+ 'NACC ', # Facility-code prefix in NY payer extracts
170
+ 'JUP ', # Facility-code prefix in NY payer extracts
171
+ 'STOD ', # Facility-code prefix in NY payer extracts
172
+ 'PAYER ', # Literal field-label prefix from malformed extracts
173
+ 'PRO ', # Provider-system prefix, e.g. "PRO UHC Commercial"
174
+ ]
175
+
176
+ # Product-line / network suffixes to extract as plan_type
177
+ # Order matters: longer patterns first to avoid partial matches
178
+ _PLAN_TYPE_SUFFIXES = [
179
+ ' MEDICARE ADVANTAGE',
180
+ ' MEDICARE ADV',
181
+ ' MEDICARE A/B REBILL',
182
+ ' MCR ADV - ALL PLANS',
183
+ ' MCR ADV - ALL OTHER PLANS',
184
+ ' MCR ADV',
185
+ ' COMM - ALL OTHER PLANS',
186
+ ' PPO/HPN - ALL OTHER PLANS',
187
+ ' PPO/HMO-ALL OTHER PLANS',
188
+ ' PPO-ALL OTHER PLANS',
189
+ ' PPO - ALL OTHER PLANS',
190
+ ' HMO-ALL OTHER PLANS',
191
+ ' HMO - ALL OTHER PLANS',
192
+ '-ALL OTHER PLANS',
193
+ '-ALL PLANS',
194
+ ' - ALL OTHER PLANS',
195
+ ' - ALL PLANS',
196
+ ' ALTERNATE PAYER',
197
+ ' ALTERNATE PAYOR',
198
+ ' ALT PAYOR',
199
+ ' ALT PAYER',
200
+ '-NETWORK MCARE',
201
+ '-NETWORK',
202
+ ' NETWORK SELECT',
203
+ ' DOCTORS PLAN PPO/EP',
204
+ ' DOCTORS PLAN',
205
+ ' SELECT/NAVIGATE/CORE',
206
+ ' TAILORED NETWORK',
207
+ ' ENHANCEDCARE',
208
+ ' CHOICE CARE',
209
+ ' FEDERAL EMPLOYEES',
210
+ ' NEW BUS OAP',
211
+ ' MCARE',
212
+ ' MEDICARE',
213
+ ' HMO/IFP',
214
+ ' HMO/PPO',
215
+ ' HMO/POS',
216
+ ' PPO/EPO',
217
+ ' HMO',
218
+ ' PPO',
219
+ ' EPPO',
220
+ ' EPO',
221
+ ' POS',
222
+ ' INDEMNITY',
223
+ ' LIFE',
224
+ ' MEDI-CAL',
225
+ ]
226
+
227
+ # Junk payer names to discard entirely
228
+ _JUNK_PAYER_NAMES = {
229
+ '#N/A',
230
+ 'N/A',
231
+ '',
232
+ 'GENERIC COMMERCIAL/INDEMNITY',
233
+ 'GENERIC COMMERCIAL',
234
+ 'GENERIC HMO',
235
+ 'GENERIC PPO',
236
+ 'MEDICARE ADV GENERIC',
237
+ 'MEDI-CAL', # bare "Medi-Cal" is a program, not a payer
238
+ }
239
+
240
+ # ---------- Regex-based junk / prefix patterns ----------
241
+
242
+ # Decimal/rate-like payer names: "27.07", "147.05", "0.80" - these are raw rates, not payers
243
+ # Matches strings that are purely a decimal number (possibly quoted).
244
+ _RATE_LIKE_PAYER_RE = re.compile(r'^"?\d+(?:\.\d+)?"?$')
245
+
246
+ # Punctuation-only payer names: "#", ".", "--", etc.
247
+ _PUNCT_ONLY_PAYER_RE = re.compile(r'^[^A-Za-z0-9]+$')
248
+
249
+ # Numeric-only payer names that are NOT legitimate union/local payer identifiers.
250
+ # Legitimate numeric payers (e.g. "1199 SEIU", "Local 104") contain non-digit words.
251
+ # This pattern matches strings that are *only* an integer with no alphabetic content.
252
+ _INTEGER_ONLY_PAYER_RE = re.compile(r'^\d+$')
253
+
254
+ # Percentage-prefixed payer names: "95% Anthem Blue Cross" -> payer="Anthem Blue Cross"
255
+ # The percentage is the negotiated rate as % of charges. These are real payers with
256
+ # a pricing methodology baked into the name.
257
+ _PCT_PREFIX_RE = re.compile(r'^(\d+(?:\.\d+)?)\s*%\s*(.+)$')
258
+
259
+ # Per-diem rate values used as payer names: "Abbhh 14/Day", "Abbhh 22.37/Day"
260
+ # These are rate tiers from Alexian Brothers Behavioral Health Hospital, not real payers.
261
+ _PER_DIEM_PAYER_RE = re.compile(r'^.+\s+\d+(?:\.\d+)?/DAY$', re.IGNORECASE)
262
+
263
+ # Embedded 8-digit date pattern: "Cofinity/Ppom 20120101 (St Mary)" -> "Cofinity/Ppom"
264
+ # Dates are contract effective dates baked into the payer name by some hospital systems.
265
+ # Also strips optional trailing " (St Mary)", " (St. Mary)", " Anderson", " Tlk ..."
266
+ _EMBEDDED_DATE_RE = re.compile(
267
+ r'\s+\d{8}' # 8-digit date (e.g. 20120101)
268
+ r'(?:\s+\(.*?\))?' # optional (St Mary) / (St. Mary) suffix
269
+ r'(?:\s+(?:Anderson|Tlk)\b.*)?' # optional Anderson / Tlk trailing text
270
+ r'\s*$',
271
+ re.IGNORECASE,
272
+ )
273
+
274
+ # Trailing numeric IDs from hospital billing systems: "Fidelis 5155" -> "Fidelis"
275
+ # Matches 2-5 trailing digits that aren't part of a legitimate name.
276
+ # Negative lookbehind prevents stripping from union locals, product names.
277
+ _TRAILING_ID_RE = re.compile(
278
+ r'\s+\d{2,5}$' # trailing 2-5 digits preceded by whitespace
279
+ )
280
+
281
+ # Names to EXCLUDE from trailing-ID stripping (legitimate numbers in name)
282
+ _TRAILING_ID_PRESERVE = frozenset({
283
+ 'IMAGINE 360',
284
+ 'ADVANTAGE 360',
285
+ 'PLAN 80',
286
+ 'PLAN 65',
287
+ 'PLAN 1000',
288
+ })
289
+
290
+ # Compound payer IDs: "Highmark Blue Cross Blue Shield Of Western Ny Medicaid 1702, ..."
291
+ # These are multi-ID strings from NY hospital systems. Just strip trailing ", NNNN" parts.
292
+ _COMPOUND_ID_RE = re.compile(
293
+ r'(?:,\s*\S+\s+\d{3,5})+$' # one or more ", Name NNNN" suffixes
294
+ )
295
+
296
+ # Workers Comp prefix pattern: "Wc Aetna" -> parent payer "Aetna", plan_category="Workers Comp"
297
+ _WC_PREFIX_RE = re.compile(r'^WC\s+(.+)$', re.IGNORECASE)
298
+
299
+ _NUMERIC_PAYER_RE = re.compile(r'^"?\d+(?:\.\d+)?"?$')
300
+
301
+ _PAYER_CONTRACT_STATUS_SUFFIX_RE = re.compile(
302
+ r'\s+(?:NON[-\s]?CONTRACT(?:ED)?|CONTRACTED)$', re.IGNORECASE)
303
+
304
+ _PAYER_TRAILING_PLAN_SUFFIXES = [
305
+ (' MEDICARE ADVANTAGE CONTRACTED', 'Medicare Advantage'),
306
+ (' MEDICARE ADVANTAGE NON-CONTRACTED', 'Medicare Advantage'),
307
+ (' MEDICARE MANAGED CARE', 'Medicare Advantage'),
308
+ (' MEDICARE ADVANTAGE', 'Medicare Advantage'),
309
+ (' MEDICARE CONTRACTED', 'Medicare'),
310
+ (' MEDICARE NON-CONTRACTED', 'Medicare'),
311
+ (' MEDICARE', 'Medicare'),
312
+ (' MCARE', 'Medicare'),
313
+ (' MCR', 'Medicare'),
314
+ (' MEDICAID MANAGED CARE', 'Medicaid Managed Care'),
315
+ (' MEDICAID CONTRACTED', 'Medicaid'),
316
+ (' MEDICAID NON-CONTRACTED', 'Medicaid'),
317
+ (' MEDICAID', 'Medicaid'),
318
+ (' MEDI-CAL', 'Medi-Cal'),
319
+ (' MCAL', 'Medi-Cal'),
320
+ (' MCD', 'Medicaid'),
321
+ (' COMMERCIAL CONTRACTED', 'Commercial'),
322
+ (' COMMERCIAL NON-CONTRACTED', 'Commercial'),
323
+ (' COMMERCIAL', 'Commercial'),
324
+ (' HMO', 'HMO'),
325
+ (' PPO', 'PPO'),
326
+ ]
327
+
328
+ _CONCAT_PAYER_PLAN_PATTERNS = [
329
+ ('unitedhealthcareoxford', 'United Healthcare'),
330
+ ('unitedhealthcarecommty', 'United Healthcare'),
331
+ ('unitedhealthcare', 'United Healthcare'),
332
+ ('uhc', 'United Healthcare'),
333
+ ('emblemhealthhip', 'EmblemHealth'),
334
+ ('emblemhealthghi', 'EmblemHealth'),
335
+ ('emblemhealth', 'EmblemHealth'),
336
+ ('metroplushealth', 'MetroPlus'),
337
+ ('metroplus', 'MetroPlus'),
338
+ ('bcbstx', 'Blue Cross Blue Shield of Texas'),
339
+ ('bcbsnc', 'Blue Cross Blue Shield of North Carolina'),
340
+ ('bcbsmn', 'Blue Cross Blue Shield of Minnesota'),
341
+ ('bluecrossblueshield', 'Blue Cross Blue Shield'),
342
+ ('bluecross', 'Blue Cross Blue Shield'),
343
+ ('blueshield', 'Blue Shield of California'),
344
+ ('healthlink', 'HealthLink'),
345
+ ('healthsmart', 'HealthSmart'),
346
+ ('wellcare', 'WellCare'),
347
+ ('care1st', 'Care 1st Health Plan'),
348
+ ('carefirst', 'CareFirst Blue Cross Blue Shield'),
349
+ ('aetna', 'Aetna'),
350
+ ('anthem', 'Anthem Blue Cross'),
351
+ ('cigna', 'Cigna'),
352
+ ('humana', 'Humana'),
353
+ ('kaiser', 'Kaiser Permanente'),
354
+ ('medica', 'Medica'),
355
+ ('moda', 'Moda Health'),
356
+ ('mclaren', 'McLaren Health Plan'),
357
+ ('meridian', 'Meridian'),
358
+ ('amerigroup', 'Amerigroup'),
359
+ ('optum', 'Optum'),
360
+ ('ubh', 'United Behavioral Health'),
361
+ ]
362
+
363
+ _CONCAT_PLAN_SUFFIXES = [
364
+ ('medicareadvantage', 'Medicare Advantage'),
365
+ ('medicare', 'Medicare'),
366
+ ('mcare', 'Medicare'),
367
+ ('mcr', 'Medicare'),
368
+ ('medicaid', 'Medicaid'),
369
+ ('mcaid', 'Medicaid'),
370
+ ('mcal', 'Medi-Cal'),
371
+ ('mcd', 'Medicaid'),
372
+ ('commercial', 'Commercial'),
373
+ ('comm', 'Commercial'),
374
+ ('hmo', 'HMO'),
375
+ ('ppo', 'PPO'),
376
+ ]
377
+
378
+
379
+ def _clean_payer_key(value: Optional[str]) -> str:
380
+ """Return the uppercase lookup key used for payer alias matching."""
381
+ if not value:
382
+ return ''
383
+ cleaned = html.unescape(str(value)).strip()
384
+ cleaned = cleaned.strip('"\'\u201c\u201d\u2018\u2019`')
385
+ cleaned = cleaned.strip('<>')
386
+ cleaned = cleaned.replace('_', ' ')
387
+ cleaned = re.sub(r'\s+', ' ', cleaned).strip()
388
+ return cleaned.upper()
389
+
390
+
391
+ # ---------------------------------------------------------------------------
392
+ # Payer-name match-fold: dedup of normalization variants.
393
+ #
394
+ # normalize_payer_name() resolves curated names via the payer aliases and
395
+ # _PAYER_CANONICAL_MAP, but anything not in those maps falls through to the
396
+ # Step-5 title-case fallback, which preserves trivial spelling variants:
397
+ # singular/plural ("Health Plan" vs "Health Plans"), trailing punctuation
398
+ # ("Inc" vs "Inc."), smart-quotes, stray whitespace/hyphens, truncated
399
+ # parens. Two hospitals spelling the SAME payer slightly differently would
400
+ # each produce a distinct payer name.
401
+ #
402
+ # Fix: compute a conservative match key (case/punctuation/whitespace-folded,
403
+ # each token singularized) and, when that key already maps to an established
404
+ # payer in ``ReferenceData.payer_match_index``, fold the fallback name onto
405
+ # that payer's canonical name. The key is deliberately narrow: it folds
406
+ # plural/punctuation noise but never drops distinguishing words (state
407
+ # names, brands), so it cannot merge "Blue Cross of California" with
408
+ # "Blue Cross of Idaho". Only the uncurated fallback path is folded;
409
+ # alias / canonical-map hits are trusted as-is.
410
+ # ---------------------------------------------------------------------------
411
+
412
+ _PAYER_MATCH_PUNCT_RE = re.compile(r"[^a-z0-9\s]")
413
+ _PAYER_MATCH_SPACE_RE = re.compile(r"\s+")
414
+
415
+
416
+ def _singularize_token(tok: str) -> str:
417
+ """Strip a single trailing plural 's' from one token.
418
+
419
+ Conservative: leaves ``ss`` words ("Express", "Wellness") and very short
420
+ tokens (<=3 chars) untouched, so it folds "Plans"->"Plan",
421
+ "Services"->"Service", "Benefits"->"Benefit", "Administrators"->
422
+ "Administrator" without mangling distinct words.
423
+ """
424
+ if len(tok) > 3 and tok.endswith("s") and not tok.endswith("ss"):
425
+ return tok[:-1]
426
+ return tok
427
+
428
+
429
+ def payer_match_key(name: Optional[str]) -> str:
430
+ """Normalized key for collapsing payer-name spelling variants.
431
+
432
+ Lowercases, replaces punctuation with spaces, collapses whitespace,
433
+ singularizes each token, and uppercases. Two names that differ ONLY by
434
+ case, punctuation, whitespace/hyphens, or singular/plural map to the same
435
+ key; names that differ by any real word (state, brand) do not.
436
+
437
+ "Buckeye Community Health Plans" -> "BUCKEYE COMMUNITY HEALTH PLAN"
438
+ "Buckeye Community Health Plan" -> "BUCKEYE COMMUNITY HEALTH PLAN"
439
+ "Wisconsin Physicians Service" -> "WISCONSIN PHYSICIAN SERVICE"
440
+ "Georgia Workers' Compensation" -> "GEORGIA WORKER COMPENSATION"
441
+ """
442
+ if not name:
443
+ return ""
444
+ lowered = html.unescape(str(name)).lower()
445
+ no_punct = _PAYER_MATCH_PUNCT_RE.sub(" ", lowered)
446
+ collapsed = _PAYER_MATCH_SPACE_RE.sub(" ", no_punct).strip()
447
+ if not collapsed:
448
+ return ""
449
+ singular = [_singularize_token(t) for t in collapsed.split(" ") if t]
450
+ return " ".join(singular).upper()
451
+
452
+
453
+ def _fold_canonical_via_match(
454
+ canonical: Optional[str],
455
+ ref: Optional[ReferenceData] = None,
456
+ ) -> Optional[str]:
457
+ """Fold a fallback-derived canonical name onto an established payer.
458
+
459
+ Returns the winning canonical name when this name's match key is
460
+ already in ``ref.payer_match_index``; otherwise returns the input
461
+ unchanged and records it in that index so later variants of a brand-new
462
+ payer within the same run also collapse (first-seen is a stable winner).
463
+ No-op when the index is empty, keeping normalize_payer_name() pure by
464
+ default.
465
+ """
466
+ index = ref.payer_match_index if ref is not None else None
467
+ if not canonical or not index:
468
+ return canonical
469
+ mk = payer_match_key(canonical)
470
+ if not mk:
471
+ return canonical
472
+ winner = index.get(mk)
473
+ if winner is not None:
474
+ return winner
475
+ index[mk] = canonical
476
+ return canonical
477
+
478
+
479
+ # Canonical name mapping: normalized uppercase key -> canonical display name.
480
+ # Built from the payer names seen across thousands of real hospital files.
481
+ _PAYER_CANONICAL_MAP = {
482
+ # ---- Major national insurers ----
483
+ 'AETNA': 'Aetna',
484
+ 'AETNA BETTER HEALTH DR': 'Aetna',
485
+ 'AETNA BETTERHEALTH VA MCD': 'Aetna',
486
+ 'AETNA CHOICE POS II SHC': 'Aetna',
487
+ 'AETNA GLOBAL BENEFITS': 'Aetna',
488
+ 'AETNA HEALTH OF CALIFORNIA INC.': 'Aetna',
489
+ 'AETNA HILL PHYSICIANS': 'Aetna',
490
+ 'AETNA HMO OTHER': 'Aetna',
491
+ 'AETNA INTERNATIONAL': 'Aetna',
492
+ 'AETNA LEWER MARK STUDENT INSURANCE': 'Aetna',
493
+ 'AETNA MANAGED CHOICE': 'Aetna',
494
+ 'AETNA MED ADV': 'Aetna',
495
+ 'AETNA MEDICARE SUPPLEMENT': 'Aetna',
496
+ 'AETNA NON CONTRACTED': 'Aetna',
497
+ 'AETNA OTHER': 'Aetna',
498
+ 'AETNA PAMF MPD': 'Aetna',
499
+ 'AETNA PPO': 'Aetna',
500
+ 'AETNA SENIOR': 'Aetna',
501
+ 'AETNA SENIOR HEALTH PLAN': 'Aetna',
502
+ 'AETNA STUDENT HEALTH': 'Aetna',
503
+ 'AETNA SUTTER HEALTH': 'Aetna',
504
+ 'AETNA SUTTER HEALTH SELF INSURED': 'Aetna',
505
+ 'AFFINITY MED GRP AETNA': 'Aetna',
506
+ 'ALT AETNA COMM AETNA': 'Aetna',
507
+ 'BROWN AND TOLAND MED GRP AETNA': 'Aetna',
508
+ 'BROWN AND TOLAND MG AETNA': 'Aetna',
509
+ 'DIGNITY HEALTHCARE AETNA': 'Aetna',
510
+ 'HILL PHYS MED GRP AETNA': 'Aetna',
511
+ 'JOHN MUIR HLTH NTWK AETNA': 'Aetna',
512
+ 'MARKSREIN SALES COMPANY AETNA': 'Aetna',
513
+ 'TRUSTMARK AETNA': 'Aetna',
514
+ 'VIRGINIA TOTAL CARE DSNP': 'Aetna',
515
+ 'VIRGINIA TOTAL CARE MCRA': 'Aetna',
516
+
517
+ 'AMBETTER': 'Ambetter',
518
+ 'AMBETTER CASCADE COMPLETE': 'Ambetter',
519
+ 'AMBETTER HEALTH': 'Ambetter',
520
+ 'AMBETTER HEALTH ATTN CLAIMS': 'Ambetter',
521
+
522
+ '26056 BLUE CROSS SR MEDICARE ADVANTAGE P': 'Anthem Blue Cross',
523
+ 'ALT BLUE CROSS COMM': 'Anthem Blue Cross',
524
+ 'ANTHEM': 'Anthem Blue Cross',
525
+ 'ANTHEM AFFILIATES': 'Anthem Blue Cross',
526
+ 'ANTHEM BC': 'Anthem Blue Cross',
527
+ 'ANTHEM BC VA DUAL': 'Anthem Blue Cross',
528
+ 'ANTHEM BC VA EXCHANGE': 'Anthem Blue Cross',
529
+ 'ANTHEM BLUE CONNECTION': 'Anthem Blue Cross',
530
+ 'ANTHEM BLUE CROSS': 'Anthem Blue Cross',
531
+ 'ANTHEM BLUE CROSS BLUE SHIELD': 'Anthem Blue Cross',
532
+ 'ANTHEM BLUE CROSS HILL PHYSICIANS': 'Anthem Blue Cross',
533
+ 'ANTHEM BLUE CROSS MED ADV': 'Anthem Blue Cross',
534
+ 'ANTHEM BLUE CROSS MEDI-CAL DELEGATED': 'Anthem Blue Cross',
535
+ 'ANTHEM BLUE CROSS MEDI-CAL FFS': 'Anthem Blue Cross',
536
+ 'ANTHEM BLUE CROSS SPHS': 'Anthem Blue Cross',
537
+ 'ANTHEM MEDICAID': 'Anthem Blue Cross',
538
+ 'ANTHEM SSI': 'Anthem Blue Cross',
539
+ 'BC BS OF MA': 'Blue Cross Blue Shield of Massachusetts',
540
+ 'BC OF MA EXCHANGE': 'Blue Cross Blue Shield of Massachusetts',
541
+ 'BCBS - ANTHEM': 'Anthem Blue Cross',
542
+ 'BCMA BLUE BENEFIT ADMIN': 'Anthem Blue Cross',
543
+ 'BLUE CARD (OUT OF STATE)': 'Blue Cross Blue Shield',
544
+ 'BLUE CROSS': 'Blue Cross Blue Shield',
545
+ 'BLUE CROSS/BLUE SHIELD': 'Blue Cross Blue Shield',
546
+ 'BLUE CROSS BLUE SHIELD ASSOCIATION': 'Blue Cross Blue Shield',
547
+ 'BLUE CROSS ALTERNATE PAYOR': 'Blue Cross Blue Shield',
548
+ 'BLUE CROSS ANTHEM': 'Anthem Blue Cross',
549
+ 'BLUE CROSS CAL PERS SELECT': 'Anthem Blue Cross',
550
+ 'BLUE CROSS HEALTH PERFORMANCE NETWORK': 'Anthem Blue Cross',
551
+ 'BLUE CROSS HMO OTHER': 'Blue Cross Blue Shield',
552
+ 'BLUE CROSS MEDI CAL': 'Anthem Blue Cross',
553
+ 'BLUE CROSS MEDI-CAL': 'Anthem Blue Cross',
554
+ 'BLUE CROSS MEDICARE SUPPLEMENT': 'Blue Cross Blue Shield',
555
+ 'BLUE CROSS MR': 'Blue Cross Blue Shield',
556
+ 'BLUE CROSS NON CONTRACTED': 'Blue Cross Blue Shield',
557
+ 'BLUE CROSS OF CALIFORNIA': 'Anthem Blue Cross',
558
+ 'BLUE CROSS OF CALIFORNIA, DBA ANTHEM BLUE CROSS AND ITS AFFILIATES': 'Anthem Blue Cross',
559
+ 'BLUE CROSS OF MA': 'Blue Cross Blue Shield of Massachusetts',
560
+ 'BLUE CROSS ONOFF EXCHANGE': 'Blue Cross Blue Shield',
561
+ 'BLUE CROSS PPO': 'Blue Cross Blue Shield',
562
+ 'BLUE CROSS SEBMF': 'Anthem Blue Cross',
563
+ 'BLUE CROSS SELECT': 'Blue Cross Blue Shield',
564
+ 'BLUE CROSS SR IMPERIAL HEALTH PLAN': 'Anthem Blue Cross',
565
+ 'BLUE CROSS STUDENT HEALTH': 'Blue Cross Blue Shield',
566
+ 'BLUE CROSSNORTH EAST MEDICAL SERVICES': 'Anthem Blue Cross',
567
+ 'BLUE MEDI-CAL RIVER CITY MEDICAL GROUP': 'Anthem Blue Cross',
568
+ 'NEMS BLUE CROSS MCAL': 'Anthem Blue Cross',
569
+ 'VIVANT BLUE CROSS': 'Anthem Blue Cross',
570
+
571
+ 'BCBS': 'Blue Cross Blue Shield',
572
+ 'BCBS MA EXCHANGE': 'Blue Cross Blue Shield of Massachusetts',
573
+ 'BCBS OF MASS': 'Blue Cross Blue Shield of Massachusetts',
574
+ 'BLUE CROSS BLUE SHIELD': 'Blue Cross Blue Shield',
575
+ 'VERMONT BLUE ADVANTAGE': 'Blue Cross Blue Shield',
576
+
577
+ 'ALT BLUE SHIELD COMM': 'Blue Shield of California',
578
+ 'AMERICAN SPECIALTY': 'Blue Shield of California',
579
+ 'AMERICAN SPECIALTY HEALTH PLAN': 'Blue Shield of California',
580
+ 'AMERICAN SPECIALTY HEALTH PLAN ALTERNATE PAYER': 'Blue Shield of California',
581
+ 'BLUE CARD (OUT OF STATE) - BS': 'Blue Shield of California',
582
+ 'BLUE SHIELD': 'Blue Shield of California',
583
+ 'BLUE SHIELD ACO': 'Blue Shield of California',
584
+ 'BLUE SHIELD ALTERNATE PAYOR': 'Blue Shield of California',
585
+ 'BLUE SHIELD CA': 'Blue Shield of California',
586
+ 'BLUE SHIELD CAL PERS': 'Blue Shield of California',
587
+ 'BLUE SHIELD CALIFORNIA': 'Blue Shield of California',
588
+ 'BLUE SHIELD CALPERS SUPPLEMENT': 'Blue Shield of California',
589
+ 'BLUE SHIELD CCSF BTMG': 'Blue Shield of California',
590
+ 'BLUE SHIELD COMMERCIAL AND EPN': 'Blue Shield of California',
591
+ 'BLUE SHIELD COVER CA': 'Blue Shield of California',
592
+ 'BLUE SHIELD COVERED CA': 'Blue Shield of California',
593
+ 'BLUE SHIELD CPIC/EPO': 'Blue Shield of California',
594
+ 'BLUE SHIELD EPPO': 'Blue Shield of California',
595
+ 'BLUE SHIELD FEDERAL EMPLOYEE PROGRAM': 'Blue Shield of California',
596
+ 'BLUE SHIELD HMO OTHER': 'Blue Shield of California',
597
+ 'BLUE SHIELD HMO POS PAMF MPD': 'Blue Shield of California',
598
+ 'BLUE SHIELD LEASED NETWORK': 'Blue Shield of California',
599
+ 'BLUE SHIELD MCR ADVANTAGE': 'Blue Shield of California',
600
+ 'BLUE SHIELD MEDICARE SUPPLEMENT': 'Blue Shield of California',
601
+ 'BLUE SHIELD MR': 'Blue Shield of California',
602
+ 'BLUE SHIELD OF CALIFORNIA': 'Blue Shield of California',
603
+ 'BLUE SHIELD OUT OF STATE': 'Blue Shield of California',
604
+ 'BLUE SHIELD PPO': 'Blue Shield of California',
605
+ 'BLUE SHIELD SENIOR BROWN & TOLAND MG': 'Blue Shield of California',
606
+ 'BLUE SHIELD SENIOR OTHER': 'Blue Shield of California',
607
+ 'BLUE SHIELD SENIOR PLAN': 'Blue Shield of California',
608
+ 'BLUE SHIELD SFHSS NON-TRIO PAMF': 'Blue Shield of California',
609
+ 'BLUE SHIELD SFHSS NON-TRIO SWBM': 'Blue Shield of California',
610
+ 'BLUE SHIELD SR ALL CARE IPA': 'Blue Shield of California',
611
+ 'BLUE SHIELD SR PAMF': 'Blue Shield of California',
612
+ 'BLUE SHIELD STUDENT HEALTH': 'Blue Shield of California',
613
+ 'BLUE SHIELD TANDEM': 'Blue Shield of California',
614
+ 'BLUE SHIELD TRIO ABMG': 'Blue Shield of California',
615
+ 'BLUE SHIELD TRIO BROWN AND TOLAND': 'Blue Shield of California',
616
+ 'BLUE SHIELD UC DAVIS': 'Blue Shield of California',
617
+ 'BS OUT OF STATE HIGH PERFORMANCE': 'Blue Shield of California',
618
+ 'CALIFORNIA PHYSICIANS\' SERVICE, DBA BLUE SHIELD OF CALIFORNIA': 'Blue Shield of California',
619
+ 'SB SELECT IPA BLUE SHIELD': 'Blue Shield of California',
620
+ 'SFHSS BLUE SHIELD NON-TRIO': 'Blue Shield of California',
621
+
622
+ 'CENTENE': 'Centene',
623
+
624
+ 'ALT CIGNA COMM': 'Cigna',
625
+ 'CIGNA': 'Cigna',
626
+ 'CIGNA BEHAVIORAL HEALTH': 'Cigna',
627
+ 'CIGNA BH': 'Cigna',
628
+ 'CIGNA HEALTHCARE OF CALIFORNIA, INC. AND CIGNA HEALTH AND LIFE INSURANCE COMPANY': 'Cigna',
629
+ 'CIGNA HILL PHYSICIANS': 'Cigna',
630
+ 'CIGNA HMO OTHER': 'Cigna',
631
+ 'CIGNA INDEMNITY': 'Cigna',
632
+ 'CIGNA INTERNATIONAL': 'Cigna',
633
+ 'CIGNA LEASED NETWORK': 'Cigna',
634
+ 'CIGNA NON CONTRACTED': 'Cigna',
635
+ 'CIGNA OTHER': 'Cigna',
636
+ 'CIGNA PPO BEHAVIORAL HEALTH': 'Cigna',
637
+ 'CIGNAKAISER HAWAII': 'Cigna',
638
+
639
+ 'CORVEL': 'CorVel',
640
+ 'CORVEL CORPORATION': 'CorVel',
641
+ 'CORVEL HEALTHCARE CORPORATION': 'CorVel',
642
+
643
+ 'COVENTRY': 'Coventry',
644
+ 'COVENTRY FIRST HEALTH': 'Coventry',
645
+ 'COVENTRY HEALTH CARE NATIONAL NETWORK': 'Coventry',
646
+ 'COVENTRY HEALTHCARE': 'Coventry',
647
+ 'COVENTRY HEALTHCARE WC': 'Coventry',
648
+ 'ENLYTE/GENEX/COVENTRY': 'Coventry',
649
+
650
+ 'EMBLEM': 'EmblemHealth',
651
+ 'EMBLEM HEALTH': 'EmblemHealth',
652
+ 'EMBLEMHEALTH': 'EmblemHealth',
653
+
654
+ 'FIRST HEALTH': 'First Health',
655
+ 'FIRST HEALTH BROADSHIRE CCN CONCENTRA COVENTRY': 'First Health',
656
+ 'FIRST HEALTH MEDICAL RENTAL': 'First Health',
657
+ 'FIRST HEALTH/COVENTRY': 'First Health',
658
+
659
+ 'ALT HEALTH NET COMM': 'Health Net',
660
+ 'CA HEALTH AND WELLNESS': 'Health Net',
661
+ 'CA HEALTH AND WELLNESS COMMERCIAL': 'Health Net',
662
+ 'CA HEALTH AND WELLNESS FOLLOWS HEALTHNET DR': 'Health Net',
663
+ 'CA HEALTH AND WELLNESS MR': 'Health Net',
664
+ 'CALIFORNIA HEALTH WELLNESS': 'Health Net',
665
+ 'FOLLOWS HEALTHNET DR': 'Health Net',
666
+ 'HEALTH NET': 'Health Net',
667
+ 'HEALTH NET CENTENE IFP': 'Health Net',
668
+ 'HEALTH NET CENTENE PURECARE': 'Health Net',
669
+ 'HEALTH NET COMMERCIAL': 'Health Net',
670
+ 'HEALTH NET HMO OTHER': 'Health Net',
671
+ 'HEALTH NET MEDI CAL': 'Health Net',
672
+ 'HEALTH NET MEDI-CAL DMC': 'Health Net',
673
+ 'HEALTH NET OTHER': 'Health Net',
674
+ 'HEALTH NET PAMF MPD': 'Health Net',
675
+ 'HEALTH NET SMARTCARE': 'Health Net',
676
+ 'HEALTH NET SR PLUS': 'Health Net',
677
+ 'HEALTH NET SWBMG': 'Health Net',
678
+ 'HEALTH NET WELLCARE': 'Health Net',
679
+ 'HEALTH NET WELLCARE SR OTHER': 'Health Net',
680
+ 'HEALTH NET/HEALTHY FAMILY/AIM': 'Health Net',
681
+ 'HEALTHNET': 'Health Net',
682
+ 'HEALTHNET ENHANCEDCARE': 'Health Net',
683
+ 'HEALTHNET HMO/PPO': 'Health Net',
684
+ 'HEALTHNET HMO/PPO HILL PHYSICIANS': 'Health Net',
685
+ 'HEALTHNET OF CALIFORNIA, INC.': 'Health Net',
686
+ 'HEALTHNET TAILORED NETWORK': 'Health Net',
687
+
688
+ 'HEALTH LINK': 'HealthLink',
689
+ 'HEALTHLINK': 'HealthLink',
690
+ 'HEALTHLINK CONTRACTED': 'HealthLink',
691
+ 'HEALTHLINK INC': 'HealthLink',
692
+
693
+ 'HAP': 'HAP (Health Alliance Plan)',
694
+ 'HAP-HEALTH ALLIANCE PLAN': 'HAP (Health Alliance Plan)',
695
+ 'HEALTH ALLIANCE PLAN': 'HAP (Health Alliance Plan)',
696
+
697
+ 'HUMANA': 'Humana',
698
+ 'HUMANA CHOICE CARE': 'Humana',
699
+ 'HUMANA CHOICECARE': 'Humana',
700
+ 'HUMANA MEDICAID': 'Humana',
701
+ 'HUMANA MEDICARE SUPPLEMENT': 'Humana',
702
+ 'HUMANA NON-CONTRACTED': 'Humana',
703
+
704
+ 'KAISER': 'Kaiser Permanente',
705
+ 'KAISER FOUNDATION HEALTH PLAN': 'Kaiser Permanente',
706
+ 'KAISER FOUNDATION HEALTH PLAN OF WASHINGTON': 'Kaiser Permanente',
707
+ 'KAISER FOUNDATION HEALTH PLAN, INC.': 'Kaiser Permanente',
708
+ 'KAISER FOUNDATION HOSPITALS': 'Kaiser Permanente',
709
+ 'KAISER HMO NON-CONTRACTED': 'Kaiser Permanente',
710
+ 'KAISER MEDI CAL': 'Kaiser Permanente',
711
+ 'KAISER MEDI-CAL': 'Kaiser Permanente',
712
+ 'KAISER MEDI-CAL FFS': 'Kaiser Permanente',
713
+ 'KAISER MEDICAL': 'Kaiser Permanente',
714
+ 'KAISER NORTHERN CA': 'Kaiser Permanente',
715
+ 'KAISER OUT OF AREA': 'Kaiser Permanente',
716
+ 'KAISER PERMANENTE': 'Kaiser Permanente',
717
+ 'KAISER PERMANENTE SOUTHERN CA': 'Kaiser Permanente',
718
+
719
+ 'MAGELLAN': 'Magellan Health',
720
+ 'MAGELLAN BEHAVIORAL HEALTH SERVICES': 'Magellan Health',
721
+ 'MAGELLAN BH': 'Magellan Health',
722
+ 'MAGELLAN HEALTH': 'Magellan Health',
723
+
724
+ 'MOLINA': 'Molina Healthcare',
725
+ 'MOLINA COMMERCIAL': 'Molina Healthcare',
726
+ 'MOLINA HEALTHCARE': 'Molina Healthcare',
727
+ 'MOLINA HEALTHCARE INC': 'Molina Healthcare',
728
+ 'MOLINA HEALTHCARE OF CALIFORNIA': 'Molina Healthcare',
729
+ 'MOLINA HEALTHCARE OF TEXAS (CLAIMS ONLY)': 'Molina Healthcare',
730
+ 'MOLINA MEDI CAL': 'Molina Healthcare',
731
+ 'MOLINA NV': 'Molina Healthcare',
732
+
733
+ 'BEECH ST': 'MultiPlan',
734
+ 'BEECH STREET': 'MultiPlan',
735
+ 'BEECH STREET CORPORATION, F/K/A CAPP CARE, INC.': 'MultiPlan',
736
+ 'CLARITEV': 'MultiPlan',
737
+ 'MULTIPLAN': 'MultiPlan',
738
+ 'MULTIPLAN COMPLIMENTARY': 'MultiPlan',
739
+ 'MULTIPLAN COMPLIMENTARY MULTIPLAN VALUE POINT': 'MultiPlan',
740
+ 'MULTIPLAN COMPLIMENTARY VALUE POINT': 'MultiPlan',
741
+ 'MULTIPLAN PHCS NETWORK PHCS SAVILITY HEALTHEOS NETWORK': 'MultiPlan',
742
+ 'MULTIPLAN PPO': 'MultiPlan',
743
+ 'MULTIPLAN WC': 'MultiPlan',
744
+ 'MULTIPLAN WORK COMP': 'MultiPlan',
745
+ 'MULTIPLAN WORKERS COMP VALUE POINT': 'MultiPlan',
746
+ 'MULTIPLAN/PHCS': 'MultiPlan',
747
+ 'PHCS': 'MultiPlan',
748
+ 'PHCS MULTIPLAN': 'MultiPlan',
749
+ 'PHCS-MULTIPLAN': 'MultiPlan',
750
+ 'PHCS/PRIVATE HEALTHCARE SYSTEMS': 'MultiPlan',
751
+ 'PRIVATE HEALTHCARE SYS (PHCS)': 'MultiPlan',
752
+ 'PRIVATE HEALTH CARE SYSTEMS': 'MultiPlan',
753
+ 'PRIVATE HEALTHCARE SYSTEM': 'MultiPlan',
754
+ 'PRIVATE HEALTHCARE SYSTEMS': 'MultiPlan',
755
+ 'PRIVATE HEALTHCARE SYSTEMS PHCS': 'MultiPlan',
756
+
757
+ 'OPTUM': 'Optum',
758
+ 'OPTUM HEALTH CARE SOLUTIONS': 'Optum',
759
+ 'OPTUM HEALTH CARE SOLUTIONS, LLC': 'Optum',
760
+ 'OPTUM TRANSPLANTS OON': 'Optum',
761
+ 'OPTUMCARE': 'Optum',
762
+
763
+ 'OSCAR HEALTH': 'Oscar Health',
764
+ 'OSCAR HEALTH PLAN': 'Oscar Health',
765
+ 'OSCAR SELECT': 'Oscar Health',
766
+
767
+ 'UNITED BEHAVIORAL HEALTH': 'United Behavioral Health',
768
+ 'UNITED BH': 'United Behavioral Health',
769
+
770
+ 'AARP MEDICARE ADVANTAGE CHOICE': 'United Healthcare',
771
+ 'AARP MEDICARE COMPLETE UHC WEST': 'United Healthcare',
772
+ 'ALL SAVERS': 'United Healthcare',
773
+ 'ALT UNITED HEALTHCARE COMM': 'United Healthcare',
774
+ 'SB SELECT IPA UNITED HEALTHCARE': 'United Healthcare',
775
+ 'SIERRA HEALTH SERVICES': 'United Healthcare',
776
+ 'SIERRA HEALTH SERVICESUHC': 'United Healthcare',
777
+ 'UHC': 'United Healthcare',
778
+ 'UHC BTMG EAST (ABMG) HMO CAP': 'United Healthcare',
779
+ 'UHC CHOICE': 'United Healthcare',
780
+ 'UHC DOCTORS PLAN': 'United Healthcare',
781
+ 'UHC GLOBAL': 'United Healthcare',
782
+ 'UHC GOULD MG': 'United Healthcare',
783
+ 'UHC HMO OTHER MEDICARE SOLUTIONS': 'United Healthcare',
784
+ 'UHC NON-PARTICIPATING': 'United Healthcare',
785
+ 'UHC OF CALIFORNIA, DBA UNITEDHEALTHCARE OF CALIFORNIA AND FKA PACIFICCARE OF CALIFORNIA': 'United Healthcare',
786
+ 'UHC OTHER': 'United Healthcare',
787
+ 'UHC OXFORD HEALTH PLAN': 'United Healthcare',
788
+ 'UHC SR AFFINITY MG': 'United Healthcare',
789
+ 'UHC SR ALLCARE': 'United Healthcare',
790
+ 'UHC SR BTMG EAST (ABMG)': 'United Healthcare',
791
+ 'UHC SR HPMG': 'United Healthcare',
792
+ 'UHC SR PAMF MG': 'United Healthcare',
793
+ 'UHC SUREST': 'United Healthcare',
794
+ 'UHC SVALLIANCE': 'United Healthcare',
795
+ 'UHC VA CCN': 'United Healthcare',
796
+ 'UHC WEST COMM': 'United Healthcare',
797
+ 'UHP HEALTHCARE': 'United Healthcare',
798
+ 'UNITED': 'United Healthcare',
799
+ 'UNITED HEALTH CARE': 'United Healthcare',
800
+ 'UNITED HEALTH CARE PACIFICARE': 'United Healthcare',
801
+ 'UNITED HEALTHCARE': 'United Healthcare',
802
+ 'UNITED HEALTHCARE EMPIRE PLAN': 'United Healthcare',
803
+ 'UNITED HEALTHCARE EXCHANG': 'United Healthcare',
804
+ 'UNITED HEALTHCARE GLOBAL': 'United Healthcare',
805
+ 'UNITED HEALTHCARE GROUP': 'United Healthcare',
806
+ 'UNITED HEALTHCARE MCD': 'United Healthcare',
807
+ 'UNITED HEALTHCARE MEDICAR': 'United Healthcare',
808
+ 'UNITED HEALTHCARE NON CONTRACTED': 'United Healthcare',
809
+ 'UNITED HEALTHCARE OTHER': 'United Healthcare',
810
+ 'UNITED HEALTHCARE SUREST': 'United Healthcare',
811
+ 'UNITED HEATHCARE GLOBAL': 'United Healthcare',
812
+ 'UNITED SCO AND ONE CARE': 'United Healthcare',
813
+ 'UNITEDHEALTHCARE': 'United Healthcare',
814
+ 'UNITEDHEALTHCARE HMO HILL PHYSICIANS': 'United Healthcare',
815
+ 'UNITEDHEALTHCARE WEST': 'United Healthcare',
816
+
817
+ # ---- Government programs ----
818
+ 'CA PRISON HEALTH CARE SERVICES': 'CA Prison Health Care Services',
819
+
820
+ 'CHAMPVA': 'CHAMPVA',
821
+
822
+ 'CALIFORNIA CORRECTIONAL HEALTH': 'Department of Corrections',
823
+ 'CALIFORNIA CORRECTIONAL HEALTH CARE HEALTH NET FEDERAL SERVICES': 'Department of Corrections',
824
+ 'DEPARTMENT OF CORRECTIONS': 'Department of Corrections',
825
+ 'DEPARTMENT OF CORRECTIONS NETWORK PROVIDER': 'Department of Corrections',
826
+ 'DEPT OF CORRECTION': 'Department of Corrections',
827
+ 'DEPT OF CORRECTIONS NETWORK PROV LLC': 'Department of Corrections',
828
+
829
+ 'FEDERAL CORRECTION INSTITUTE': 'Federal Correction Institute',
830
+
831
+ 'MEDI CAL': 'Medi-Cal',
832
+ 'MEDI-CAL NEMS PACE': 'Medi-Cal',
833
+ 'MEDI-CAL OP': 'Medi-Cal',
834
+ 'MEDICAL': 'Medi-Cal',
835
+ 'MEDICAL SHARE OF COST': 'Medi-Cal',
836
+
837
+ 'MEDICAID OUT OF STATE': 'Medicaid',
838
+
839
+ 'MEDICARE': 'Medicare',
840
+ 'MEDICARE ADVANTAGE OTHER': 'Medicare',
841
+ 'MEDICARE PART B ONLY': 'Medicare',
842
+
843
+ 'TRICARE': 'TRICARE',
844
+ 'TRICARE FOR': 'TRICARE',
845
+ 'TRICARE HEALTHNET': 'TRICARE',
846
+ 'TRICARE RESERVE': 'TRICARE',
847
+ 'TRICARE SELECT': 'TRICARE',
848
+ 'TRICARE WEST': 'TRICARE',
849
+ 'TRICARE WEST HEALTHNET': 'TRICARE',
850
+ 'TRIWEST COMMUNITY CARE NETWORK': 'TRICARE',
851
+ 'TRIWEST COMMUNITY CARE NETWORK COMMERCIAL': 'TRICARE',
852
+ 'TRIWEST HEALTHCARE ALLIANCE': 'TRICARE',
853
+
854
+ 'DEPARTMENT OF VETERANS AFFAIRS MI': 'Veterans Administration',
855
+ 'DEPARTMENT OF VETERANS AFFAIRS': 'Department of Veterans Affairs',
856
+ 'PGBA VA COMMUNITY CARE PROGRAM': 'Veterans Administration',
857
+ 'VA (TRIWEST CCN)': 'Veterans Administration',
858
+ 'VA ADMINISTRATION': 'Veterans Administration',
859
+ 'VA COMMUNITY CARE NETWORK': 'Veterans Administration',
860
+ 'VETERANS ADMINISTRATION': 'Veterans Administration',
861
+
862
+ 'ADVA NET WC': 'Workers\' Comp',
863
+ 'ADVA NET WC PARADIGM SPECIALTY NETWORK': 'Workers\' Comp',
864
+ 'ADVA-NET WORK COMP': 'Workers\' Comp',
865
+ 'CAREWORKS WORK COMP': 'Workers\' Comp',
866
+ 'WORKERS COMP': 'Workers\' Comp',
867
+ 'WORKER\'S COMP': 'Workers\' Comp',
868
+ 'WORKERS COMPENSATION': 'Workers\' Comp',
869
+ 'WORKERS\' COMP': 'Workers\' Comp',
870
+
871
+ # ---- Regional / local / specialty plans ----
872
+ 'ALT': 'ALT Medicare',
873
+ 'ALT MEDICARE': 'ALT Medicare',
874
+ 'ALT MEDICARE A/B REBILL': 'ALT Medicare',
875
+ 'APS HEALTHCARE': 'APS Healthcare',
876
+ 'APS HEALTHCARE BETHESDA PSYCH': 'APS Healthcare',
877
+ 'ADVENTIST HEALTH': 'Adventist Health',
878
+ 'ADVENTIST HEALTH PLAN': 'Adventist Health',
879
+ 'AFFINITY MED GRP BLUE CROSS': 'Affinity Medical Group',
880
+ 'AFFINITY MED GRP BLUE SHIELD': 'Affinity Medical Group',
881
+ 'AFFINITY MED GRP HEALTH NET': 'Affinity Medical Group',
882
+ 'AFFINITY MED GRP UNITED HEALTHCARE': 'Affinity Medical Group',
883
+ 'AFFINITY MEDICAL GROUP': 'Affinity Medical Group',
884
+ 'AFFINITY MEDICAL GROUP COMM': 'Affinity Medical Group',
885
+ 'AFFINITY MG UC BLUE AND GOLD HEALTH NET': 'Affinity Medical Group',
886
+ 'ALT AFFINITY MED GRP': 'Affinity Medical Group',
887
+ 'ALT AFFINITY MEDICAL GRP COMM HMO BILLABLE': 'Affinity Medical Group',
888
+
889
+ 'AITHER HEALTH': 'Aither Health',
890
+ 'ALAMEDA ALLIANCE': 'Alameda Alliance',
891
+ 'CHCN ALAMEDA ALLIANCE': 'Alameda Alliance',
892
+ 'CHCN ALAMEDA ALLIANCE GROUP CARE': 'Alameda Alliance',
893
+ 'ALIGNMENT': 'Alignment Health Plan',
894
+ 'ALIGNMENT HEALTH PLAN': 'Alignment Health Plan',
895
+ 'ALIGNMENT MCARE ADV': 'Alignment Health Plan',
896
+ 'ALL CARE IPA ALIGNMENT MCARE ADV': 'AllCare IPA',
897
+ 'ALL CARE IPA BLS TRIO': 'AllCare IPA',
898
+ 'ALL CARE IPA HUMANA': 'AllCare IPA',
899
+ 'ALLCARE': 'AllCare IPA',
900
+ 'ALLCARE CCO': 'AllCare IPA',
901
+ 'ALLCARE IPA': 'AllCare IPA',
902
+ 'ALLCARE MG BLUE CROSS': 'AllCare IPA',
903
+ 'ALLCARE MG UNITED HEALTHCARE': 'AllCare IPA',
904
+ 'ALT ALL CARE IPA': 'AllCare IPA',
905
+ 'ALT ALL CARE IPA COMM': 'AllCare IPA',
906
+
907
+ 'ALLIANZ': 'Allianz',
908
+ 'ALLIED': 'Allied Benefit Systems',
909
+ 'ALLIED AFFORDABLE CARE PLAN': 'Allied Benefit Systems',
910
+ 'ALLIED BENEFIT SYSTEM, IN': 'Allied Benefit Systems',
911
+ 'ALLIED BENEFITS SYSTEM': 'Allied Benefit Systems',
912
+ 'ALLIED PACIFIC OF CALIFORNIA': 'Allied Benefit Systems',
913
+
914
+ 'ALLYALIGN HEALTH': 'AllyAlign Health',
915
+ 'ALPHA CARE': 'Alpha Care Medical Group',
916
+ 'ALPHA CARE MEDICAL GROUP': 'Alpha Care Medical Group',
917
+ 'ALTA BATES MEDICAL GRP ALT': 'Alta Bates Medical Group',
918
+ 'ALTAMED': 'AltaMed',
919
+ 'ALTAMED HEALTH SERVICES': 'AltaMed',
920
+ 'AMERIHEALTH': 'AmeriHealth',
921
+ 'AMERICAS CHOICE PROVIDER NETWORK': 'Americas Choice Provider Network',
922
+ 'AMERICAS CHOICE PROVIDER NETWORK AUTO': 'Americas Choice Provider Network',
923
+ 'AMERICAS CHOICE PROVIDER NETWORK MR': 'Americas Choice Provider Network',
924
+ 'AMERICAS CHOICE PROVIDER NETWORK WC': 'Americas Choice Provider Network',
925
+ 'AMERICAS CHOUCE PROVIDER NETWORK': 'Americas Choice Provider Network',
926
+
927
+ 'ASPIRE': 'Aspire Health Plan',
928
+ 'ASTIVA HEALTH': 'Astiva Health',
929
+ 'ASTIVA HEALTH SR': 'Astiva Health',
930
+ 'BMC HEALTHNET': 'BMC HealthNet',
931
+ 'BMC HEALTHNET EXCH SILVER': 'BMC HealthNet',
932
+ 'BMC HEALTHNET EXCHANGE': 'BMC HealthNet',
933
+ 'BOSTON MEDICAL CTR DUAL': 'BMC HealthNet',
934
+ 'BOSTON MEDICAL MEDICAID': 'BMC HealthNet',
935
+
936
+ 'BRMS': 'BRMS',
937
+ 'BANNER': 'Banner Health',
938
+ 'BEACON HEALTH OPTIONS': 'Beacon Health Strategies',
939
+ 'BEACON HEALTH STRATEGIES': 'Beacon Health Strategies',
940
+ 'BORREGO COMMUNITY HEALTH': 'Borrego Community Health',
941
+ 'BRAND NEW DAY': 'Brand New Day',
942
+ 'BRAND NEW DAY MR': 'Brand New Day',
943
+ 'BRANDMAN CENTERS FOR SENIOR CARE': 'Brandman Centers for Senior Care',
944
+ 'BRIGHT HEALTH': 'Bright Health Plan',
945
+ 'BRIGHT HEALTH PHYSICIANS OF PIH': 'Bright Health Plan',
946
+ 'BRIGHT HEALTH PLAN': 'Bright Health Plan',
947
+ 'ALT BROWN & TOLAND MG': 'Brown & Toland',
948
+ 'ALT BROWN AND TOLAND MED GRP COMM': 'Brown & Toland',
949
+ 'ALT BROWN AND TOLAND MED GRP MCAL': 'Brown & Toland',
950
+ 'ALT BROWN TOLAND MG SR HEALTH SERVICES': 'Brown & Toland',
951
+ 'ALT BTMG EAST (ABMG) COMM': 'Brown & Toland',
952
+ 'ALT SR BTMG EAST ABMG': 'Brown & Toland',
953
+ 'BROWN & TOLAND': 'Brown & Toland',
954
+ 'BROWN & TOLAND HEALTH SERVICES': 'Brown & Toland',
955
+ 'BROWN & TOLAND MED GRP BC': 'Brown & Toland',
956
+ 'BROWN & TOLAND MG ALT': 'Brown & Toland',
957
+ 'BROWN &TOLAND UC BLUE AND GOLD HEALTH NE': 'Brown & Toland',
958
+ 'BROWN AND TOLAN': 'Brown & Toland',
959
+ 'BROWN AND TOLAND': 'Brown & Toland',
960
+ 'BROWN AND TOLAND BLUE CROSS': 'Brown & Toland',
961
+ 'BROWN AND TOLAND EAST (ABMG) BLS': 'Brown & Toland',
962
+ 'BROWN AND TOLAND EAST (ABMG) BLS CPRS': 'Brown & Toland',
963
+ 'BROWN AND TOLAND MED GRP BLS': 'Brown & Toland',
964
+ 'BROWN AND TOLAND MED GRP BLS TRIO': 'Brown & Toland',
965
+ 'BROWN AND TOLAND MED GRP CIGNA': 'Brown & Toland',
966
+ 'BROWN AND TOLAND MED GRP HEALTH NET': 'Brown & Toland',
967
+ 'BROWN AND TOLAND MED GRP WELLCARE': 'Brown & Toland',
968
+ 'BROWN AND TOLAND MG ALIGNMENT MCARE ADV': 'Brown & Toland',
969
+ 'BROWN AND TOLAND MG BLS CAL PERS': 'Brown & Toland',
970
+ 'BROWN AND TOLAND UNITED HEALTHCARE': 'Brown & Toland',
971
+ 'BROWN TOLAND': 'Brown & Toland',
972
+ 'BTMG EAST (ABMG) BLUE CROSS': 'Brown & Toland',
973
+ 'BTMG EAST (ABMG) UC BLUE/GOLD HEALTH NET': 'Brown & Toland',
974
+ 'BTMG EAST (ABMG) UNITED HEALTHCARE': 'Brown & Toland',
975
+
976
+ 'ALT CCHCA-AAMG': 'CCHCA-AAMG',
977
+ 'ALT CCHCA-AAMG MCAL': 'CCHCA-AAMG',
978
+ 'CCHCA-AAMG BLUE CROSS': 'CCHCA-AAMG',
979
+ 'CCHP CHARITY': 'CCHP Charity',
980
+ 'CNA': 'CNA',
981
+ 'CNA (MAILHANDLERS)': 'CNA',
982
+ 'COVID-19 HRSA UNINSURED FUND': 'COVID-19 HRSA Uninsured Fund',
983
+ 'COVID19 HRSA UNINSURED TESTING AND TREATMENT FUND': 'COVID-19 HRSA Uninsured Fund',
984
+ 'CALOPTIMA': 'CalOptima',
985
+ 'CALVIVA': 'CalViva Health',
986
+ 'CALVIVA HEALTH': 'CalViva Health',
987
+ 'CALVOS SELECTCARE': 'CalVos SelectCare',
988
+ 'CALIFORNIA CHILDRENS SERVICES': 'California Childrens Services',
989
+ 'CA TRANSPLANT DONOR NETWORK': 'California Transplant Donor Network',
990
+ 'CALIFORNIA TRANSPLANT DONOR COMM': 'California Transplant Donor Network',
991
+ 'ALT CANOPY HEALTH': 'Canopy Health',
992
+ 'CANOPY': 'Canopy Health',
993
+ 'CANOPY HEALTH': 'Canopy Health',
994
+ 'CANOPY HILL PHYSICIANS': 'Canopy Health',
995
+
996
+ 'CANOPY HN': 'Canopy Health (Health Net)',
997
+ 'CANOPY UHC': 'Canopy Health (United Healthcare)',
998
+ 'CANOPY UNITED HEALTHCARE': 'Canopy Health (United Healthcare)',
999
+ 'CAPNET IPA': 'CapNet IPA',
1000
+ 'CARE 1ST': 'Care 1st Health Plan',
1001
+ 'CARE 1ST HEALTH PLAN': 'Care 1st Health Plan',
1002
+ 'CARE1ST HEALTH PLAN': 'Care 1st Health Plan',
1003
+ 'CARE ADVANTAGE': 'Care Advantage',
1004
+ 'CARE ADVANTAGE SR PLAN': 'Care Advantage',
1005
+ 'CARECENTRIX': 'CareCentrix',
1006
+ 'CAREMORE': 'CareMore',
1007
+ 'CARENET MEDICAID': 'CareNet',
1008
+ 'FAMILY CARENET': 'CareNet',
1009
+ 'CARELON BEHAVIORAL HEALTH NONCONTRACTED': 'Carelon Behavioral Health',
1010
+ 'CENTER FOR ELDERS INDEPENDENCE': 'Center for Elders Independence',
1011
+ 'CCAH': 'Central California Alliance for Health',
1012
+ 'CENTRAL CA ALLIANCE FOR HEALTH DR': 'Central California Alliance for Health',
1013
+ 'CENTRAL CA PHYS PARTNERS HEALTH NET': 'Central California Alliance for Health',
1014
+ 'CENTRAL CALIFORNIA ALLIANCE FOR HEALTH': 'Central California Alliance for Health',
1015
+
1016
+ 'ALT CENTRAL HEALTH MEDICARE PLAN': 'Central Health Plan',
1017
+ 'CENTAL HEALTH PLAN': 'Central Health Plan',
1018
+ 'CENTRAL HEALTH MEDICARE PLAN': 'Central Health Plan',
1019
+ 'CENTRAL HEALTH PLAN': 'Central Health Plan',
1020
+ 'CENTRAL HEALTH PLAN OF CALIFORNIA': 'Central Health Plan',
1021
+ 'CENTRAL HLTH': 'Central Health Plan',
1022
+
1023
+ 'CENTRAL VALLEY MEDICAL': 'Central Valley PACE',
1024
+ 'CENTRAL VALLEY PACE': 'Central Valley PACE',
1025
+ 'CHAMPION HEALTH PLAN': 'Champion Health Plan',
1026
+ 'ALT CHINESE COMMUNITY HEALTH PLAN MCAL': 'Chinese Community Health Plan',
1027
+ 'ALT JADE MG CHINESE COMMUNITY HP': 'Chinese Community Health Plan',
1028
+ 'CHINESE COMMUNITY': 'Chinese Community Health Plan',
1029
+ 'CHINESE COMMUNITY HEALTH PLAN': 'Chinese Community Health Plan',
1030
+ 'CHINESE COMMUNITY HEALTH PLAN ACTIVE CHO': 'Chinese Community Health Plan',
1031
+ 'CHINESE COMMUNITY HEALTH PLAN COVER CA H': 'Chinese Community Health Plan',
1032
+ 'CHINESE COMMUNITY HEALTH PLAN SR JADE': 'Chinese Community Health Plan',
1033
+ 'CHINESE COMMUNITY HP': 'Chinese Community Health Plan',
1034
+ 'CHINESE HP': 'Chinese Community Health Plan',
1035
+ 'CHN SF HEALTH PLAN': 'Chinese Community Health Plan',
1036
+ 'JADE MG CHINESE COMMUNITY HP SR': 'Chinese Community Health Plan',
1037
+
1038
+ 'CHOICECARE NETWORK': 'ChoiceCare Network',
1039
+ 'CLAREMONT BEHAVIORAL SERVICES': 'Claremont Behavioral Services',
1040
+ 'CLEVER CARE': 'Clever Care Health Plan',
1041
+ 'CLOVER INSURANCE CO': 'Clover Health',
1042
+ 'COMMONWEALTH ALLIANCE MCR': 'Commonwealth Care Alliance',
1043
+ 'COMMONWEALTH CARE': 'Commonwealth Care Alliance',
1044
+ 'COMMONWEALTH CARE ALLIANCE': 'Commonwealth Care Alliance',
1045
+ 'COMMONWEALTH CARE DUAL': 'Commonwealth Care Alliance',
1046
+ 'COMMONWEALTH CARE MEDICAR': 'Commonwealth Care Alliance',
1047
+
1048
+ 'COMMUNITY HEALTH CHOICE': 'Community Health Choice',
1049
+ 'COMMUNITY HOSPITAL OF MONTEREY PENINSULA': 'Community Hospital of Monterey Peninsula',
1050
+ 'COMPCARE': 'CompCare',
1051
+ 'CONCERTOPACE OF LOS ANGELES, LLC': 'ConcertoPACE',
1052
+ 'CONNECTED CARE': 'Connected Care',
1053
+ 'CONNECTICARE': 'ConnectiCare',
1054
+ 'CONTIGO HEALTH': 'Contigo Health',
1055
+ 'CONTRA COSTA COUNTY JAIL': 'Contra Costa County Jail',
1056
+ 'CONTRA COSTA': 'Contra Costa Health Plan',
1057
+ 'CONTRA COSTA COUNTY EMPLOYEES': 'Contra Costa Health Plan',
1058
+ 'CONTRA COSTA HEALTH PLAN': 'Contra Costa Health Plan',
1059
+ 'CONTRA COSTA HEALTH PLAN BASIC HEALTH CARE CCHP': 'Contra Costa Health Plan',
1060
+ 'CONTRA COSTA HEALTH PLAN MEDI CAL': 'Contra Costa Health Plan',
1061
+ 'CONTRA COSTA HEALTH PLAN MEDICAL': 'Contra Costa Health Plan',
1062
+
1063
+ 'COORDINATED CARE': 'Coordinated Care',
1064
+ 'COUNTY OF SANTA CLARA': 'County of Santa Clara',
1065
+ 'COVENTRY (CCN/FIRST HEALTH)': 'Coventry (First Health)',
1066
+ 'DEAN HEALTH PLAN': 'Dean Health Plan',
1067
+ 'DELTA HEALTH SYSTEM': 'Delta Health Systems',
1068
+ 'DELTA HEALTH SYSTEMS': 'Delta Health Systems',
1069
+ 'ALT DIGNITY HEALTHCARE COMM': 'Dignity Health',
1070
+ 'DIGNITY HEALTH': 'Dignity Health',
1071
+ 'DIGNITY HEALTH MR': 'Dignity Health',
1072
+ 'DONOR NETWORK WEST': 'Donor Network West',
1073
+ 'EMI HEALTH': 'EMI Health',
1074
+ 'EASY CHOICE': 'Easy Choice Health Plan',
1075
+ 'EASY CHOICE HEALTH PLAN': 'Easy Choice Health Plan',
1076
+ 'EMPIRE PLAN': 'Empire Plan',
1077
+ 'EPIC HEALTH PLAN': 'Epic Health Plan',
1078
+ 'EPIC HEALTH PLAN IPA': 'Epic Health Plan',
1079
+ 'ESSENCE HEALTHCARE': 'Essence Healthcare',
1080
+ 'ETERNAL HEALTHCARE MCR': 'Eternal Healthcare',
1081
+ 'FALLON COMMUNITY HEALTH': 'Fallon Health',
1082
+ 'FALLON EXCHANGE': 'Fallon Health',
1083
+ 'FALLON MEDICAID': 'Fallon Health',
1084
+ 'FALLON PACE': 'Fallon Health',
1085
+ 'FALLON SENIOR': 'Fallon Health',
1086
+ 'FALLON SENIOR PLAN': 'Fallon Health',
1087
+
1088
+ 'FORTIFIED PROVIDER NETWORK': 'Fortified Provider Network',
1089
+ 'GEHA': 'GEHA',
1090
+ 'GMMI INC': 'GMMI',
1091
+ 'GALAXY HEALTH NETWORK': 'Galaxy Health Network',
1092
+ 'GLOBAL EXCEL MANAGEMENT': 'Global Excel Management',
1093
+ 'GLOBAL EXCEL MANAGEMENT INC': 'Global Excel Management',
1094
+ 'GLOBAL EXCEL MANGEMENT': 'Global Excel Management',
1095
+ 'GLOBAL XL MANAGEMENT': 'Global Excel Management',
1096
+
1097
+ 'GOLD COAST HEALTH PLAN': 'Gold Coast Health Plan',
1098
+ 'VENTURA COUNTY MEDI-CAL MANAGED CARE COMMISSION (DBA GOLD COAST HEALTH PLAN)': 'Gold Coast Health Plan',
1099
+ 'GOLDEN STATE': 'Golden State Medicare',
1100
+ 'GOLDEN STATE MEDICARE': 'Golden State Medicare',
1101
+ 'GRAVIE': 'Gravie',
1102
+ 'GRAVIE ADMINISTRATIVE': 'Gravie',
1103
+ 'GRAVIE ADMINISTRATIVE SERVICES': 'Gravie',
1104
+ 'GRAVIE INC': 'Gravie',
1105
+ 'GRAVIE INS': 'Gravie',
1106
+ 'GRAVIES ADMINISTRATIVE SERVICES': 'Gravie',
1107
+
1108
+ 'HARVARD PILGRIM': 'Harvard Pilgrim Healthcare',
1109
+ 'HARVARD PILGRIM EXCHANGE': 'Harvard Pilgrim Healthcare',
1110
+ 'HARVARD PILGRIM HEALTHCAR': 'Harvard Pilgrim Healthcare',
1111
+ 'HARVARD PILGRIM HEALTHCARE': 'Harvard Pilgrim Healthcare',
1112
+ 'UNITED HARVARD PILGRAM PC': 'Harvard Pilgrim Healthcare',
1113
+ 'UNITED HARVARD PILGRIM PC': 'Harvard Pilgrim Healthcare',
1114
+
1115
+ 'HEALTH MANAGEMENT NETWORK': 'Health Management Network',
1116
+ 'HEALTH NEW ENGLAND': 'Health New England',
1117
+ 'HEALTH NEW ENGLAND EXCHAN': 'Health New England',
1118
+ 'HEALTH NEW ENGLAND EXCHGE': 'Health New England',
1119
+ 'HEALTH NEW ENGLAND MEDICA': 'Health New England',
1120
+ 'HEALTH NEWENGLAND MEDICAI': 'Health New England',
1121
+
1122
+ 'HEALTH PLAN OF NEVADA': 'Health Plan of Nevada',
1123
+ 'HEALTH PLAN OF SAN JOAQUIN': 'Health Plan of San Joaquin',
1124
+ 'HEALTH PLAN SAN JOAQUIN': 'Health Plan of San Joaquin',
1125
+ 'HEALTH PLAN SAN JOAQUIN COUNTY': 'Health Plan of San Joaquin',
1126
+ 'HEALTH PLAN OF SAN MATEO': 'Health Plan of San Mateo',
1127
+ 'HEALTH PLAN SAN MATEO': 'Health Plan of San Mateo',
1128
+ 'HPSM': 'Health Plan of San Mateo',
1129
+ 'SAN MATEO HEALTH COMMISSION': 'Health Plan of San Mateo',
1130
+
1131
+ 'HEALTH PLAN INC.': 'Health Plans Inc',
1132
+ 'HEALTH PLANS INC': 'Health Plans Inc',
1133
+ 'HEALTH COMP': 'HealthComp',
1134
+ 'HEALTHCOMP': 'HealthComp',
1135
+ 'HEALTH SMART INTERPLAN': 'HealthSmart',
1136
+ 'HEALTHSMART': 'HealthSmart',
1137
+ 'HEALTHSMART PKA INTERPLAN': 'HealthSmart',
1138
+ 'HEALTHSMART - PKA INTERPLAN': 'HealthSmart',
1139
+ 'HEALTHSMART INTERPLAN': 'HealthSmart',
1140
+ 'HEALTHSMART PREFERRED NETWORK': 'HealthSmart',
1141
+
1142
+ 'HEALTHCARE PARTNERS': 'Healthcare Partners',
1143
+ 'HEALTHKEEPERS MEDICAID': 'Healthkeepers',
1144
+ 'HERITAGE': 'Heritage Provider Network',
1145
+ 'HERITAGE PROVIDER NETWORK': 'Heritage Provider Network',
1146
+ 'HERITAGE PROVIDER NETWORK, INC.': 'Heritage Provider Network',
1147
+ 'ALT HILL PHYS MED GRP COMM': 'Hill Physicians',
1148
+ 'HILL PHYS MED GRP BLUE SHIELD': 'Hill Physicians',
1149
+ 'HILL PHYS MED GRP CENTRAL HEALTH': 'Hill Physicians',
1150
+ 'HILL PHYS MED GRP CHINESE COMMUNITY HP': 'Hill Physicians',
1151
+ 'HILL PHYS MED GRP UNITED HEALTHCARE': 'Hill Physicians',
1152
+ 'HILL PHYS MG BLUE SHIELD TRIO': 'Hill Physicians',
1153
+ 'HILL PHYS MG SFHSS BLS SFHSS': 'Hill Physicians',
1154
+ 'HILL PHYSCN MG UC BLUE & GOLD HEALTH NET': 'Hill Physicians',
1155
+ 'HILL PHYSICIANS': 'Hill Physicians',
1156
+ 'HILL PHYSICIANS CARE SOLUTIONS': 'Hill Physicians',
1157
+ 'HILL PHYSICIANS MG BLUE CROSS': 'Hill Physicians',
1158
+ 'HILL PHYSICIANS MG BLUE SHIELD': 'Hill Physicians',
1159
+ 'HILL PHYSICIANS MG HEALTH NET': 'Hill Physicians',
1160
+
1161
+ 'HOME STATE HEALTH PLAN': 'Home State Health Plan',
1162
+ 'HOMETOWN HEALTH': 'Hometown Health',
1163
+ 'ASSISTED HOSPICE CARE': 'Hospice',
1164
+ 'BRISTOL HOSPICE': 'Hospice',
1165
+ 'BUENA VISTA HOSPICE': 'Hospice',
1166
+ 'HOSPICE OF THE VALLEY': 'Hospice',
1167
+ 'MISSION HH HOSPICE': 'Hospice',
1168
+
1169
+ 'HOSPICE OF EAST BAY': 'Hospice of East Bay',
1170
+ 'IMAGINE 360 MEDICAL PLAN NETWORK ACCESS': 'Imagine360',
1171
+ 'IMAGINE360': 'Imagine360',
1172
+ 'IMPERIAL HEALTH': 'Imperial Health Plan',
1173
+ 'IEHP': 'Inland Empire Health Plan',
1174
+ 'INLAND EMPIRE HEALTH PLAN': 'Inland Empire Health Plan',
1175
+ 'INTEGRATED HEALTH PLAN': 'Integrated Health Plan',
1176
+ 'INTEGRATED HEALTHPLAN': 'Integrated Health Plan',
1177
+ 'INTER VALLEY HEALTH PLAN': 'Inter Valley Health Plan',
1178
+ 'INTERPLAN': 'Interplan',
1179
+ 'INTERPLAN B-2': 'Interplan',
1180
+ 'INTERPLAN B-4': 'Interplan',
1181
+ 'INTERPLAN CORPORATION': 'Interplan',
1182
+ 'INTERPLAN HEALTH GROUP': 'Interplan',
1183
+
1184
+ 'JOHN MUIR': 'John Muir Health',
1185
+ 'JOHN MUIR HLTH NTWK UNITED HEALTHCARE': 'John Muir Health',
1186
+ 'JOHN MUIR MG BLUE CROSS': 'John Muir Health',
1187
+ 'JOHN MUIR MG BLUE SHIELD': 'John Muir Health',
1188
+ 'JOHN MUIR MG CANOPY HEALTH UHC': 'John Muir Health',
1189
+ 'JOHN MUIR MG HEALTH NET': 'John Muir Health',
1190
+
1191
+ 'LA CARE': 'L.A. Care Health Plan',
1192
+ 'LA CARE HEALTH': 'L.A. Care Health Plan',
1193
+ 'LA CARE HEALTH PLAN': 'L.A. Care Health Plan',
1194
+ 'LUMINARE HEALTH': 'Luminare Health',
1195
+ 'MVP HEALTHCARE': 'MVP Healthcare',
1196
+ 'MAIL HANDLERS BENEFIT PLAN': 'Mail Handlers Benefit Plan',
1197
+ 'MHBP': 'Mail Handlers Benefit Plan',
1198
+ 'MANAGED HEALTH NETWORK': 'Managed Health Network',
1199
+ 'MHN': 'Managed Health Network',
1200
+ 'MARIN CANCER CARE': 'Marin Cancer Care',
1201
+ 'MASS ADVANTAGE': 'Mass Advantage',
1202
+ 'MASS GENERAL BRIGHAM': 'Mass General Brigham',
1203
+ 'MASS GENERAL BRIGHAM EXCH': 'Mass General Brigham',
1204
+ 'MASS GENERAL BRIGHAM MCD': 'Mass General Brigham',
1205
+ 'MEDCORE': 'Medcore',
1206
+ 'MEDCORE MG ALIGNMENT MCARE ADV': 'Medcore',
1207
+ 'MEDICARE RAILROAD': 'Medicare Railroad',
1208
+ 'MEDIGAP': 'Medigap',
1209
+ 'MERCY PHYS MED GRP UHC': 'Mercy Physicians Medical Group',
1210
+ 'MERITAGE': 'Meritage Medical Network',
1211
+ 'MERITAGE HEALTH PLAN': 'Meritage Medical Network',
1212
+ 'MERITAGE MEDICAL NETWORK': 'Meritage Medical Network',
1213
+ 'MERITAGE MEDICAL NETWORK BS TRIO': 'Meritage Medical Network',
1214
+ 'MERITAGE MEDICAL NETWORK HUMANA': 'Meritage Medical Network',
1215
+ 'MERITAGE MEDICAL NETWORK UHC COMM': 'Meritage Medical Network',
1216
+ 'MERITAGE MG BLUE SHIELD': 'Meritage Medical Network',
1217
+
1218
+ 'MERITAIN': 'Meritain Health',
1219
+ 'MERITAIN HEALTH': 'Meritain Health',
1220
+ 'MCLAREN HEALTH PLAN': 'McLaren Health Plan',
1221
+ 'MCLAREN HEALTH PLAN INC': 'McLaren Health Plan',
1222
+ 'MCLAREN HEALTHPLAN': 'McLaren Health Plan',
1223
+ 'MODA': 'Moda Health',
1224
+ 'MODA HEALTH': 'Moda Health',
1225
+ 'MUTUAL OF OMAHA': 'Mutual of Omaha',
1226
+ 'MUTUAL OF OMAHA MEDICARE SUPPLEMENT': 'Mutual of Omaha',
1227
+ 'NAPHCARE': 'NaphCare',
1228
+ 'NATIONAL PROVIDER NETWORK/PLANCARE AMERICA': 'National Provider Network',
1229
+ 'NETCARE': 'Netcare',
1230
+ 'NET HEALTH COMMONWEALTH C': 'Network Health',
1231
+ 'NETWORK HEALTH': 'Network Health',
1232
+ 'NETWORK HEALTH BELOW 65 D': 'Network Health',
1233
+ 'NETWORK HEALTH EXCHANGE': 'Network Health',
1234
+
1235
+ 'NETWORK BY DESIGN': 'Networks By Design',
1236
+ 'NETWORK BY DESIGN WORKERS COMP': 'Networks By Design',
1237
+ 'NETWORKS BY DESIGN': 'Networks By Design',
1238
+ 'NIVANO PHYS MED GRP BLUE CROSS': 'Nivano Physicians Medical Group',
1239
+ 'NIVANO PHYSICIANS MED GRP BLUE CROSS': 'Nivano Physicians Medical Group',
1240
+ 'NORTHBAY HEALTHCARE GROUP': 'NorthBay Healthcare',
1241
+ 'ALT NORTHEAST MEDICAL SERVICES MCAL': 'Northeast Medical Services',
1242
+ 'NEMS': 'Northeast Medical Services',
1243
+ 'NEMS PACE': 'Northeast Medical Services',
1244
+ 'NORTHEAST MEDICAL SERVICES': 'Northeast Medical Services',
1245
+
1246
+ 'ODS HEALTH PLAN': 'ODS Health Plan',
1247
+ 'ON LOK': 'On Lok',
1248
+ 'ON LOK SENIOR HEALTH': 'On Lok',
1249
+ 'ON LOK SENIOR HEALTH SERVICES': 'On Lok',
1250
+ 'ONLOK': 'On Lok',
1251
+ 'ONLOK LIFEWAYS': 'On Lok',
1252
+
1253
+ 'ONE LEGACY': 'OneLegacy',
1254
+ 'ONELEGACY': 'OneLegacy',
1255
+ 'OPTIMA EXCHANGE': 'Optima Health',
1256
+ 'OPTIMA FAMILY CARE': 'Optima Health',
1257
+ 'OPTIMA SENTARA DUAL': 'Optima Health',
1258
+ 'OPTIMA/SENTARA': 'Optima Health',
1259
+
1260
+ 'PPO NEXT': 'PPONext',
1261
+ 'PPONEXT': 'PPONext',
1262
+ 'PACIFIC SOURCE': 'PacificSource',
1263
+ 'PACIFICSOURCE': 'PacificSource',
1264
+ 'PACIFIC FOUNDATION': 'Pacific Foundation',
1265
+ 'PACIFIC FOUNDATION FOR MEDICAL CARE': 'Pacific Foundation',
1266
+ 'PACIFIC HEALTH ALLIANCE': 'Pacific Health Alliance',
1267
+ 'PHA PACIFIC HEALTH ALLIANCE': 'Pacific Health Alliance',
1268
+ 'ALT PALO ALTO MED GROUP FFS': 'Palo Alto Medical Foundation',
1269
+ 'ALT PAMF COMMERCIAL': 'Palo Alto Medical Foundation',
1270
+ 'ALT PAMF RHMO': 'Palo Alto Medical Foundation',
1271
+ 'ALT PAMF RHMO COMM': 'Palo Alto Medical Foundation',
1272
+ 'PALO ALTO MEDICAL': 'Palo Alto Medical Foundation',
1273
+
1274
+ 'PARADIGM MANAGEMENT': 'Paradigm',
1275
+ 'PARADIGM WORK COMP': 'Paradigm',
1276
+ 'PARTNERSHIP': 'Partnership Health Plan',
1277
+ 'PARTNERSHIP HEALTH PLAN': 'Partnership Health Plan',
1278
+ 'PARTNERSHIP HEALTH PLAN ADULT EXPANSION': 'Partnership Health Plan',
1279
+ 'PERSONIFY HEALTH': 'Personify Health',
1280
+ 'PREMIER HEALTH': 'Premier Health',
1281
+ 'PREMIER HEALTH MEDICAID': 'Premier Health',
1282
+ 'PREMIER HEALTH PLAN': 'Premier Health',
1283
+ 'PREMIER IPA': 'Premier Health',
1284
+
1285
+ 'PRESBYTERIAN HEALTH PLAN': 'Presbyterian Health Plan',
1286
+ 'PRIME CARE MEDICAL GROUP': 'Prime Health Services',
1287
+ 'PRIME HEALTH SERVICES': 'Prime Health Services',
1288
+ 'PRIMECARE': 'PrimeCare Medical Network',
1289
+ 'PRIMECARE MEDICAL NETWORK': 'PrimeCare Medical Network',
1290
+ 'PROCURA WC': 'Procura',
1291
+ 'PROGYNY': 'Progyny',
1292
+ 'AMVI/PROSPECT MEDICAL GROUP': 'Prospect Medical Group',
1293
+ 'PROSPECT HEALTH': 'Prospect Medical Group',
1294
+ 'PROSPECT HEALTH PLAN, INC.': 'Prospect Medical Group',
1295
+ 'PROSPECT MEDICAL GROUP': 'Prospect Medical Group',
1296
+
1297
+ 'PROVIDENCE HEALTH NETWORK': 'Providence Health',
1298
+ 'PROVIDER NETWORK OF AMERCIA': 'Provider Network of America',
1299
+ 'PROVIDER NETWORK OF AMERICA': 'Provider Network of America',
1300
+ 'PROVIDER NETWORK OF AMERICA WRAP TPA': 'Provider Network of America',
1301
+ 'PROVIDERS NETWORK OF AMERICA': 'Provider Network of America',
1302
+
1303
+ 'PRUDENTIAL': 'Prudential',
1304
+ 'REGAL MEDICAL GROUP': 'Regal Medical Group',
1305
+ 'QUIK TRIP': 'QuikTrip',
1306
+ 'QUIKTRIP': 'QuikTrip',
1307
+ 'QUIKTRIP CORPORATION': 'QuikTrip',
1308
+ 'SCAN': 'SCAN Health Plan',
1309
+ 'SCAN HEALTH PLAN': 'SCAN Health Plan',
1310
+ 'SCAN MEDICARE': 'SCAN Health Plan',
1311
+ 'JADE MED GRP SAN FRANCISCO HEALTH PLAN': 'San Francisco Health Plan',
1312
+ 'SAN FRANCISCO HEALTH PLAN': 'San Francisco Health Plan',
1313
+ 'SAN FRANCISCO HEALTH PLAN - NON-CHN': 'San Francisco Health Plan',
1314
+ 'HEALTH PLAN OF SANTA CLARA': 'Santa Clara Family Health Plan',
1315
+ 'SANTA CLARA FAMILY HEALTH PLAN': 'Santa Clara Family Health Plan',
1316
+ 'SANTA CLARA FAMILY HEALTH PLAN DUAL CONN': 'Santa Clara Family Health Plan',
1317
+ 'SANTA CLARA IPA': 'Santa Clara IPA',
1318
+ 'SANTA CLARA IPA COMM': 'Santa Clara IPA',
1319
+ 'SANTA CLARA IPA MCR': 'Santa Clara IPA',
1320
+ 'SANTA CLARA MG ALIGNMENT MCARE ADV': 'Santa Clara IPA',
1321
+
1322
+ 'SEASIDE HEALTH PLAN': 'Seaside Health Plan',
1323
+ 'SELECT HEALTH': 'Select Health',
1324
+ 'SENIOR WHOLE HEALTH': 'Senior Whole Health',
1325
+ 'SEQUOIA': 'Sequoia',
1326
+ 'SEVEN CORNERS': 'Seven Corners',
1327
+ 'SIDECAR HEALTH': 'Sidecar Health',
1328
+ 'SIERRA HEALTH AND': 'Sierra Health',
1329
+ 'SIERRA PACE': 'Sierra Health',
1330
+ 'STANDFORD HEALTH SERVICES': 'Stanford Health',
1331
+ 'STANFORD HEALTH SERVICES': 'Stanford Health',
1332
+ 'STANISLAUS COUNTY PARTNERS': 'Stanislaus County Partners in Health',
1333
+ 'STANISLAUS COUNTY PARTNERS IN HEALTH': 'Stanislaus County Partners in Health',
1334
+ 'STANISLAUS FOUNDATION': 'Stanislaus County Partners in Health',
1335
+ 'SUPERIOR': 'Superior Health Plan',
1336
+ 'SUPERIOR HEALTH PLAN': 'Superior Health Plan',
1337
+ 'SUPERIOR HEALTHPLAN': 'Superior Health Plan',
1338
+ 'ALT SEBMF COMMERCIAL': 'Sutter East Bay Medical Foundation',
1339
+ 'ALT SEBMF RHMO': 'Sutter East Bay Medical Foundation',
1340
+ 'ALT SEBMF RHMO COMM': 'Sutter East Bay Medical Foundation',
1341
+ 'ALT SEBRH NON SUTTER HMO COMM': 'Sutter East Bay Medical Foundation',
1342
+ 'SEBMF ALT': 'Sutter East Bay Medical Foundation',
1343
+
1344
+ 'ALT SGMF RHMO': 'Sutter Gould Medical Foundation',
1345
+ 'ALT SGMF RHMO COMM': 'Sutter Gould Medical Foundation',
1346
+ 'ALT SUTTER ADVANTAGE ALIGNMENT MCARE AHP': 'Sutter Health Plan',
1347
+ 'SUTTER': 'Sutter Health Plan',
1348
+ 'SUTTER HEALTH': 'Sutter Health Plan',
1349
+ 'SUTTER HEALTH PLAN': 'Sutter Health Plan',
1350
+ 'SUTTER HEALTH PLUS': 'Sutter Health Plan',
1351
+ 'SUTTER HEALTH PLUS BTMG': 'Sutter Health Plan',
1352
+ 'SUTTER HEALTH SEBMF': 'Sutter Health Plan',
1353
+ 'SUTTER PREFERRED HEALTH PLAN': 'Sutter Health Plan',
1354
+ 'SUTTER SELECT': 'Sutter Health Plan',
1355
+ 'SUTTER SELECT (UMR)': 'Sutter Health Plan',
1356
+ 'SUTTER VALLEY HOSP': 'Sutter Health Plan',
1357
+
1358
+ 'ALT SMF COMMERCIAL': 'Sutter Medical Foundation',
1359
+ 'ALT SMF RHMO': 'Sutter Medical Foundation',
1360
+ 'ALT SMF RHMO COMM': 'Sutter Medical Foundation',
1361
+ 'ALT SPMF': 'Sutter Pacific Medical Foundation',
1362
+ 'ALT SPMF COMMERCIAL': 'Sutter Pacific Medical Foundation',
1363
+ 'ALT SPMF MEDICAL': 'Sutter Pacific Medical Foundation',
1364
+ 'ALT SPMF RHMO': 'Sutter Pacific Medical Foundation',
1365
+ 'ALT SPMF RHMO COMM': 'Sutter Pacific Medical Foundation',
1366
+
1367
+ 'TENET RECIPROCITY': 'Tenet Health',
1368
+ 'THREE RIVERS': 'Three Rivers Provider Network',
1369
+ 'THREE RIVERS AUTO': 'Three Rivers Provider Network',
1370
+ 'THREE RIVERS COMMERCIAL': 'Three Rivers Provider Network',
1371
+ 'THREE RIVERS NETWORK': 'Three Rivers Provider Network',
1372
+ 'THREE RIVERS PROVIDER NETWORK': 'Three Rivers Provider Network',
1373
+ 'THREE RIVERS PROVIDER NETWORK AUTO': 'Three Rivers Provider Network',
1374
+
1375
+ 'TRANSAMERICA LIFE INSURANCE CO': 'Transamerica',
1376
+ 'TRISTAR': 'TriStar',
1377
+ 'TRUSTMARK': 'Trustmark',
1378
+ 'TRUSTMARK INSURANCE': 'Trustmark',
1379
+ 'TUGO': 'TuGo',
1380
+ 'TUGO INSURANCE': 'TuGo',
1381
+ 'TUFTS': 'Tufts Health Plan',
1382
+ 'TUFTS SECURE HORIZONS': 'Tufts Health Plan',
1383
+ 'REGENTS UC DAVIS': 'UC Davis Health',
1384
+ 'REGENTS UC DAVIS MR': 'UC Davis Health',
1385
+ 'UC DAVIS SPECIALTY BLUE/GOLD HEALTH NET': 'UC Davis Health',
1386
+ 'UC DAVIS SPECIALTY HEALTHNET': 'UC Davis Health',
1387
+
1388
+ 'UMR': 'UMR',
1389
+ 'UMR NON-CONTRACTED': 'UMR',
1390
+ 'USAA LIFE INSURANCE': 'USAA',
1391
+ 'UNIVERSAL CARE': 'Universal Care',
1392
+ 'VALLEY HEALTH PLAN': 'Valley Health Plan',
1393
+ 'VALLEY HEALTH PLAN (MEDI-CAL)': 'Valley Health Plan',
1394
+ 'VALLEY HEALTH PLAN COMMERCIAL': 'Valley Health Plan',
1395
+ 'VALUE OPTIONS': 'Value Options',
1396
+ 'VITALITY': 'Vitality Health Plan',
1397
+ 'VITALITY HEALTH PLAN': 'Vitality Health Plan',
1398
+ 'VITAS HEALTHCARE': 'Vitas Healthcare',
1399
+ 'VITAS HEALTHCARE HOSPICE': 'Vitas Healthcare',
1400
+ 'VIVANT HEALTH ALIGNMENT': 'Vivant Health',
1401
+ 'WEB/TPA': 'WebTPA',
1402
+ 'WEB-TPA': 'WebTPA',
1403
+ 'WEB TPA': 'WebTPA',
1404
+ 'WEBTPA': 'WebTPA',
1405
+ 'ALT WELLCARE': 'WellCare',
1406
+ 'WELLCARE': 'WellCare',
1407
+ 'WELLCARE HEALTH INSURANCE OF ARIZONA': 'WellCare',
1408
+ 'WELLCOMP': 'WellComp',
1409
+ 'WELLFLEET': 'Wellfleet',
1410
+ 'WELLPATH': 'Wellpath',
1411
+ 'WELLPATH LOA': 'Wellpath',
1412
+ 'WESTERN HEALTH ADVANTAGE': 'Western Health Advantage',
1413
+
1414
+ # ---- AARP variants -> United Healthcare ----
1415
+ 'AARP': 'United Healthcare',
1416
+ 'AARP BY UHC': 'United Healthcare',
1417
+ 'AARP DEICARE COMPLETE UHC': 'United Healthcare', # typo: Dedicare
1418
+ 'AARP MCR': 'United Healthcare',
1419
+ 'AARP MC WELLMED': 'United Healthcare',
1420
+ 'AARP MEDICARE REPLACEMENT': 'United Healthcare',
1421
+ 'AARP SUPPLEMENT': 'United Healthcare',
1422
+
1423
+ # ---- Typo corrections ----
1424
+ 'AENTA': 'Aetna',
1425
+ '4MOST HEALTH NEWORK': '4Most Health Network',
1426
+ 'BC HEALTH OPITONS': 'Blue Cross Blue Shield',
1427
+ 'GREENVBRIER SPORTING CLUB': 'Greenbrier Sporting Club',
1428
+ 'MANHATTENLIFE ASSURANCE COMPANY': 'Manhattan Life Assurance Company',
1429
+ 'MUTUTAL OF OMAHA': 'Mutual of Omaha',
1430
+ 'HUMANNA OK MEDICAID': 'Humana',
1431
+ 'MULITPLAN': 'MultiPlan',
1432
+ 'PACIFISOURCE': 'PacificSource',
1433
+ 'SELCT HEALTH': 'Select Health',
1434
+ 'SCOTT ADN WHITE': 'Scott and White',
1435
+ 'UNIVERSAL HEALTH NETOWRK': 'Universal Health Network',
1436
+ 'MEFCHANTS BENEFIT ADMIN': 'Merchants Benefit Administration',
1437
+ 'UNITEDHEATHCARE INSURANCE COMPANY': 'United Healthcare',
1438
+ 'UNITEDHEATHCARE': 'United Healthcare',
1439
+ 'VERITY HEATLHNET': 'Health Net',
1440
+ 'MOLINDA IOWA MCD': 'Molina Healthcare',
1441
+ 'IAMOLINA': 'Molina Healthcare',
1442
+ 'CITYOFFTWORTH': 'City of Fort Worth',
1443
+ "MARTYIN'S POINT": "Martin's Point",
1444
+ 'UHEALTH MILTARY AND VETS': 'UHealth',
1445
+ 'POLKIN HEALTH': 'Plotkin Health',
1446
+ 'BMC WELLCARE SCO AND ONE CAREL': 'WellCare',
1447
+ 'WELMED': 'WellMed',
1448
+
1449
+ # ---- Near-duplicate consolidation ----
1450
+ 'ADVA NET': 'Adva-Net',
1451
+ 'ADVA-NET': 'Adva-Net',
1452
+ 'AV MED': 'AvMed',
1453
+ 'AVMED': 'AvMed',
1454
+ 'HEALTH PARTNERS': 'HealthPartners',
1455
+ 'HEALTHPARTNERS': 'HealthPartners',
1456
+ 'HEALTH SCOPE': 'Healthscope',
1457
+ 'HEALTHSCOPE': 'Healthscope',
1458
+ 'SELECTHEALTH': 'Select Health',
1459
+ 'FIRSTCARE': 'FirstCare',
1460
+ 'FIRST CARE': 'FirstCare',
1461
+ 'FIRSTHEALTH': 'First Health Network',
1462
+ 'HEALTH CHOICE': 'HealthChoice',
1463
+ 'HEALTHCHOICE': 'HealthChoice',
1464
+ 'HEALTH SMART': 'HealthSmart',
1465
+ 'CORESOURCE': 'CoreSource',
1466
+ 'CORE SOURCE': 'CoreSource',
1467
+ 'CHOICECARE': 'ChoiceCare',
1468
+ 'CHOICE CARE': 'ChoiceCare',
1469
+ 'CAREPLUS': 'CarePlus',
1470
+ 'CARE PLUS': 'CarePlus',
1471
+ 'CAREOREGON': 'CareOregon',
1472
+ 'CARE OREGON': 'CareOregon',
1473
+ 'HEALTHFIRST': 'Healthfirst',
1474
+ 'HEALTH FIRST': 'Healthfirst',
1475
+ 'MDSAVE': 'MDsave',
1476
+ 'MD SAVE': 'MDsave',
1477
+
1478
+ # ---- Node-prefix target payers ----
1479
+ # (After NODE strip, these need explicit mapping)
1480
+ 'BCBS AL': 'Blue Cross Blue Shield of Alabama',
1481
+ 'BCBS FL': 'Florida Blue',
1482
+ 'BCFL': 'Florida Blue',
1483
+ 'MEDICARE NON PAR': 'Medicare',
1484
+ 'MEDICARE TRADITIONAL': 'Medicare',
1485
+ 'NON PAR HOSPICE AGREE': 'Hospice',
1486
+ 'UNITED OPTUM VA CCN': 'United Healthcare',
1487
+ 'US DEPT OF LABOR': 'US Department of Labor',
1488
+ 'VA': 'Department of Veterans Affairs',
1489
+ 'SIMPLY': 'Simply Healthcare',
1490
+ 'CIGNA HEALTHSPRING': 'Cigna',
1491
+ 'CLOVER HEALTH': 'Clover Health',
1492
+ 'CORRECTIONAL RISK SERVICES': 'Correctional Risk Services',
1493
+ 'DEVOTED HEALTH': 'Devoted Health',
1494
+ 'FREEDOM HEALTH': 'Freedom Health',
1495
+ 'PRIME HEALTH': 'Prime Health',
1496
+ 'WINDSOR': 'Windsor Health',
1497
+ 'WELLCARE AMBETTER MARKETPLACE': 'Ambetter',
1498
+
1499
+ # ---- BCBS state-specific variants (fixed) ----
1500
+ 'BC OF ARKANSAS': 'Blue Cross Blue Shield of Arkansas',
1501
+ 'BC OF AZ': 'Blue Cross Blue Shield of Arizona',
1502
+ 'BC OF CA': 'Anthem Blue Cross', # Blue Cross of California IS Anthem
1503
+ 'BC OF CO': 'Blue Cross Blue Shield of Colorado',
1504
+ 'BC OF IDAHO': 'Blue Cross of Idaho',
1505
+ 'BC OF ILLINOIS': 'Blue Cross Blue Shield of Illinois',
1506
+ 'BC OF KANSAS': 'Blue Cross Blue Shield of Kansas',
1507
+ 'BC OF KY': 'Blue Cross Blue Shield of Kentucky', # Anthem BCBS KY
1508
+ 'BC OF MISSOURI': 'Blue Cross Blue Shield of Missouri',
1509
+ 'BC OF NH': 'Blue Cross Blue Shield of New Hampshire',
1510
+ 'BC OF NM': 'Blue Cross Blue Shield of New Mexico',
1511
+ 'BC OF NV': 'Blue Cross Blue Shield of Nevada',
1512
+ 'BC OF OHIO': 'Blue Cross Blue Shield of Ohio',
1513
+ 'BC OF TN': 'Blue Cross Blue Shield of Tennessee',
1514
+ 'BC OF TX': 'Blue Cross Blue Shield of Texas',
1515
+ 'BC OF WV': 'Blue Cross Blue Shield of West Virginia', # Highmark BCBS WV
1516
+ 'BCBS-AL': 'Blue Cross Blue Shield of Alabama',
1517
+ 'BCBS-FL': 'Florida Blue',
1518
+ 'BC/BS OF FL': 'Florida Blue',
1519
+ 'BCTN': 'Blue Cross Blue Shield of Tennessee',
1520
+ 'BC FEP': 'Blue Cross Blue Shield', # Federal Employee Program
1521
+ 'BC HEALTH OPTIONS': 'Blue Cross Blue Shield',
1522
+
1523
+ # ---- Special / residual payer names ----
1524
+ 'ALL OTHER': 'Non-Contracted Payers',
1525
+ 'NON-CONTRACTED PAYERS': 'Non-Contracted Payers',
1526
+ 'ALEXIAN BROTHERS SCHOOL PACKAGE': 'Alexian Brothers School Package',
1527
+
1528
+ # ---- BCBS licensee consolidation ----
1529
+ # Highmark (PA/WV/DE/WNY)
1530
+ 'HIGHMARK': 'Highmark Blue Cross Blue Shield',
1531
+ 'HIGHMARK BCBS': 'Highmark Blue Cross Blue Shield',
1532
+ 'HIGHMARK BLUE CROSS': 'Highmark Blue Cross Blue Shield',
1533
+ 'HIGHMARK BLUE CROSS BLUE SHIELD': 'Highmark Blue Cross Blue Shield',
1534
+ 'HIGHMARK BLUE CROSS BLUE SHIELD OF WESTERN NY': 'Highmark Blue Cross Blue Shield',
1535
+ 'HIGHMARK BLUE SHIELD': 'Highmark Blue Cross Blue Shield',
1536
+ 'HIGHMARK BCBS COMMERCIAL': 'Highmark Blue Cross Blue Shield',
1537
+ 'HIGHMARK BCBS DE': 'Highmark Blue Cross Blue Shield',
1538
+ 'HIGHMARK BCBS MEDICARE': 'Highmark Blue Cross Blue Shield',
1539
+ 'HIGHMARK BCBS MEDICAID': 'Highmark Blue Cross Blue Shield',
1540
+ 'HIGHMARK BCBS WNY': 'Highmark Blue Cross Blue Shield',
1541
+ 'HIGHMARK BLUE SHIELD COMMERCIAL': 'Highmark Blue Cross Blue Shield',
1542
+ 'HIGHMARK CHOICE': 'Highmark Blue Cross Blue Shield',
1543
+ 'HIGHMARK COMMUNITY BLUE': 'Highmark Blue Cross Blue Shield',
1544
+ 'HIGHMARK FREEDOM BLUE': 'Highmark Blue Cross Blue Shield',
1545
+ 'HIGHMARK SECURITY BLUE': 'Highmark Blue Cross Blue Shield',
1546
+ 'HIGHMARK WHOLECARE': 'Highmark Blue Cross Blue Shield',
1547
+ 'HIGHMARK DIRECT': 'Highmark Blue Cross Blue Shield',
1548
+ 'HIGHMARK SELECT': 'Highmark Blue Cross Blue Shield',
1549
+ 'HIGHMARK INC': 'Highmark Blue Cross Blue Shield',
1550
+
1551
+ # CareFirst (MD/DC/VA)
1552
+ 'CAREFIRST': 'CareFirst Blue Cross Blue Shield',
1553
+ 'CAREFIRST BCBS': 'CareFirst Blue Cross Blue Shield',
1554
+ 'CAREFIRST BLUE CROSS': 'CareFirst Blue Cross Blue Shield',
1555
+ 'CAREFIRST BLUE CROSS BLUE SHIELD': 'CareFirst Blue Cross Blue Shield',
1556
+ 'CAREFIRST BLUECHOICE': 'CareFirst Blue Cross Blue Shield',
1557
+ 'CAREFIRST COMMERCIAL': 'CareFirst Blue Cross Blue Shield',
1558
+ 'CAREFIRST MEDICARE': 'CareFirst Blue Cross Blue Shield',
1559
+ 'CAREFIRST MEDICAID': 'CareFirst Blue Cross Blue Shield',
1560
+ 'GROUP HOSPITALIZATION AND MEDICAL SERVICES': 'CareFirst Blue Cross Blue Shield',
1561
+ 'GHMSI': 'CareFirst Blue Cross Blue Shield',
1562
+
1563
+ # Florida Blue (FL BCBS licensee)
1564
+ 'FLORIDA BLUE': 'Florida Blue',
1565
+ 'FL BLUE': 'Florida Blue',
1566
+ 'FLORIDA BLUE COMMERCIAL': 'Florida Blue',
1567
+ 'FLORIDA BLUE MEDICARE': 'Florida Blue',
1568
+ 'FLORIDA BLUE MEDICAID': 'Florida Blue',
1569
+ 'GUIDEWELL': 'Florida Blue',
1570
+
1571
+ # Premera Blue Cross (WA/AK)
1572
+ 'PREMERA': 'Premera Blue Cross',
1573
+ 'PREMERA BLUE CROSS': 'Premera Blue Cross',
1574
+ 'PREMERA BCBS': 'Premera Blue Cross',
1575
+
1576
+ # Regence (OR/UT/WA/ID)
1577
+ 'REGENCE': 'Regence Blue Cross Blue Shield',
1578
+ 'REGENCE BCBS': 'Regence Blue Cross Blue Shield',
1579
+ 'REGENCE BLUE CROSS': 'Regence Blue Cross Blue Shield',
1580
+ 'REGENCE BLUE CROSS BLUE SHIELD': 'Regence Blue Cross Blue Shield',
1581
+ 'REGENCE BLUE SHIELD': 'Regence Blue Cross Blue Shield',
1582
+ 'REGENCE BLUESHIELD': 'Regence Blue Cross Blue Shield',
1583
+ 'REGENCE BCBS OF OREGON': 'Regence Blue Cross Blue Shield',
1584
+ 'REGENCE BCBS OF UTAH': 'Regence Blue Cross Blue Shield',
1585
+ 'REGENCE BLUE SHIELD OF IDAHO': 'Regence Blue Cross Blue Shield',
1586
+
1587
+ # Elevance Health (Anthem parent, sometimes appears separately)
1588
+ 'ELEVANCE': 'Anthem Blue Cross',
1589
+ 'ELEVANCE HEALTH': 'Anthem Blue Cross',
1590
+
1591
+ # Independence Blue Cross (PA)
1592
+ 'INDEPENDENCE BLUE CROSS': 'Independence Blue Cross',
1593
+ 'IBC': 'Independence Blue Cross',
1594
+ 'INDEPENDENCE BCBS': 'Independence Blue Cross',
1595
+ 'IBX': 'Independence Blue Cross',
1596
+ 'KEYSTONE HEALTH PLAN': 'Independence Blue Cross',
1597
+ 'KEYSTONE HEALTH PLAN EAST': 'Independence Blue Cross',
1598
+
1599
+ # Horizon BCBS (NJ)
1600
+ 'HORIZON': 'Horizon Blue Cross Blue Shield of New Jersey',
1601
+ 'HORIZON BCBS': 'Horizon Blue Cross Blue Shield of New Jersey',
1602
+ 'HORIZON BLUE CROSS': 'Horizon Blue Cross Blue Shield of New Jersey',
1603
+ 'HORIZON BLUE CROSS BLUE SHIELD': 'Horizon Blue Cross Blue Shield of New Jersey',
1604
+ 'HORIZON BLUE CROSS BLUE SHIELD OF NEW JERSEY': 'Horizon Blue Cross Blue Shield of New Jersey',
1605
+ 'HORIZON NJ': 'Horizon Blue Cross Blue Shield of New Jersey',
1606
+
1607
+ # Wellmark BCBS (IA/SD)
1608
+ 'WELLMARK': 'Wellmark Blue Cross Blue Shield',
1609
+ 'WELLMARK BCBS': 'Wellmark Blue Cross Blue Shield',
1610
+ 'WELLMARK BLUE CROSS': 'Wellmark Blue Cross Blue Shield',
1611
+ 'WELLMARK BLUE CROSS BLUE SHIELD': 'Wellmark Blue Cross Blue Shield',
1612
+
1613
+ # UPMC Health Plan (PA)
1614
+ 'UPMC': 'UPMC Health Plan',
1615
+ 'UPMC HEALTH PLAN': 'UPMC Health Plan',
1616
+ 'UPMC COMMERCIAL': 'UPMC Health Plan',
1617
+ 'UPMC FOR LIFE': 'UPMC Health Plan',
1618
+ 'UPMC FOR YOU': 'UPMC Health Plan',
1619
+ 'UPMC MEDICARE': 'UPMC Health Plan',
1620
+ 'UPMC MEDICAID': 'UPMC Health Plan',
1621
+ 'UPMC FOR KIDS': 'UPMC Health Plan',
1622
+ 'UPMC COMMUNITY HEALTH CHOICES': 'UPMC Health Plan',
1623
+ 'UPMC INSURANCE SERVICES': 'UPMC Health Plan',
1624
+ 'UPMC VISION ADVANTAGE': 'UPMC Health Plan',
1625
+
1626
+ # Fidelis Care (NY Medicaid managed care)
1627
+ 'FIDELIS': 'Fidelis Care',
1628
+ 'FIDELIS CARE': 'Fidelis Care',
1629
+ 'FIDELIS CARE NY': 'Fidelis Care',
1630
+ 'FIDELIS COMMERCIAL': 'Fidelis Care',
1631
+ 'FIDELIS MEDICAID': 'Fidelis Care',
1632
+ 'FIDELIS MEDICARE': 'Fidelis Care',
1633
+ 'FIDELIS ESSENTIAL PLAN': 'Fidelis Care',
1634
+ 'FIDELIS CHILD HEALTH PLUS': 'Fidelis Care',
1635
+
1636
+ # MVP Healthcare (NY/VT)
1637
+ 'MVP': 'MVP Healthcare',
1638
+ 'MVP HEALTH CARE': 'MVP Healthcare',
1639
+ 'MVP COMMERCIAL': 'MVP Healthcare',
1640
+ 'MVP MEDICARE': 'MVP Healthcare',
1641
+ 'MVP MEDICAID': 'MVP Healthcare',
1642
+
1643
+ # CareSource (OH/IN/GA/KY)
1644
+ 'CARESOURCE': 'CareSource',
1645
+ 'CARE SOURCE': 'CareSource',
1646
+ 'CARESOURCE OHIO': 'CareSource',
1647
+ 'CARESOURCE INDIANA': 'CareSource',
1648
+ 'CARESOURCE MARKETPLACE': 'CareSource',
1649
+ 'CARESOURCE MEDICAID': 'CareSource',
1650
+ 'CARESOURCE MEDICARE': 'CareSource',
1651
+
1652
+ # Medical Mutual of Ohio
1653
+ 'MMO': 'Medical Mutual of Ohio',
1654
+ 'MEDICAL MUTUAL': 'Medical Mutual of Ohio',
1655
+ 'MEDICAL MUTUAL OF OHIO': 'Medical Mutual of Ohio',
1656
+ 'MED MUTUAL': 'Medical Mutual of Ohio',
1657
+ 'SUPERMED': 'Medical Mutual of Ohio',
1658
+
1659
+ # ---- State BCBS entities (new) ----
1660
+ 'BCBS OF MASSACHUSETTS': 'Blue Cross Blue Shield of Massachusetts',
1661
+ 'BLUE CROSS BLUE SHIELD OF MASSACHUSETTS': 'Blue Cross Blue Shield of Massachusetts',
1662
+ 'BCBS OF MA': 'Blue Cross Blue Shield of Massachusetts',
1663
+ 'BLUE CROSS OF MASSACHUSETTS': 'Blue Cross Blue Shield of Massachusetts',
1664
+
1665
+ 'BCBS OF COLORADO': 'Blue Cross Blue Shield of Colorado',
1666
+ 'BLUE CROSS BLUE SHIELD OF COLORADO': 'Blue Cross Blue Shield of Colorado',
1667
+
1668
+ 'BCBS OF KENTUCKY': 'Blue Cross Blue Shield of Kentucky',
1669
+ 'BLUE CROSS BLUE SHIELD OF KENTUCKY': 'Blue Cross Blue Shield of Kentucky',
1670
+
1671
+ 'BCBS OF MISSOURI': 'Blue Cross Blue Shield of Missouri',
1672
+ 'BLUE CROSS BLUE SHIELD OF MISSOURI': 'Blue Cross Blue Shield of Missouri',
1673
+
1674
+ 'BCBS OF NEW HAMPSHIRE': 'Blue Cross Blue Shield of New Hampshire',
1675
+ 'BLUE CROSS BLUE SHIELD OF NEW HAMPSHIRE': 'Blue Cross Blue Shield of New Hampshire',
1676
+
1677
+ 'BCBS OF NEVADA': 'Blue Cross Blue Shield of Nevada',
1678
+ 'BLUE CROSS BLUE SHIELD OF NEVADA': 'Blue Cross Blue Shield of Nevada',
1679
+
1680
+ 'BCBS OF OHIO': 'Blue Cross Blue Shield of Ohio',
1681
+ 'BLUE CROSS BLUE SHIELD OF OHIO': 'Blue Cross Blue Shield of Ohio',
1682
+
1683
+ 'BCBS OF WEST VIRGINIA': 'Blue Cross Blue Shield of West Virginia',
1684
+ 'BLUE CROSS BLUE SHIELD OF WEST VIRGINIA': 'Blue Cross Blue Shield of West Virginia',
1685
+
1686
+ 'BCBS OF MICHIGAN': 'Blue Cross Blue Shield of Michigan',
1687
+ 'BLUE CROSS BLUE SHIELD OF MICHIGAN': 'Blue Cross Blue Shield of Michigan',
1688
+ 'BC OF MICHIGAN': 'Blue Cross Blue Shield of Michigan',
1689
+
1690
+ 'BCBS OF MINNESOTA': 'Blue Cross Blue Shield of Minnesota',
1691
+ 'BLUE CROSS BLUE SHIELD OF MINNESOTA': 'Blue Cross Blue Shield of Minnesota',
1692
+ 'BC OF MINNESOTA': 'Blue Cross Blue Shield of Minnesota',
1693
+
1694
+ 'BCBS OF NORTH CAROLINA': 'Blue Cross Blue Shield of North Carolina',
1695
+ 'BLUE CROSS BLUE SHIELD OF NORTH CAROLINA': 'Blue Cross Blue Shield of North Carolina',
1696
+ 'BC OF NC': 'Blue Cross Blue Shield of North Carolina',
1697
+
1698
+ 'BCBS OF SOUTH CAROLINA': 'Blue Cross Blue Shield of South Carolina',
1699
+ 'BLUE CROSS BLUE SHIELD OF SOUTH CAROLINA': 'Blue Cross Blue Shield of South Carolina',
1700
+ 'BC OF SC': 'Blue Cross Blue Shield of South Carolina',
1701
+
1702
+ 'BCBS OF GEORGIA': 'Blue Cross Blue Shield of Georgia',
1703
+ 'BLUE CROSS BLUE SHIELD OF GEORGIA': 'Blue Cross Blue Shield of Georgia',
1704
+ 'BC OF GA': 'Blue Cross Blue Shield of Georgia',
1705
+
1706
+ 'BCBS OF LOUISIANA': 'Blue Cross Blue Shield of Louisiana',
1707
+ 'BLUE CROSS BLUE SHIELD OF LOUISIANA': 'Blue Cross Blue Shield of Louisiana',
1708
+ 'BC OF LA': 'Blue Cross Blue Shield of Louisiana',
1709
+
1710
+ 'BCBS OF NEBRASKA': 'Blue Cross Blue Shield of Nebraska',
1711
+ 'BLUE CROSS BLUE SHIELD OF NEBRASKA': 'Blue Cross Blue Shield of Nebraska',
1712
+ 'BC OF NE': 'Blue Cross Blue Shield of Nebraska',
1713
+
1714
+ 'BCBS OF WYOMING': 'Blue Cross Blue Shield of Wyoming',
1715
+ 'BLUE CROSS BLUE SHIELD OF WYOMING': 'Blue Cross Blue Shield of Wyoming',
1716
+ 'BC OF WY': 'Blue Cross Blue Shield of Wyoming',
1717
+
1718
+ # ---- State Medicaid ----
1719
+ 'MEDICAID AZ': 'Medicaid - Arizona',
1720
+ 'MEDICAID ARIZONA': 'Medicaid - Arizona',
1721
+ 'AZ MEDICAID': 'Medicaid - Arizona',
1722
+ 'MEDICAID CA': 'Medicaid - California',
1723
+ 'MEDICAID CALIFORNIA': 'Medicaid - California',
1724
+ 'CA MEDICAID': 'Medicaid - California',
1725
+ 'MEDICAID CO': 'Medicaid - Colorado',
1726
+ 'MEDICAID COLORADO': 'Medicaid - Colorado',
1727
+ 'CO MEDICAID': 'Medicaid - Colorado',
1728
+ 'MEDICAID CT': 'Medicaid - Connecticut',
1729
+ 'MEDICAID CONNECTICUT': 'Medicaid - Connecticut',
1730
+ 'CT MEDICAID': 'Medicaid - Connecticut',
1731
+ 'MEDICAID FL': 'Medicaid - Florida',
1732
+ 'MEDICAID FLORIDA': 'Medicaid - Florida',
1733
+ 'FL MEDICAID': 'Medicaid - Florida',
1734
+ 'MEDICAID GA': 'Medicaid - Georgia',
1735
+ 'MEDICAID GEORGIA': 'Medicaid - Georgia',
1736
+ 'GA MEDICAID': 'Medicaid - Georgia',
1737
+ 'MEDICAID IL': 'Medicaid - Illinois',
1738
+ 'MEDICAID ILLINOIS': 'Medicaid - Illinois',
1739
+ 'IL MEDICAID': 'Medicaid - Illinois',
1740
+ 'MEDICAID IN': 'Medicaid - Indiana',
1741
+ 'MEDICAID INDIANA': 'Medicaid - Indiana',
1742
+ 'IN MEDICAID': 'Medicaid - Indiana',
1743
+ 'MEDICAID KY': 'Medicaid - Kentucky',
1744
+ 'MEDICAID KENTUCKY': 'Medicaid - Kentucky',
1745
+ 'KY MEDICAID': 'Medicaid - Kentucky',
1746
+ 'MEDICAID LA': 'Medicaid - Louisiana',
1747
+ 'MEDICAID LOUISIANA': 'Medicaid - Louisiana',
1748
+ 'LA MEDICAID': 'Medicaid - Louisiana',
1749
+ 'MEDICAID MD': 'Medicaid - Maryland',
1750
+ 'MEDICAID MARYLAND': 'Medicaid - Maryland',
1751
+ 'MD MEDICAID': 'Medicaid - Maryland',
1752
+ 'MEDICAID MI': 'Medicaid - Michigan',
1753
+ 'MEDICAID MICHIGAN': 'Medicaid - Michigan',
1754
+ 'MI MEDICAID': 'Medicaid - Michigan',
1755
+ 'MEDICAID MN': 'Medicaid - Minnesota',
1756
+ 'MEDICAID MINNESOTA': 'Medicaid - Minnesota',
1757
+ 'MN MEDICAID': 'Medicaid - Minnesota',
1758
+ 'MEDICAID MO': 'Medicaid - Missouri',
1759
+ 'MEDICAID MISSOURI': 'Medicaid - Missouri',
1760
+ 'MO MEDICAID': 'Medicaid - Missouri',
1761
+ 'MEDICAID NC': 'Medicaid - North Carolina',
1762
+ 'MEDICAID NORTH CAROLINA': 'Medicaid - North Carolina',
1763
+ 'NC MEDICAID': 'Medicaid - North Carolina',
1764
+ 'MEDICAID NJ': 'Medicaid - New Jersey',
1765
+ 'MEDICAID NEW JERSEY': 'Medicaid - New Jersey',
1766
+ 'NJ MEDICAID': 'Medicaid - New Jersey',
1767
+ 'MEDICAID NV': 'Medicaid - Nevada',
1768
+ 'MEDICAID NEVADA': 'Medicaid - Nevada',
1769
+ 'NV MEDICAID': 'Medicaid - Nevada',
1770
+ 'MEDICAID NY': 'Medicaid - New York',
1771
+ 'MEDICAID NEW YORK': 'Medicaid - New York',
1772
+ 'NY MEDICAID': 'Medicaid - New York',
1773
+ 'MEDICAID OH': 'Medicaid - Ohio',
1774
+ 'MEDICAID OHIO': 'Medicaid - Ohio',
1775
+ 'OH MEDICAID': 'Medicaid - Ohio',
1776
+ 'MEDICAID OK': 'Medicaid - Oklahoma',
1777
+ 'MEDICAID OKLAHOMA': 'Medicaid - Oklahoma',
1778
+ 'OK MEDICAID': 'Medicaid - Oklahoma',
1779
+ 'MEDICAID OR': 'Medicaid - Oregon',
1780
+ 'MEDICAID OREGON': 'Medicaid - Oregon',
1781
+ 'OR MEDICAID': 'Medicaid - Oregon',
1782
+ 'MEDICAID PA': 'Medicaid - Pennsylvania',
1783
+ 'MEDICAID PENNSYLVANIA': 'Medicaid - Pennsylvania',
1784
+ 'PA MEDICAID': 'Medicaid - Pennsylvania',
1785
+ 'MEDICAID SC': 'Medicaid - South Carolina',
1786
+ 'MEDICAID SOUTH CAROLINA': 'Medicaid - South Carolina',
1787
+ 'SC MEDICAID': 'Medicaid - South Carolina',
1788
+ 'MEDICAID TN': 'Medicaid - Tennessee',
1789
+ 'MEDICAID TENNESSEE': 'Medicaid - Tennessee',
1790
+ 'TN MEDICAID': 'Medicaid - Tennessee',
1791
+ 'MEDICAID TX': 'Medicaid - Texas',
1792
+ 'MEDICAID TEXAS': 'Medicaid - Texas',
1793
+ 'TX MEDICAID': 'Medicaid - Texas',
1794
+ 'MEDICAID UT': 'Medicaid - Utah',
1795
+ 'MEDICAID UTAH': 'Medicaid - Utah',
1796
+ 'UT MEDICAID': 'Medicaid - Utah',
1797
+ 'MEDICAID WA': 'Medicaid - Washington',
1798
+ 'MEDICAID WASHINGTON': 'Medicaid - Washington',
1799
+ 'WA MEDICAID': 'Medicaid - Washington',
1800
+ 'MEDICAID WI': 'Medicaid - Wisconsin',
1801
+ 'MEDICAID WISCONSIN': 'Medicaid - Wisconsin',
1802
+ 'WI MEDICAID': 'Medicaid - Wisconsin',
1803
+ 'MEDICAID WV': 'Medicaid - West Virginia',
1804
+ 'MEDICAID WEST VIRGINIA': 'Medicaid - West Virginia',
1805
+ 'WV MEDICAID': 'Medicaid - West Virginia',
1806
+ 'MEDICAID DC': 'Medicaid - District of Columbia',
1807
+ 'MEDICAID DISTRICT OF COLUMBIA': 'Medicaid - District of Columbia',
1808
+ 'DC MEDICAID': 'Medicaid - District of Columbia',
1809
+
1810
+ # Fix existing state Medicaid entries
1811
+ 'MEDICAID MA': 'Medicaid - Massachusetts',
1812
+ 'MEDICAID PENDING MA': 'Medicaid - Massachusetts',
1813
+ 'MEDICAID VA': 'Medicaid - Virginia',
1814
+ 'MEDICAID PENDING VA': 'Medicaid - Virginia',
1815
+ 'MEDICAID PENDNG GA': 'Medicaid - Georgia',
1816
+
1817
+ # ---- Garbage/employer/non-insurer to meaningful names ----
1818
+ # CDM Default (Charge Description Master - not a payer)
1819
+ 'CDM DEFAULT': 'Gross Charges',
1820
+ 'CDM': 'Gross Charges',
1821
+ 'CHARGE MASTER': 'Gross Charges',
1822
+ 'CHARGEMASTER': 'Gross Charges',
1823
+ 'GROSS CHARGES': 'Gross Charges',
1824
+ 'GROSS CHARGES ESTIMATE': 'Gross Charges',
1825
+
1826
+ # Cash/self-pay estimates
1827
+ 'CASH PRICE ESTIMATE': 'Cash Price',
1828
+ 'CASH PRICE': 'Cash Price',
1829
+ 'SELF PAY': 'Cash Price',
1830
+ 'SELF-PAY': 'Cash Price',
1831
+ 'SELFPAY': 'Cash Price',
1832
+ 'UNINSURED': 'Cash Price',
1833
+ 'UNINSURED/SELF-PAY': 'Cash Price',
1834
+
1835
+ # ---- Abbreviation expansions ----
1836
+ '90 DEGREE BENEFIT': '90 Degree Benefits',
1837
+ '90 DEGREE BENEFITS': '90 Degree Benefits',
1838
+ 'PFC': 'Patient Financial Communications',
1839
+ 'OHCP': 'Ohio Health Choice',
1840
+ 'USAMCO': 'USA Managed Care',
1841
+
1842
+ # ---- Wellpoint -> Elevance/Anthem ----
1843
+ # Wellpoint is the old name for Elevance Health (Anthem parent)
1844
+ 'WELLPOINT': 'Anthem Blue Cross',
1845
+ 'WELLPOINT INDEMNITY': 'Anthem Blue Cross',
1846
+ 'WELLPOIONT': 'Anthem Blue Cross',
1847
+ }
1848
+
1849
+
1850
+
1851
+ def normalize_payer_name(
1852
+ raw_payer: str,
1853
+ raw_plan: Optional[str] = None,
1854
+ *,
1855
+ ref: Optional[ReferenceData] = None,
1856
+ ) -> Tuple[Optional[str], Optional[str]]:
1857
+ """
1858
+ Normalize a raw payer_name from hospital MRF data.
1859
+
1860
+ Returns: (canonical_payer_name, enriched_plan_name)
1861
+ - canonical_payer_name: cleaned, standardized name (or None to discard)
1862
+ - enriched_plan_name: original plan_name, enriched with product-line
1863
+ info extracted from payer_name if plan_name was empty
1864
+
1865
+ Normalization steps:
1866
+ 1. Strip bracket-wrapped names and contract IDs
1867
+ 1c. Discard per-diem rate values ("Abbhh 14/Day") -> single payer
1868
+ 1d. Handle percentage-prefixed ("95% Cigna") -> strip %, recurse
1869
+ 1e. Strip embedded 8-digit dates and hospital suffixes
1870
+ 1f. Strip trailing numeric IDs from billing systems
1871
+ 1g. Handle Workers Comp prefix ("Wc Aetna") -> parent payer + WC plan
1872
+ 2. Strip hospital prefixes: "JMPN AETNA", "NODE AETNA" -> "AETNA"
1873
+ 3. Extract plan type suffix: "AETNA HMO" -> name="AETNA", plan_type="HMO"
1874
+ 4. Look up canonical name: "AETNA" -> "Aetna"
1875
+ 4b. Try stripping trailing "HEALTH PLAN" / "HEALTHCARE" / etc.
1876
+ 4c. Try stripping ", INC." / ", LLC" / etc.
1877
+ 4d. Progressive prefix fallback: strip trailing words one at a time
1878
+ 5. Title-case fallback if not in map
1879
+ 6. Enrich plan_name with extracted plan_type if plan was empty
1880
+
1881
+ ``ref.payer_aliases`` (raw alias -> canonical name) are checked before
1882
+ the built-in map; ``ref.payer_match_index`` folds spelling variants of
1883
+ uncurated payers onto a name you already use (see
1884
+ ``_fold_canonical_via_match``).
1885
+ """
1886
+ if not raw_payer or not raw_payer.strip():
1887
+ return None, raw_plan
1888
+
1889
+ aliases: Dict[str, str] = ref.payer_aliases if ref is not None else {}
1890
+
1891
+ working = html.unescape(str(raw_payer)).strip()
1892
+ working = working.strip('"\'\u201c\u201d\u2018\u2019`')
1893
+ if working.startswith('<') and working.endswith('>'):
1894
+ working = working[1:-1].strip()
1895
+
1896
+ if _NUMERIC_PAYER_RE.match(working):
1897
+ return None, raw_plan
1898
+
1899
+ # Step 0: Unwrap bracket-enclosed names: "[Kaiser Foundation Health Plan, Inc.]"
1900
+ m = _BRACKET_WRAPPED_RE.match(working)
1901
+ if m:
1902
+ working = (m.group(1) or m.group(2)).strip()
1903
+
1904
+ # Step 1: Strip contract IDs [1001103], [1640000007], etc.
1905
+ working = _CONTRACT_ID_RE.sub('', working).strip()
1906
+
1907
+ # Step 1a: Replace underscores with spaces (some MRFs use underscores
1908
+ # as word separators, e.g. "BLUE_SHIELD_OF_CALIFORNIA")
1909
+ working = working.replace('_', ' ')
1910
+
1911
+ # Uppercase for matching
1912
+ upper = working.upper()
1913
+
1914
+ alias_match = aliases.get(_clean_payer_key(working))
1915
+ if alias_match:
1916
+ return alias_match, raw_plan
1917
+
1918
+ # Step 1b: Check junk list (after stripping contract IDs)
1919
+ if upper in _JUNK_PAYER_NAMES:
1920
+ return None, raw_plan
1921
+
1922
+ # Step 1b2: Reject decimal/rate-like values ("27.07", "147.05", quoted variants)
1923
+ if _RATE_LIKE_PAYER_RE.match(working):
1924
+ return None, raw_plan
1925
+
1926
+ # Step 1b3: Reject punctuation-only values ("#", "--", etc.)
1927
+ if _PUNCT_ONLY_PAYER_RE.match(working):
1928
+ return None, raw_plan
1929
+
1930
+ # Step 1b4: Reject bare integer-only values ("1199" alone without alphabetic context).
1931
+ # Legitimate numeric payers always have words (e.g. "1199 SEIU", "Local 104"); those
1932
+ # pass through the title-case fallback or canonical map and are preserved.
1933
+ if _INTEGER_ONLY_PAYER_RE.match(working):
1934
+ return None, raw_plan
1935
+
1936
+ # Step 1c: Discard per-diem rate values used as payer names
1937
+ # "Abbhh 14/Day", "Abbhh 22.37/Day": these are rate tiers, not payers
1938
+ if _PER_DIEM_PAYER_RE.match(upper):
1939
+ return 'Alexian Brothers School Package', raw_plan
1940
+
1941
+ # Step 1d: Handle percentage-prefixed payer names
1942
+ # "95% Anthem Blue Cross" -> payer="Anthem Blue Cross", percentage stored separately
1943
+ pct_match = _PCT_PREFIX_RE.match(working)
1944
+ if pct_match:
1945
+ payer_after_pct = pct_match.group(2).strip()
1946
+ upper_after = payer_after_pct.upper()
1947
+ # "100% All Other" -> Non-Contracted Payers (regex strips "100%" prefix,
1948
+ # so we only need to check for "ALL OTHER" here)
1949
+ if upper_after == 'ALL OTHER':
1950
+ return 'Non-Contracted Payers', raw_plan
1951
+ # "30% Self Pay/Uninsured Discount" -> route to self-pay
1952
+ if any(kw in upper_after for kw in ('SELF PAY', 'SELF-PAY', 'SELFPAY',
1953
+ 'UNINSURED', 'CASH')):
1954
+ return None, raw_plan # discard: self-pay rates
1955
+ # Otherwise, recursively normalize the payer portion
1956
+ canonical, enriched = normalize_payer_name(payer_after_pct, raw_plan, ref=ref)
1957
+ return canonical, enriched
1958
+
1959
+ # Step 1e: Strip embedded 8-digit dates and trailing hospital suffixes
1960
+ # "Cofinity/Ppom 20120101 (St Mary)" -> "Cofinity/Ppom"
1961
+ working = _EMBEDDED_DATE_RE.sub('', working).strip()
1962
+ upper = working.upper()
1963
+
1964
+ # Step 1f: Strip trailing numeric IDs from hospital billing systems
1965
+ # "Fidelis 5155" -> "Fidelis", but preserve "Imagine 360", "Local 104"
1966
+ if upper not in _TRAILING_ID_PRESERVE and 'LOCAL ' not in upper:
1967
+ # Strip compound IDs first so NY-style multi-ID suffixes still match intact
1968
+ # "Highmark BCBS Medicaid 1702, Another 5143" -> "Highmark BCBS Medicaid"
1969
+ working = _COMPOUND_ID_RE.sub('', working).strip()
1970
+ working = _TRAILING_ID_RE.sub('', working).strip()
1971
+ upper = working.upper()
1972
+
1973
+ # Step 1g: Handle "Workers Comp" prefix: "Wc Aetna" -> "Aetna" with WC plan
1974
+ wc_match = _WC_PREFIX_RE.match(working)
1975
+ if wc_match:
1976
+ wc_payer_part = wc_match.group(1).strip()
1977
+ # Recursively normalize the parent payer
1978
+ canonical, _ = normalize_payer_name(wc_payer_part, None, ref=ref)
1979
+ if canonical:
1980
+ # Enrich plan with Workers Comp category
1981
+ wc_plan = raw_plan if raw_plan else 'Workers Comp'
1982
+ return canonical, wc_plan
1983
+ # If parent is unrecognizable, keep as-is with Workers Comp prefix
1984
+ return f'Workers Comp - {wc_payer_part.title()}', raw_plan or 'Workers Comp'
1985
+
1986
+ # Step 2: Strip hospital-specific prefixes (includes NODE)
1987
+ for prefix in _HOSPITAL_PREFIXES:
1988
+ if upper.startswith(prefix):
1989
+ working = working[len(prefix):].strip()
1990
+ upper = working.upper()
1991
+ break
1992
+
1993
+ alias_match = aliases.get(_clean_payer_key(working))
1994
+ if alias_match:
1995
+ return alias_match, raw_plan
1996
+
1997
+ # Step 2b: Strip contract status suffixes when the base is recognizable.
1998
+ status_stripped = _PAYER_CONTRACT_STATUS_SUFFIX_RE.sub('', working).strip()
1999
+ if status_stripped and status_stripped != working:
2000
+ status_upper = status_stripped.upper()
2001
+ status_canonical = (aliases.get(_clean_payer_key(status_stripped))
2002
+ or _PAYER_CANONICAL_MAP.get(status_upper))
2003
+ if status_canonical:
2004
+ working = status_stripped
2005
+ upper = status_upper
2006
+
2007
+ # Step 3: Extract plan type suffix (only if it doesn't consume the entire name)
2008
+ # Try multiple passes to extract compound suffixes (e.g., "ALAMEDA ALLIANCE PPO-ALL OTHER PLANS")
2009
+ extracted_plan_type = None
2010
+ for suffix in _PLAN_TYPE_SUFFIXES:
2011
+ if upper.endswith(suffix):
2012
+ remainder = working[:len(working) - len(suffix)].strip().rstrip('-').strip()
2013
+ if remainder: # Don't extract if it would leave the name empty
2014
+ extracted_plan_type = working[len(working) - len(suffix):].strip().lstrip('-').strip()
2015
+ working = remainder
2016
+ upper = working.upper()
2017
+ break
2018
+
2019
+ if (not extracted_plan_type
2020
+ and upper not in _PAYER_CANONICAL_MAP
2021
+ and upper not in aliases):
2022
+ for suffix, plan_type in _PAYER_TRAILING_PLAN_SUFFIXES:
2023
+ if upper.endswith(suffix):
2024
+ remainder = working[:len(working) - len(suffix)].strip().rstrip('-').strip()
2025
+ if remainder:
2026
+ extracted_plan_type = plan_type
2027
+ working = remainder
2028
+ upper = working.upper()
2029
+ break
2030
+
2031
+ if not extracted_plan_type and ' ' not in upper and len(upper) > 5:
2032
+ lower_compact = re.sub(r'[^a-z0-9]', '', working.lower())
2033
+ for payer_prefix, canonical_name in _CONCAT_PAYER_PLAN_PATTERNS:
2034
+ if not lower_compact.startswith(payer_prefix):
2035
+ continue
2036
+ suffix_part = lower_compact[len(payer_prefix):]
2037
+ for suffix, plan_type in _CONCAT_PLAN_SUFFIXES:
2038
+ if suffix_part == suffix or suffix_part.endswith(suffix):
2039
+ canonical = canonical_name
2040
+ enriched_plan = raw_plan or plan_type
2041
+ return canonical, enriched_plan
2042
+
2043
+ # Step 3b: Normalize whitespace (collapse multiple spaces)
2044
+ working = re.sub(r'\s+', ' ', working).strip()
2045
+ upper = working.upper()
2046
+
2047
+ # Step 4: Canonical name lookup
2048
+ canonical = aliases.get(upper) or _PAYER_CANONICAL_MAP.get(upper)
2049
+
2050
+ # Step 4b: If not found, try without common trailing words
2051
+ if not canonical:
2052
+ for trail in ['HEALTH PLAN', 'HEALTHCARE', 'HEALTH SERVICES', 'HEALTH']:
2053
+ if upper.endswith(' ' + trail):
2054
+ trimmed = upper[:-(len(trail) + 1)].strip()
2055
+ canonical = aliases.get(trimmed) or _PAYER_CANONICAL_MAP.get(trimmed)
2056
+ if canonical:
2057
+ break
2058
+
2059
+ # Step 4c: If not found, try stripping ", INC." / ", LLC" / ", INC" etc.
2060
+ if not canonical:
2061
+ cleaned = re.sub(r',\s*(INC\.?|LLC\.?|LP\.?|CO\.?)\s*$', '', upper).strip()
2062
+ if cleaned != upper:
2063
+ canonical = aliases.get(cleaned) or _PAYER_CANONICAL_MAP.get(cleaned)
2064
+
2065
+ # Step 4d: Progressive prefix fallback - strip trailing words one at a time
2066
+ # and retry the map. "AETNA SOME NEW VARIANT" → "AETNA SOME NEW" → "AETNA"
2067
+ # Require the candidate to have ≥1 word (we already have the full string in
2068
+ # step 4). Stop as soon as we find a match.
2069
+ if not canonical:
2070
+ words = upper.split()
2071
+ for n in range(len(words) - 1, 0, -1):
2072
+ candidate = ' '.join(words[:n])
2073
+ canonical = aliases.get(candidate) or _PAYER_CANONICAL_MAP.get(candidate)
2074
+ if canonical:
2075
+ break
2076
+
2077
+ # Step 5: Fallback - title-case the cleaned name
2078
+ if not canonical:
2079
+ canonical = working.title()
2080
+ # Fold trivial spelling variants (plural/punctuation/whitespace) of an
2081
+ # uncurated payer onto the established payer that already owns this
2082
+ # match key, so two hospitals spelling the same payer differently stop
2083
+ # producing duplicate payers. No-op without a match index.
2084
+ canonical = _fold_canonical_via_match(canonical, ref)
2085
+
2086
+ # Step 6: Enrich plan_name
2087
+ enriched_plan = raw_plan
2088
+ if extracted_plan_type and not raw_plan:
2089
+ # Title-case the plan type: "HMO" stays "HMO", "MEDICARE" -> "Medicare"
2090
+ enriched_plan = extracted_plan_type.title()
2091
+ # Normalize common plan type abbreviations
2092
+ _plan_type_normalize = {
2093
+ 'Hmo': 'HMO', 'Ppo': 'PPO', 'Epo': 'EPO', 'Pos': 'POS',
2094
+ 'Indemnity': 'Indemnity',
2095
+ 'Mcare': 'Medicare', 'Network Mcare': 'Network Medicare',
2096
+ 'Mcr Adv': 'Medicare Advantage',
2097
+ 'Hmo/Ifp': 'HMO',
2098
+ 'Hmo/Ppo': 'HMO/PPO',
2099
+ 'Hmo/Pos': 'HMO/POS',
2100
+ 'Ppo/Epo': 'PPO',
2101
+ 'Ppo/EPO': 'PPO',
2102
+ 'Eppo': 'PPO',
2103
+ 'Ppo/Hmo': 'PPO/HMO',
2104
+ 'Ppo/Ep': 'PPO',
2105
+ }
2106
+ for original, replacement in _plan_type_normalize.items():
2107
+ enriched_plan = enriched_plan.replace(original, replacement)
2108
+
2109
+ return canonical, enriched_plan
2110
+
2111
+
2112
+ def is_valid_payer_name(
2113
+ name: Optional[str],
2114
+ *,
2115
+ ref: Optional[ReferenceData] = None,
2116
+ ) -> bool:
2117
+ """Return True if *name* survives normalization (i.e. is not junk).
2118
+
2119
+ A name is valid when normalize_payer_name() returns a non-None
2120
+ canonical form.
2121
+ """
2122
+ if name is None:
2123
+ return False
2124
+ canonical, _ = normalize_payer_name(name, ref=ref)
2125
+ return canonical is not None
2126
+
2127
+
2128
+
2129
+
2130
+ # PLAN NAME NORMALIZATION
2131
+ # ============================================================================
2132
+ # Classifies raw plan names into a standard taxonomy.
2133
+ # Each hospital system uses its own naming conventions:
2134
+ # Sutter: "Hmo/Ppo", "Medicare Adv_ Hmo / Ppo", "Medi-Cal"
2135
+ # O'Connor: "COMMERCIAL (HMO/PPO)", "MEDICARE ADVANTAGE (PPO)", "MEDI-CAL"
2136
+ # CMS JSON: "non-HMO Other Commercial Plan", "Medicare Managed Care Plan"
2137
+ # El Camino: "United Healthcare Ppo", "Blue Shield Medicare Advantage"
2138
+ # Tenet: "Blueshieldhix", "Molinamgdmcaid", "Americaschoiceprovidernetworkwc"
2139
+ # JohnMuir: "Mc Pending Cigna Com Pb", "Mc Ben Hum 076-356"
2140
+ # SFGH: "Anthem Blue Cross Non-Chn Mcalmc - Hill Physicians Mg"
2141
+
2142
+ # Standard plan categories (canonical):
2143
+ # Top-level plan categories (plan_category column).
2144
+ # These are the coarse buckets - independent of network type.
2145
+ PLAN_CATEGORIES = {
2146
+ 'Commercial',
2147
+ 'Medicare',
2148
+ 'Medicaid',
2149
+ 'TRICARE',
2150
+ 'Behavioral Health',
2151
+ 'Transplant',
2152
+ 'Employee',
2153
+ 'Government',
2154
+ 'Workers Comp',
2155
+ 'Other',
2156
+ }
2157
+
2158
+ # Valid network types (plan_network column, NULL when not applicable).
2159
+ PLAN_NETWORKS = {'HMO', 'PPO', 'POS', 'EPO', 'Indemnity', 'Managed Care'}
2160
+
2161
+ # plan_name → (plan_category, plan_network) lookup.
2162
+ # plan_name is the full classified name that _classify_plan() returns.
2163
+ _PLAN_NAME_TO_CAT_NET: dict = {
2164
+ # Commercial variants
2165
+ 'Commercial': ('Commercial', None),
2166
+ 'Commercial HMO': ('Commercial', 'HMO'),
2167
+ 'Commercial PPO': ('Commercial', 'PPO'),
2168
+ 'Commercial POS': ('Commercial', 'POS'),
2169
+ 'Commercial EPO': ('Commercial', 'EPO'),
2170
+ 'Commercial Indemnity': ('Commercial', 'Indemnity'),
2171
+ # Medicare variants
2172
+ 'Medicare': ('Medicare', None),
2173
+ 'Medicare Advantage': ('Medicare', None),
2174
+ 'Medicare Advantage HMO': ('Medicare', 'HMO'),
2175
+ 'Medicare Advantage PPO': ('Medicare', 'PPO'),
2176
+ 'Medicare PACE': ('Medicare', None),
2177
+ # Medicaid variants
2178
+ 'Medicaid': ('Medicaid', None),
2179
+ 'Medi-Cal': ('Medicaid', None),
2180
+ 'Medi-Cal Managed Care': ('Medicaid', 'Managed Care'),
2181
+ # Other top-level plans (no network type)
2182
+ 'TRICARE': ('TRICARE', None),
2183
+ 'Workers Comp': ('Workers Comp', None),
2184
+ 'Government': ('Government', None),
2185
+ 'Behavioral Health': ('Behavioral Health', None),
2186
+ 'Transplant': ('Transplant', None),
2187
+ 'Employee': ('Employee', None),
2188
+ 'Marketplace': ('Commercial', None),
2189
+ 'Covered California': ('Commercial', None),
2190
+ 'Other': ('Other', None),
2191
+ }
2192
+
2193
+
2194
+ def plan_name_to_cat_net(plan_name: str):
2195
+ """Return (plan_category, plan_network) for a classified plan_name.
2196
+
2197
+ plan_network is None when the plan type does not have an HMO/PPO/etc. variant.
2198
+ """
2199
+ if not plan_name:
2200
+ return ('Other', None)
2201
+ entry = _PLAN_NAME_TO_CAT_NET.get(plan_name)
2202
+ if entry:
2203
+ return entry
2204
+ # Unknown plan_name (title-cased fallback from _classify_plan) -
2205
+ # try to infer network from the name itself
2206
+ up = plan_name.upper()
2207
+ if 'PPO' in up:
2208
+ return ('Commercial', 'PPO')
2209
+ if re.search(r'\bEPO\b', up):
2210
+ return ('Commercial', 'EPO')
2211
+ if re.search(r'(?<!NON-)HMO', up):
2212
+ return ('Commercial', 'HMO')
2213
+ if 'POS' in up:
2214
+ return ('Commercial', 'POS')
2215
+ if 'INDEMNITY' in up:
2216
+ return ('Commercial', 'Indemnity')
2217
+ return ('Other', None)
2218
+
2219
+
2220
+
2221
+ # Plan classification rules - checked in order, first match wins.
2222
+ # Each rule: (pattern_function, canonical_plan_name)
2223
+ # Patterns match against uppercase plan name.
2224
+
2225
+ # Short abbreviation lookup: maps 2-5 char internal codes to categories.
2226
+ # Built from observed real-file data with payer context verification.
2227
+ _ABBREV_PLAN_MAP = {
2228
+ # Medicare abbreviations
2229
+ 'MCR': 'Medicare Advantage',
2230
+ 'MCRPOS': 'Medicare Advantage',
2231
+ 'MCRSNP': 'Medicare Advantage',
2232
+ 'MGMCR': 'Medicare Advantage',
2233
+ 'PFFS': 'Medicare Advantage', # Private Fee-For-Service Medicare
2234
+ 'DSNP': 'Medicare Advantage', # Dual Special Needs Plan
2235
+ # Medicaid abbreviations
2236
+ 'MCD': 'Medi-Cal',
2237
+ 'MGMCD': 'Medi-Cal Managed Care',
2238
+ # Workers Comp abbreviations
2239
+ 'WC': 'Workers Comp',
2240
+ 'WCOMP': 'Workers Comp',
2241
+ # Medicaid abbreviations (CHIP = Children's Health Insurance Program)
2242
+ 'CHIP': 'Medicaid',
2243
+ 'SCHIP': 'Medicaid',
2244
+ # Medicare abbreviations (special plan types)
2245
+ 'SNP': 'Medicare Advantage', # Special Needs Plan
2246
+ 'CSNP': 'Medicare Advantage', # Chronic SNP
2247
+ 'ISNP': 'Medicare Advantage', # Institutional SNP
2248
+ 'MMP': 'Medicare Advantage', # Medicare-Medicaid Plan
2249
+ 'MAPD': 'Medicare Advantage', # Medicare Advantage Prescription Drug
2250
+ # Commercial abbreviations
2251
+ 'COM': 'Commercial',
2252
+ 'COMM': 'Commercial',
2253
+ 'QHP': 'Marketplace', # Qualified Health Plan (ACA)
2254
+ 'IFP': 'Commercial', # Individual/Family Plan
2255
+ 'ASO': 'Commercial', # Administrative Services Only
2256
+ # Government abbreviations
2257
+ 'FEP': 'Government', # Federal Employee Program
2258
+ 'FEHB': 'Government', # Federal Employee Health Benefits
2259
+ 'GEHA': 'Government', # Government Employees Health Assoc.
2260
+ 'CHAMPVA': 'Government', # Civilian Health and Medical Program of VA
2261
+ # Behavioral health
2262
+ 'COMMBH': 'Behavioral Health',
2263
+ 'COCM': 'Commercial', # Collaborative care management
2264
+ }
2265
+
2266
+ # Concatenated token patterns for Tenet-style no-space plan names.
2267
+ # Matched against the lowercased concatenated string.
2268
+ # Order matters: more specific patterns before general ones.
2269
+ _CONCAT_PATTERNS = [
2270
+ # Medi-Cal Managed Care patterns
2271
+ ('mgdmcaid', 'Medi-Cal Managed Care'), # "Molinamgdmcaid", "Cahealthandwellnessmgdmcaid"
2272
+ ('mgdmcal', 'Medi-Cal Managed Care'),
2273
+ ('mcaid', 'Medi-Cal Managed Care'), # e.g. "Alphacareancillarymgdmcaid"
2274
+ ('mcal', 'Medi-Cal'), # Broad Medi-Cal match
2275
+ # Marketplace / Exchange
2276
+ ('hix', 'Marketplace'), # "Blueshieldhix", "Ambetterhix", "Molinahix"
2277
+ ('exchange', 'Marketplace'),
2278
+ # Workers Comp patterns (suffix)
2279
+ ('wc', 'Workers Comp'), # "Bluecrosswc", "Corvelwc", "Americaschoiceprovidernetworkwc"
2280
+ # Medicare
2281
+ ('medicare', 'Medicare Advantage'),
2282
+ ('mcare', 'Medicare Advantage'),
2283
+ # Behavioral
2284
+ ('behavioral', 'Behavioral Health'),
2285
+ ('behavioralcare', 'Behavioral Health'),
2286
+ # Commercial sub-patterns (less specific, checked last)
2287
+ ('indemnity', 'Commercial Indemnity'), # "Cignaindemnity", "Aetnaindemnity"
2288
+ ('reciprocity', 'Commercial'), # "Blueshieldreciprocity", "Tenetreciprocity"
2289
+ ('ancillary', 'Commercial'), # "Hillphysiciansancillary", "Allcareipaancillary"
2290
+ ('gatekeeper', 'Commercial'), # "Aetnagatekeeper", "Aetnanongatekeeper"
2291
+ ('nongatekeeper', 'Commercial'),
2292
+ ('select', 'Commercial'), # "Bluecrossselect"
2293
+ ('nonmcs', 'Commercial'), # "Bluecrossnonmcs"
2294
+ ('medical', 'Commercial'), # "Bluecrossmedical", "Centralcaalliancemedical"
2295
+ ]
2296
+
2297
+
2298
+ def _classify_concatenated(lower: str) -> Optional[str]:
2299
+ """Classify a concatenated/camelCase plan name with no spaces.
2300
+
2301
+ Tenet JSON MRFs produce plan names like "Blueshieldhix",
2302
+ "Molinamgdmcaid", "Americaschoiceprovidernetworkwc".
2303
+ This function detects known tokens within these strings.
2304
+ """
2305
+ # Workers comp: must check suffix specifically to avoid false positives
2306
+ # (e.g., "Healthcomp" contains "wc" but is not workers comp)
2307
+ if lower.endswith('wc'):
2308
+ return 'Workers Comp'
2309
+
2310
+ for token, category in _CONCAT_PATTERNS:
2311
+ if token == 'wc':
2312
+ continue # Already handled above as suffix-only
2313
+ if token in lower:
2314
+ return category
2315
+
2316
+ return None
2317
+
2318
+
2319
+ def _classify_plan(upper: str, raw_plan: str, payer_canonical: str) -> str:
2320
+ """Classify a plan name into a standard category.
2321
+
2322
+ Standard categories (PLAN_CATEGORIES):
2323
+ Commercial, Commercial HMO/PPO/POS, Medicare Advantage (HMO/PPO),
2324
+ Medicare PACE, Medi-Cal, Medi-Cal Managed Care, Marketplace,
2325
+ TRICARE, Covered California, Behavioral Health, Transplant,
2326
+ Employee, Government, Workers Comp, Other.
2327
+ """
2328
+
2329
+ # ---- Strip bracket-wrapped plan names first, then contract IDs ----
2330
+ # e.g., "[Medicaid]" -> "MEDICAID"
2331
+ m = re.match(r'^\[(.+)\]$', upper)
2332
+ if m:
2333
+ upper = m.group(1).strip()
2334
+ # Strip trailing contract IDs: "Beacon Health Strategies [100510301]"
2335
+ upper = re.sub(r'\s*\[[\w]+\]\s*$', '', upper).strip()
2336
+
2337
+ # ---- Short abbreviation lookup (before keyword matching) ----
2338
+ # Handles: Mcr, Mcd, Wc, Mgmcr, Dsnp, Qhp, etc.
2339
+ abbrev_result = _ABBREV_PLAN_MAP.get(upper)
2340
+ if abbrev_result:
2341
+ return abbrev_result
2342
+
2343
+ # ---- Workers Comp variants (before Medi-Cal to avoid false matches) ----
2344
+ if (re.search(r"WORKER'?S[_ ]?COMP", upper)
2345
+ or upper in ('WORKERS COMP', 'WORKERS COMPENSATION',
2346
+ 'WORKER COMP', 'WORK COMP')
2347
+ or upper.startswith('WORKERS COMP')):
2348
+ return 'Workers Comp'
2349
+
2350
+ # ---- TRICARE (military) ----
2351
+ if re.search(r'\bTRICARE\b', upper) or upper == 'TRICARE':
2352
+ return 'TRICARE'
2353
+ # CHAMPVA (civilian VA medical program - classified as Government)
2354
+ if 'CHAMPVA' in upper or 'CHAMP VA' in upper:
2355
+ return 'Government'
2356
+ # VA Community Care Network (VACCN) - military/veterans
2357
+ if re.search(r'\bVACCN\b', upper) or 'VA COMMUNITY CARE' in upper:
2358
+ return 'TRICARE'
2359
+
2360
+ # ---- Medicaid variants (before Medicare to avoid misclassification) ----
2361
+ if 'MEDI-CAL' in upper or 'MEDI CAL' in upper or 'MEDICAL' == upper or 'MANAGED MEDI' in upper:
2362
+ return 'Medi-Cal'
2363
+ if re.search(r'\bMEDICAID\b', upper):
2364
+ return 'Medi-Cal'
2365
+
2366
+ # ---- CHIP / SCHIP (Children's Health Insurance Program → Medicaid) ----
2367
+ if re.search(r'\bCHIP\b', upper) or re.search(r'\bSCHIP\b', upper):
2368
+ return 'Medicaid'
2369
+ if 'CHILD HEALTH PLUS' in upper or 'KIDCARE' in upper:
2370
+ return 'Medicaid'
2371
+
2372
+ # ---- State Medicaid programs ----
2373
+ # Texas STAR programs (STAR, STAR+PLUS, STAR Kids, STAR Health)
2374
+ if re.search(r'\bSTAR\s*\+?\s*PLUS\b', upper):
2375
+ return 'Medicaid'
2376
+ if re.search(r'\bSTAR\s*KIDS?\b', upper) or upper == 'STARKIDS':
2377
+ return 'Medicaid'
2378
+ if re.search(r'\bSTAR\s*HEALTH\b', upper):
2379
+ return 'Medicaid'
2380
+ # MassHealth (Massachusetts Medicaid)
2381
+ if 'MASSHEALTH' in upper:
2382
+ return 'Medicaid'
2383
+ # NY Essential Plans
2384
+ if 'ESSENTIAL PLAN' in upper:
2385
+ return 'Medicaid'
2386
+ if re.search(r'\bESSENTIAL\s+P[QA]\b', upper):
2387
+ return 'Medicaid'
2388
+ # ConnectorCare (Massachusetts subsidized Medicaid plans)
2389
+ if 'CONNECTORCARE' in upper or 'CONNECTOR CARE' in upper:
2390
+ return 'Medicaid'
2391
+ # Family Choice (Medicaid MCOs - MedStar Family Choice MD/DC)
2392
+ if 'FAMILY CHOICE' in upper:
2393
+ return 'Medicaid'
2394
+ # Community Plan (UHC Community Plan = Medicaid MCO)
2395
+ if 'COMMUNITY PLAN' in upper:
2396
+ return 'Medicaid'
2397
+ # WellSense / BMC HealthNet (Medicaid MCOs)
2398
+ if 'WELLSENSE' in upper:
2399
+ return 'Medicaid'
2400
+ # Better Health (Medicaid-related programs)
2401
+ if 'BETTER HEALTH' in upper and 'HEALTHY' in upper:
2402
+ return 'Medicaid'
2403
+ # Healthy Kids programs
2404
+ if 'HEALTHY KIDS' in upper or 'HEALTHY KID' in upper:
2405
+ return 'Medicaid'
2406
+
2407
+ # ---- Medi-Cal Managed Care ----
2408
+ # SFGH: "Anthem Blue Cross Non-Chn Mcalmc - Hill Physicians Mg"
2409
+ # Tenet: "Molinamgdmcaid" (handled by concatenated classifier)
2410
+ if 'MCALMC' in upper:
2411
+ return 'Medi-Cal Managed Care'
2412
+
2413
+ # ---- Government programs ----
2414
+ if upper == 'GOVERNMENT' or upper.startswith('GOVERNMENT'):
2415
+ return 'Government'
2416
+ # Federal Employee Health Benefits / Federal Employee Program
2417
+ if 'FEDERAL EMPLOYEE' in upper or upper == 'FEHB' or upper == 'FEP':
2418
+ return 'Government'
2419
+ if re.search(r'\bGEHA\b', upper):
2420
+ return 'Government'
2421
+
2422
+ # ---- Medicare Advantage variants ----
2423
+ if 'PACE' in upper:
2424
+ return 'Medicare PACE'
2425
+ if 'MEDICARE ADV' in upper or 'MEDICARE ADVANTAGE' in upper:
2426
+ # Preserve HMO vs PPO distinction if present
2427
+ if 'PPO' in upper and 'HMO' not in upper:
2428
+ return 'Medicare Advantage PPO'
2429
+ if 'HMO' in upper and 'PPO' not in upper:
2430
+ return 'Medicare Advantage HMO'
2431
+ return 'Medicare Advantage'
2432
+ if 'MCR ADV' in upper:
2433
+ return 'Medicare Advantage'
2434
+ if 'D-SNP' in upper:
2435
+ return 'Medicare Advantage'
2436
+ if re.search(r'\bDUAL\b', upper):
2437
+ return 'Medicare Advantage'
2438
+ # SNP / MMP / Special Needs Plans (Medicare sub-types)
2439
+ if re.search(r'\bSNP\b', upper) or re.search(r'\bCSNP\b', upper) or re.search(r'\bISNP\b', upper):
2440
+ return 'Medicare Advantage'
2441
+ if re.search(r'\bMMP\b', upper):
2442
+ return 'Medicare Advantage'
2443
+ if 'DUAL ELIGIBLE' in upper or 'DUALELIGIBLE' in upper:
2444
+ return 'Medicare Advantage'
2445
+ if re.search(r'\bMAPD\b', upper):
2446
+ return 'Medicare Advantage'
2447
+ if upper.startswith('MEDICARE') or 'MEDICARE' in upper:
2448
+ # "Medicare Managed Care Plan" etc.
2449
+ return 'Medicare Advantage'
2450
+
2451
+ # ---- Marketplace / Health Exchange ----
2452
+ if re.search(r'\bHIX\b', upper) or 'EXCHANGE' in upper:
2453
+ return 'Marketplace'
2454
+ if re.search(r'\bAMBETTER\b', upper):
2455
+ return 'Marketplace'
2456
+ if re.search(r'\bMARKETPLACE\b', upper):
2457
+ return 'Marketplace'
2458
+ if re.search(r'\bQHP\b', upper):
2459
+ return 'Marketplace'
2460
+
2461
+ # ---- Covered California ----
2462
+ if 'COVERED CA' in upper or 'COVERED CALIFORNIA' in upper:
2463
+ return 'Covered California'
2464
+
2465
+ # ---- Transplant ----
2466
+ if 'TRANSPLANT' in upper or 'DONOR NETWORK' in upper:
2467
+ return 'Transplant'
2468
+
2469
+ # ---- Employee plan ----
2470
+ if upper == 'EMPLOYEE' or upper.startswith('EMPLOYEE'):
2471
+ return 'Employee'
2472
+
2473
+ # ---- Behavioral health ----
2474
+ if 'BEHAVIORAL HEALTH' in upper or re.search(r'\bEAP\b', upper):
2475
+ return 'Behavioral Health'
2476
+ if 'BEHAVIORAL' in upper:
2477
+ return 'Behavioral Health'
2478
+
2479
+ # ---- Commercial: explicit markers ----
2480
+ if 'COMMERCIAL' in upper:
2481
+ has_hmo = bool(re.search(r'(?<!NON-)HMO', upper))
2482
+ has_ppo = 'PPO' in upper
2483
+ has_pos = 'POS' in upper and 'HMO' not in upper
2484
+ has_epo = bool(re.search(r'\bEPO\b', upper))
2485
+ has_indemnity = 'INDEMNITY' in upper
2486
+ if has_indemnity and not has_hmo and not has_ppo and not has_epo and not has_pos:
2487
+ return 'Commercial Indemnity'
2488
+ if has_ppo and not has_hmo:
2489
+ return 'Commercial PPO'
2490
+ if has_epo and not has_hmo and not has_ppo:
2491
+ return 'Commercial PPO'
2492
+ if has_hmo and not has_ppo:
2493
+ return 'Commercial HMO'
2494
+ if has_pos:
2495
+ return 'Commercial POS'
2496
+ return 'Commercial'
2497
+
2498
+ # ---- Commercial: HMO/PPO plan types ----
2499
+ # Catch "Hmo/Ppo", "Hmo / Ppo", "HMO", "PPO", "EPO", "POS", "PPO/EPO"
2500
+ # Also "All Commercial Plans", "Individual", etc.
2501
+ if upper in ('HMO/PPO', 'HMO / PPO', 'HMO/ PPO', 'HMO /PPO'):
2502
+ return 'Commercial'
2503
+ if upper == 'HMO':
2504
+ return 'Commercial HMO'
2505
+ if upper in ('PPO', 'PPO/EPO', 'EPO'):
2506
+ return 'Commercial PPO'
2507
+ if upper == 'POS':
2508
+ return 'Commercial POS'
2509
+ if upper == 'INDEMNITY':
2510
+ return 'Commercial Indemnity'
2511
+ if upper in ('INDIVIDUAL', 'ALL COMMERCIAL PLANS'):
2512
+ return 'Commercial'
2513
+
2514
+ # ---- "All Products" umbrella plans → Commercial ----
2515
+ if re.search(r'\bALL\s+PRODUCTS?\b', upper):
2516
+ return 'Commercial'
2517
+
2518
+ # ---- Self-funded / ASO / Fully Insured → Commercial ----
2519
+ if re.search(r'\bSELF[- ]?FUNDED\b', upper) or re.search(r'\bASO\b', upper):
2520
+ return 'Commercial'
2521
+ if 'FULLY INSURED' in upper:
2522
+ return 'Commercial'
2523
+
2524
+ # ---- IFP (Individual/Family Plan) → Commercial ----
2525
+ if upper == 'IFP' or re.search(r'\bINDIVIDUAL\s*/?\s*FAMILY\b', upper):
2526
+ return 'Commercial'
2527
+
2528
+ # ---- Group size labels → Commercial ----
2529
+ if re.search(r'\b(SMALL|LARGE)\s*GROUP\b', upper) or upper == 'SMALLGROUP':
2530
+ return 'Commercial'
2531
+
2532
+ # ---- John Muir internal codes ----
2533
+ # "MC PENDING CIGNA COM PB" → Commercial (pending contract)
2534
+ # "MC BEN HUM 076-356" → Medicare Advantage (Humana MA benefit)
2535
+ # "MC BEN SCAN 101" → Medicare Advantage (SCAN is MA plan)
2536
+ if upper.startswith('MC PENDING ') or upper.startswith('MC BEN '):
2537
+ jm_suffix = upper[len('MC PENDING '):] if upper.startswith('MC PENDING ') else upper[len('MC BEN '):]
2538
+ jm_upper = jm_suffix.upper()
2539
+ # MA payers in John Muir context
2540
+ if any(p in jm_upper for p in ('HEALTHNET MA', 'BLUESHIELD MA',
2541
+ 'SCAN', 'HUM', 'CAN')):
2542
+ return 'Medicare Advantage'
2543
+ # Default: commercial pending contracts
2544
+ return 'Commercial'
2545
+
2546
+ # ---- Managed Care (generic) ----
2547
+ if upper == 'MANAGED CARE':
2548
+ return 'Commercial'
2549
+
2550
+ # ---- Payer-specific plan names ----
2551
+ # "Blue Shield Ppo", "Cigna Ppo", "United Healthcare Select Ppo", etc.
2552
+ # Strip the payer name prefix to find the plan type
2553
+ payer_upper = payer_canonical.upper() if payer_canonical else ''
2554
+ plan_suffix = upper
2555
+ if payer_upper and upper.startswith(payer_upper):
2556
+ plan_suffix = upper[len(payer_upper):].strip()
2557
+ # Also try common short payer names
2558
+ for prefix in ('BLUE CROSS ANTHEM ', 'BLUE SHIELD ', 'ANTHEM BLUE CROSS ',
2559
+ 'ANTHEM BC ', 'ANTHEM ',
2560
+ 'UNITED HEALTHCARE ', 'UNITED HEALTH CARE ', 'UHC ',
2561
+ 'CIGNA ', 'AETNA ', 'HEALTH NET ', 'HEALTHNET ',
2562
+ 'HUMANA ', 'KAISER ', 'KAISER PERMANENTE ',
2563
+ 'ALIGNMENT HEALTH PLAN ', 'SCAN ', 'SCFHP ',
2564
+ 'MULTIPLAN ', 'BLUE CROSS '):
2565
+ if upper.startswith(prefix):
2566
+ plan_suffix = upper[len(prefix):].strip()
2567
+ break
2568
+
2569
+ if plan_suffix:
2570
+ ps = plan_suffix
2571
+ if 'MEDICARE' in ps or 'MCARE' in ps or 'MCR ADV' in ps:
2572
+ return 'Medicare Advantage'
2573
+ if 'MEDI-CAL' in ps or 'MANAGED MEDI' in ps:
2574
+ return 'Medi-Cal'
2575
+ if ps in ('PATHWAY', 'PATHWAYS', 'PATHWAY X', 'BLUE CONNECTION',
2576
+ 'PREFERRED', 'TRADITIONAL', 'SHORT TERM LIMITED DURATION',
2577
+ 'LOCALPLUS'):
2578
+ return 'Commercial'
2579
+ if ps in ('PPO', 'SELECT PPO', 'OUT OF STATE PPO', "DOCTOR'S PLAN", 'EPO', 'PPO/EPO'):
2580
+ return 'Commercial PPO'
2581
+ if ps in ('HMO', 'SR HMO'):
2582
+ return 'Commercial HMO'
2583
+ if ps in ('HMO/POS', 'HMO / POS', 'POS'):
2584
+ return 'Commercial POS'
2585
+ if ps == 'INDEMNITY':
2586
+ return 'Commercial Indemnity'
2587
+
2588
+ # ---- Catch-all patterns ----
2589
+ if 'OTHER COMMERCIAL' in upper or 'NON-HMO' in upper:
2590
+ return 'Commercial'
2591
+ if 'PPO' in upper or re.search(r'\bEPO\b', upper):
2592
+ return 'Commercial PPO'
2593
+ if re.search(r'(?<!NON-)HMO', upper):
2594
+ return 'Commercial HMO'
2595
+ if re.search(r'\bINDEMNITY\b', upper):
2596
+ return 'Commercial Indemnity'
2597
+
2598
+ # ---- Specific known plans ----
2599
+ if upper == 'SFHSS':
2600
+ return 'Commercial' # San Francisco Health Service System
2601
+ if 'SELECT/NAVIGATE' in upper or 'OAP' in upper:
2602
+ return 'Commercial'
2603
+
2604
+ # ---- TRICARE short forms ----
2605
+ if upper in ('TRI', 'TRIM', 'TRICARE EAST', 'TRICARE WEST'):
2606
+ return 'TRICARE'
2607
+
2608
+ # ---- Veterans / VA ----
2609
+ if upper in ('VETERANS', 'VETERANS AFFAIRS') or 'VETERANS ADMIN' in upper:
2610
+ return 'Government'
2611
+
2612
+ # ---- Generic catch-alls that indicate commercial plans ----
2613
+ # "All Other Plans", "All Plans", "Comm - All Other Plans" etc.
2614
+ if re.search(r'ALL\s*(OTHER\s*)?PLANS', upper):
2615
+ return 'Commercial'
2616
+ if upper.endswith('COMM') or 'COMM ' in upper:
2617
+ return 'Commercial'
2618
+ if 'HEALTHY FAMILY' in upper or 'HEALTHY FAMILIES' in upper:
2619
+ return 'Medicaid'
2620
+
2621
+ # ---- Plan name is just a payer/network name (no plan type info) ----
2622
+ # These should default to "Commercial" since they indicate a payer relationship
2623
+ # without specifying a government program
2624
+ _PAYER_AS_PLAN_NAMES = {
2625
+ 'AETNA', 'ANTHEM', 'ANTHEM BLUE CROSS', 'BLUE CROSS', 'BLUE SHIELD',
2626
+ 'CIGNA', 'HEALTHNET', 'HEALTH NET', 'HUMANA', 'KAISER',
2627
+ 'KAISER PERMANENTE', 'UNITED', 'UNITED HEALTHCARE',
2628
+ 'UNITED HEALTH CARE', 'UNITEDHEALTHCARE', 'UHC', 'UMR',
2629
+ 'MULTIPLAN', 'BEECH STREET', 'INTERPLAN', 'HEALTH PLAN OF SAN MATEO',
2630
+ 'SUTTER HEALTH', 'SUTTER', 'OPTUM',
2631
+ 'BEACON HEALTH STRATEGIES', 'CLARITEV',
2632
+ 'COVENTRY HEALTHCARE', 'CAREMORE HEALTH PLAN',
2633
+ 'AETNA LIFE', 'HUMANA-CHOICE CARE',
2634
+ }
2635
+ if upper in _PAYER_AS_PLAN_NAMES:
2636
+ return 'Commercial'
2637
+
2638
+ # Also check if the plan name matches the payer's canonical name (case-insensitive)
2639
+ if payer_upper and upper == payer_upper:
2640
+ return 'Commercial'
2641
+
2642
+ # ---- Concatenated/CamelCase names (Tenet JSON) ----
2643
+ # No spaces → try splitting by known tokens
2644
+ # Only attempt if the string has no spaces and is reasonably long
2645
+ if ' ' not in upper and len(upper) > 6:
2646
+ concat_result = _classify_concatenated(upper.lower())
2647
+ if concat_result:
2648
+ return concat_result
2649
+
2650
+ # ---- Fallback: return cleaned title-case of the raw plan ----
2651
+ return raw_plan.strip().title() if raw_plan else 'Other'
2652
+
2653
+
2654
+ _PLAN_LEADING_CONTRACT_RE = re.compile(r'^\s*\d{2,6}[_\s-]+')
2655
+ _PLAN_TRAILING_CONTRACT_RE = re.compile(r'\s+-\s+\d{5,8}\s*$')
2656
+ _PLAN_TRAILING_DATE_RE = re.compile(r'(?:^|\s+)\d{8}\s*$')
2657
+ _PLAN_BRACKETED_ID_RE = re.compile(r'\s*\[[\w-]*\d[\w-]*\]')
2658
+ _PLAN_SITE_CODES = (
2659
+ 'AB', 'BAOK', 'BO', 'BOGI', 'BOSU', 'DEKALB', 'FNWI', 'GO', 'HN',
2660
+ 'JPOK', 'LG', 'MCOK', 'MEWI', 'MIL', 'MTTN', 'MW', 'MWWI', 'NHOK',
2661
+ 'OHOK', 'RHTN', 'RPTN', 'SA', 'SDTN', 'SEWI', 'SFWI', 'SJWI', 'SPOK',
2662
+ 'STTN', 'THTN', 'VEIN', 'WVN',
2663
+ )
2664
+ _PLAN_SITE_CODE_PATTERN = '|'.join(re.escape(code) for code in _PLAN_SITE_CODES)
2665
+ _PLAN_SITE_PREFIX_RE = re.compile(
2666
+ rf'^(?:(?:{_PLAN_SITE_CODE_PATTERN})(?:,\s*|\s+))+',
2667
+ re.IGNORECASE,
2668
+ )
2669
+ _PLAN_SITE_PAREN_RE = re.compile(
2670
+ rf'\s*\((?:{_PLAN_SITE_CODE_PATTERN})'
2671
+ rf'(?:,\s*(?:{_PLAN_SITE_CODE_PATTERN}))*\)\s*',
2672
+ re.IGNORECASE,
2673
+ )
2674
+ _PLAN_SITE_SUFFIX_RE = re.compile(
2675
+ rf'(?:\s+(?:{_PLAN_SITE_CODE_PATTERN}))+\s*$',
2676
+ re.IGNORECASE,
2677
+ )
2678
+
2679
+
2680
+ def _clean_plan_display_artifacts(raw_plan: str) -> str:
2681
+ """Strip source-system IDs/dates from plan display names."""
2682
+ cleaned = raw_plan.strip()
2683
+
2684
+ had_contract_prefix = bool(_PLAN_LEADING_CONTRACT_RE.match(cleaned))
2685
+ had_bracketed_id = bool(_PLAN_BRACKETED_ID_RE.search(cleaned))
2686
+ had_trailing_contract = bool(_PLAN_TRAILING_CONTRACT_RE.search(cleaned))
2687
+ had_trailing_date = bool(_PLAN_TRAILING_DATE_RE.search(cleaned))
2688
+ artifact_context = (
2689
+ had_contract_prefix or had_bracketed_id
2690
+ or had_trailing_contract or had_trailing_date
2691
+ )
2692
+
2693
+ cleaned = _PLAN_LEADING_CONTRACT_RE.sub('', cleaned).strip()
2694
+ cleaned = _PLAN_BRACKETED_ID_RE.sub('', cleaned).strip()
2695
+ cleaned = _PLAN_TRAILING_CONTRACT_RE.sub('', cleaned).strip()
2696
+ cleaned = _PLAN_TRAILING_DATE_RE.sub('', cleaned).strip()
2697
+
2698
+ if artifact_context:
2699
+ cleaned = _PLAN_SITE_PAREN_RE.sub(' ', cleaned).strip()
2700
+ cleaned = _PLAN_SITE_PREFIX_RE.sub('', cleaned).strip()
2701
+ cleaned = _PLAN_SITE_SUFFIX_RE.sub('', cleaned).strip()
2702
+ cleaned = _PLAN_TRAILING_DATE_RE.sub('', cleaned).strip()
2703
+ cleaned = _PLAN_SITE_SUFFIX_RE.sub('', cleaned).strip()
2704
+
2705
+ cleaned = re.sub(r'\s*,\s*,+', ', ', cleaned)
2706
+ cleaned = re.sub(r'\s{2,}', ' ', cleaned)
2707
+ return cleaned.strip(' ,-_')
2708
+
2709
+
2710
+ def normalize_plan_name(
2711
+ raw_plan: Optional[str],
2712
+ payer_canonical: str,
2713
+ ) -> tuple:
2714
+ """
2715
+ Normalize a raw plan name into category, network type, and canonical name.
2716
+
2717
+ Top-level categories (plan_category):
2718
+ Commercial, Medicare, Medicaid, TRICARE, Behavioral Health,
2719
+ Transplant, Employee, Government, Workers Comp, Other.
2720
+
2721
+ Network types (plan_network, None when not applicable):
2722
+ HMO, PPO, POS, EPO, Managed Care.
2723
+
2724
+ plan_name is the full classified canonical name (e.g. 'Commercial PPO',
2725
+ 'Medicare Advantage HMO', 'Medi-Cal Managed Care').
2726
+
2727
+ Args:
2728
+ raw_plan: Raw plan name from source data
2729
+ payer_canonical: Already-normalized payer name (for stripping payer prefix)
2730
+
2731
+ Returns: Tuple of (plan_category, plan_network, plan_name).
2732
+ plan_category is the top-level bucket ('Commercial', 'Medicare', etc.)
2733
+ plan_network is the network type ('HMO', 'PPO', etc.) or None.
2734
+ plan_name is the full classified name ('Commercial PPO', etc.)
2735
+ """
2736
+ if not raw_plan or not raw_plan.strip():
2737
+ return ('Other', None, 'Other')
2738
+
2739
+ cleaned = _clean_plan_display_artifacts(raw_plan)
2740
+ # Strip bracket-wrapped contract IDs: "Anthem Blue Connection Epo [100210404]"
2741
+ cleaned = re.sub(r'\s*\[[\w]+\]\s*$', '', cleaned).strip()
2742
+ # Unwrap fully bracket-wrapped names: "[Medicaid]" -> "Medicaid"
2743
+ m = re.match(r'^\[(.+)\]$', cleaned)
2744
+ if m:
2745
+ cleaned = m.group(1).strip()
2746
+
2747
+ upper = cleaned.upper()
2748
+ # Normalize underscores used as spaces (Sutter: "Medicare Adv_ Hmo / Ppo")
2749
+ upper = upper.replace('_', ' ').strip()
2750
+ upper = re.sub(r'\s+', ' ', upper)
2751
+
2752
+ plan_name = _classify_plan(upper, cleaned, payer_canonical)
2753
+ plan_category, plan_network = plan_name_to_cat_net(plan_name)
2754
+ return (plan_category, plan_network, plan_name)
2755
+