Skip to content

Commit cadb8b0

Browse files
authored
BFD-4832: Ensure practitioner/org synthetic data persists (#3233)
1 parent 31db88d commit cadb8b0

7 files changed

Lines changed: 280 additions & 697 deletions

apps/bfd-model-idr/generate_prior_auth_sample.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,25 @@ def find_bene_sk(mbi_num: str) -> str:
2626
return "123456789"
2727

2828

29+
def ensure_provider_history_exists(npis: set[str]) -> None:
30+
poc_path = "sample-data/PRVDR_HSTRY_POC.csv"
31+
synth_path = "out/SYNTHETIC_PRVDR_HSTRY.csv"
32+
if not os.path.exists(poc_path) or not os.path.exists(synth_path):
33+
return
34+
35+
df_poc = pd.read_csv(poc_path, dtype=str, keep_default_na=False)
36+
existing_npis = set(df_poc["PRVDR_SK"])
37+
missing_npis = {n for n in npis if n} - existing_npis
38+
if not missing_npis:
39+
return
40+
41+
df_synth = pd.read_csv(synth_path, dtype=str, keep_default_na=False)
42+
matches = df_synth[df_synth["PRVDR_SK"].isin(missing_npis)]
43+
if not matches.empty:
44+
new_rows = matches[df_poc.columns].drop_duplicates(subset=["PRVDR_SK"])
45+
pd.concat([df_poc, new_rows], ignore_index=True).to_csv(poc_path, index=False)
46+
47+
2948
def main():
3049
parser = argparse.ArgumentParser(
3150
description="Generate a prior auth sample JSON from SYNTHETIC_PRAUC.csv based on UTN."
@@ -58,6 +77,11 @@ def main():
5877
matching_rows_df["CURRENT_SEGMENT"] = matching_rows_df["CURRENT_SEGMENT"].astype(int)
5978
matching_rows_df = matching_rows_df.sort_values(by="CURRENT_SEGMENT")
6079

80+
# Collect provider NPIs and ensure they exist in sample-data/PRVDR_HSTRY_POC.csv
81+
npi_cols = [c for c in matching_rows_df.columns if "NPI" in c]
82+
npis = set(matching_rows_df[npi_cols].to_numpy().ravel())
83+
ensure_provider_history_exists(npis)
84+
6185
# Get bene_sk
6286
bene_sk = find_bene_sk(target_mbi)
6387

apps/bfd-model-idr/maps/ExplanationOfBenefit-Base.map

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ group createEOBBase(source src: ExplanationOfBenefitBase, target tgt: BFDEOB){
2929
//CodeSystem -> CLM_TYPE_CD
3030
src.CLM_TYPE_CD as typeCd -> tgtCC.coding = translate(typeCd,'https://bfd.cms.gov/MappingLanguage/Maps/ExplanationOfBenefit-Helper#CLM_TYPE_CD','coding') "translate code";
3131
src.CLM_TYPE_CD as typeCd -> tgtCC.coding = c('https://bluebutton.cms.gov/fhir/CodeSystem/CLM-TYPE-CD', typeCd) "Add claim type code";
32-
src.CLM_TYPE_CD as typeCd -> tgtCC.coding = c("https://bluebutton.cms.gov/fhir/CodeSystem/EOB-TYPE", typeCd) "Add eob-type coding";
32+
src.CLM_TYPE_CD as typeCd -> tgtCC.coding = translate(typeCd,'https://bfd.cms.gov/MappingLanguage/Maps/ExplanationOfBenefit-Helper#EOB_TYPE','coding') "Add eob-type coding";
3333
} "Create type";
3434

3535
src -> tgt.subType = create('CodeableConcept') as tgtCC then {

apps/bfd-model-idr/maps/ExplanationOfBenefit-Helper.map

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,132 @@ conceptmap "subtype" {
297297
s:2041 == t:"inpatient"
298298
}
299299

300+
conceptmap "EOB_TYPE" {
301+
prefix s = "https://hl7.org/fhir/string"
302+
prefix t = "https://bluebutton.cms.gov/fhir/CodeSystem/EOB-TYPE"
303+
304+
s:1 == t:"PDE"
305+
s:2 == t:"PDE"
306+
s:3 == t:"PDE"
307+
s:4 == t:"PDE"
308+
s:10 == t:"HHA"
309+
s:1032 == t:"HHA"
310+
s:1033 == t:"HHA"
311+
s:1039 == t:"HHA"
312+
s:1042 == t:"HHA"
313+
s:1066 == t:"HHA"
314+
s:1092 == t:"HHA"
315+
s:2032 == t:"HHA"
316+
s:2033 == t:"HHA"
317+
s:2039 == t:"HHA"
318+
s:2042 == t:"HHA"
319+
s:2066 == t:"HHA"
320+
s:2092 == t:"HHA"
321+
s:20 == t:"SNF"
322+
s:30 == t:"SNF"
323+
s:1018 == t:"SNF"
324+
s:1021 == t:"SNF"
325+
s:2018 == t:"SNF"
326+
s:2021 == t:"SNF"
327+
s:40 == t:"OUTPATIENT"
328+
s:1000 == t:"OUTPATIENT"
329+
s:1012 == t:"OUTPATIENT"
330+
s:1013 == t:"OUTPATIENT"
331+
s:1014 == t:"OUTPATIENT"
332+
s:1022 == t:"OUTPATIENT"
333+
s:1023 == t:"OUTPATIENT"
334+
s:1028 == t:"OUTPATIENT"
335+
s:1034 == t:"OUTPATIENT"
336+
s:1043 == t:"OUTPATIENT"
337+
s:1049 == t:"OUTPATIENT"
338+
s:1065 == t:"OUTPATIENT"
339+
s:1071 == t:"OUTPATIENT"
340+
s:1072 == t:"OUTPATIENT"
341+
s:1073 == t:"OUTPATIENT"
342+
s:1074 == t:"OUTPATIENT"
343+
s:1075 == t:"OUTPATIENT"
344+
s:1076 == t:"OUTPATIENT"
345+
s:1077 == t:"OUTPATIENT"
346+
s:1078 == t:"OUTPATIENT"
347+
s:1079 == t:"OUTPATIENT"
348+
s:1083 == t:"OUTPATIENT"
349+
s:1084 == t:"OUTPATIENT"
350+
s:1085 == t:"OUTPATIENT"
351+
s:1086 == t:"OUTPATIENT"
352+
s:1087 == t:"OUTPATIENT"
353+
s:1088 == t:"OUTPATIENT"
354+
s:1089 == t:"OUTPATIENT"
355+
s:1093 == t:"OUTPATIENT"
356+
s:1094 == t:"OUTPATIENT"
357+
s:1095 == t:"OUTPATIENT"
358+
s:1096 == t:"OUTPATIENT"
359+
s:1097 == t:"OUTPATIENT"
360+
s:1099 == t:"OUTPATIENT"
361+
s:2000 == t:"OUTPATIENT"
362+
s:2012 == t:"OUTPATIENT"
363+
s:2013 == t:"OUTPATIENT"
364+
s:2014 == t:"OUTPATIENT"
365+
s:2022 == t:"OUTPATIENT"
366+
s:2023 == t:"OUTPATIENT"
367+
s:2028 == t:"OUTPATIENT"
368+
s:2034 == t:"OUTPATIENT"
369+
s:2043 == t:"OUTPATIENT"
370+
s:2049 == t:"OUTPATIENT"
371+
s:2065 == t:"OUTPATIENT"
372+
s:2071 == t:"OUTPATIENT"
373+
s:2072 == t:"OUTPATIENT"
374+
s:2073 == t:"OUTPATIENT"
375+
s:2074 == t:"OUTPATIENT"
376+
s:2075 == t:"OUTPATIENT"
377+
s:2076 == t:"OUTPATIENT"
378+
s:2077 == t:"OUTPATIENT"
379+
s:2078 == t:"OUTPATIENT"
380+
s:2079 == t:"OUTPATIENT"
381+
s:2083 == t:"OUTPATIENT"
382+
s:2084 == t:"OUTPATIENT"
383+
s:2085 == t:"OUTPATIENT"
384+
s:2086 == t:"OUTPATIENT"
385+
s:2087 == t:"OUTPATIENT"
386+
s:2088 == t:"OUTPATIENT"
387+
s:2089 == t:"OUTPATIENT"
388+
s:2093 == t:"OUTPATIENT"
389+
s:2094 == t:"OUTPATIENT"
390+
s:2095 == t:"OUTPATIENT"
391+
s:2096 == t:"OUTPATIENT"
392+
s:2097 == t:"OUTPATIENT"
393+
s:2099 == t:"OUTPATIENT"
394+
s:50 == t:"HOSPICE"
395+
s:1081 == t:"HOSPICE"
396+
s:1082 == t:"HOSPICE"
397+
s:1091 == t:"HOSPICE"
398+
s:1098 == t:"HOSPICE"
399+
s:1900 == t:"HOSPICE"
400+
s:2081 == t:"HOSPICE"
401+
s:2082 == t:"HOSPICE"
402+
s:2091 == t:"HOSPICE"
403+
s:2098 == t:"HOSPICE"
404+
s:2900 == t:"HOSPICE"
405+
s:60 == t:"INPATIENT"
406+
s:61 == t:"INPATIENT"
407+
s:62 == t:"INPATIENT"
408+
s:63 == t:"INPATIENT"
409+
s:64 == t:"INPATIENT"
410+
s:1011 == t:"INPATIENT"
411+
s:1041 == t:"INPATIENT"
412+
s:1069 == t:"INPATIENT"
413+
s:2011 == t:"INPATIENT"
414+
s:2041 == t:"INPATIENT"
415+
s:2069 == t:"INPATIENT"
416+
s:71 == t:"CARRIER"
417+
s:72 == t:"CARRIER"
418+
s:1700 == t:"CARRIER"
419+
s:2700 == t:"CARRIER"
420+
s:81 == t:"DME"
421+
s:82 == t:"DME"
422+
s:1800 == t:"DME"
423+
s:2800 == t:"DME"
424+
}
425+
300426
conceptmap "CLM_SRC_ID" {
301427
prefix s = "https://hl7.org/fhir/string"
302428
prefix t = "https://hl7.org/fhir/string"

apps/bfd-model-idr/maps/ExplanationOfBenefit-Pharmacy.map

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ group createEOBPharmacy(source src: ExplanationOfBenefitPharmacy, target tgt: BF
2424
src -> tgt.type = create('CodeableConcept') as tgtCC then {
2525
src.CLM_TYPE_CD as typeCd -> tgtCC.coding = translate(typeCd,'https://bfd.cms.gov/MappingLanguage/Maps/ExplanationOfBenefit-Helper#CLM_TYPE_CD','coding') "translate code";
2626
src.CLM_TYPE_CD as typeCd -> tgtCC.coding = c('https://bluebutton.cms.gov/fhir/CodeSystem/CLM-TYPE-CD', typeCd) "Add claim type code";
27-
src -> tgtCC.coding = c('https://bluebutton.cms.gov/fhir/CodeSystem/EOB-TYPE', 'PDE') "Add eob-type coding";
27+
src.CLM_TYPE_CD as typeCd -> tgtCC.coding = translate(typeCd,'https://bfd.cms.gov/MappingLanguage/Maps/ExplanationOfBenefit-Helper#EOB_TYPE','coding') "Add eob-type coding";
2828
} "Create type";
2929

3030
src -> tgt.patient = create('Reference') as tgtReference then {

0 commit comments

Comments
 (0)