From 1f6758f11b5ba466edfa5b974d3c2a9fbbf74f0e Mon Sep 17 00:00:00 2001 From: Logan Mitchell Date: Thu, 14 Dec 2023 08:36:43 -0800 Subject: [PATCH] BFD-3108: Add new 2024 SAMHSA code (#2095) --- .../model/rif/samples/StaticRifResource.java | 30 ++- .../rif/samples/StaticRifResourceGroup.java | 13 + .../samhsa/sample-a-carrier.txt | 2 + .../samhsa/sample-a-dme.txt | 2 + .../samhsa/sample-a-hha.txt | 2 + .../samhsa/sample-a-hospice.txt | 2 + .../samhsa/sample-a-inpatient.txt | 2 + .../samhsa/sample-a-outpatient.txt | 2 + .../samhsa/sample-a-snf.txt | 2 + .../samhsa-related-codes/codes-cpt.csv | 3 +- .../war/ExplanationOfBenefitE2EBase.java | 97 +------- .../cms/bfd/server/war/ServerTestUtils.java | 227 +----------------- .../r4/providers/ExplanationOfBenefitE2E.java | 91 +++++++ .../providers/ExplanationOfBenefitE2E.java | 92 +++++++ .../providers/Stu3EobSamhsaMatcherTest.java | 9 +- 15 files changed, 256 insertions(+), 320 deletions(-) create mode 100644 apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-carrier.txt create mode 100644 apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-dme.txt create mode 100644 apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-hha.txt create mode 100644 apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-hospice.txt create mode 100644 apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-inpatient.txt create mode 100644 apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-outpatient.txt create mode 100644 apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-snf.txt diff --git a/apps/bfd-model/bfd-model-rif-samples/src/main/java/gov/cms/bfd/model/rif/samples/StaticRifResource.java b/apps/bfd-model/bfd-model-rif-samples/src/main/java/gov/cms/bfd/model/rif/samples/StaticRifResource.java index e83219b308..2538829051 100644 --- a/apps/bfd-model/bfd-model-rif-samples/src/main/java/gov/cms/bfd/model/rif/samples/StaticRifResource.java +++ b/apps/bfd-model/bfd-model-rif-samples/src/main/java/gov/cms/bfd/model/rif/samples/StaticRifResource.java @@ -183,7 +183,35 @@ public enum StaticRifResource { SAMPLE_HICN_MULT_BENES_BENEFICIARY_HISTORY( resourceUrl("rif-static-samples/sample-hicn-mult-bene-beneficiaryhistory.txt"), RifFileType.BENEFICIARY_HISTORY, - 7); + 7), + + /** Sample A Carrier static rif. */ + SAMPLE_A_CARRIER_SAMHSA( + resourceUrl("rif-static-samples/samhsa/sample-a-carrier.txt"), RifFileType.CARRIER, 1), + + /** Sample A DME static rif. */ + SAMPLE_A_DME_SAMHSA( + resourceUrl("rif-static-samples/samhsa/sample-a-dme.txt"), RifFileType.DME, 1), + + /** Sample A HHA static rif. */ + SAMPLE_A_HHA_SAMHSA( + resourceUrl("rif-static-samples/samhsa/sample-a-hha.txt"), RifFileType.HHA, 1), + + /** Sample A Hospice static rif. */ + SAMPLE_A_HOSPICE_SAMHSA( + resourceUrl("rif-static-samples/samhsa/sample-a-hospice.txt"), RifFileType.HOSPICE, 1), + + /** Sample A Inpatient static rif. */ + SAMPLE_A_INPATIENT_SAMHSA( + resourceUrl("rif-static-samples/samhsa/sample-a-inpatient.txt"), RifFileType.INPATIENT, 1), + + /** Sample A Outpatient static rif. */ + SAMPLE_A_OUTPATIENT_SAMHSA( + resourceUrl("rif-static-samples/samhsa/sample-a-outpatient.txt"), RifFileType.OUTPATIENT, 1), + + /** Sample A SNF static rif. */ + SAMPLE_A_SNF_SAMHSA( + resourceUrl("rif-static-samples/samhsa/sample-a-snf.txt"), RifFileType.SNF, 1); /** The Resource URL Supplier for the different RIF files. */ private final Supplier resourceUrlSupplier; diff --git a/apps/bfd-model/bfd-model-rif-samples/src/main/java/gov/cms/bfd/model/rif/samples/StaticRifResourceGroup.java b/apps/bfd-model/bfd-model-rif-samples/src/main/java/gov/cms/bfd/model/rif/samples/StaticRifResourceGroup.java index 9de664c9f9..ed53af76b7 100644 --- a/apps/bfd-model/bfd-model-rif-samples/src/main/java/gov/cms/bfd/model/rif/samples/StaticRifResourceGroup.java +++ b/apps/bfd-model/bfd-model-rif-samples/src/main/java/gov/cms/bfd/model/rif/samples/StaticRifResourceGroup.java @@ -31,6 +31,19 @@ public enum StaticRifResourceGroup { StaticRifResource.SAMPLE_A_HOSPICE, StaticRifResource.SAMPLE_A_SNF, StaticRifResource.SAMPLE_A_DME), + /** Sample A with various SAMHSA data in each claim. */ + SAMPLE_A_SAMHSA( + StaticRifResource.SAMPLE_A_BENES, + StaticRifResource.SAMPLE_A_BENEFICIARY_HISTORY, + StaticRifResource.SAMPLE_A_CARRIER_SAMHSA, + // PDE has no SAMHSA data + StaticRifResource.SAMPLE_A_PDE, + StaticRifResource.SAMPLE_A_INPATIENT_SAMHSA, + StaticRifResource.SAMPLE_A_OUTPATIENT_SAMHSA, + StaticRifResource.SAMPLE_A_HHA_SAMHSA, + StaticRifResource.SAMPLE_A_HOSPICE_SAMHSA, + StaticRifResource.SAMPLE_A_SNF_SAMHSA, + StaticRifResource.SAMPLE_A_DME_SAMHSA), /** Sample A Four Character DRG Code Resource Group. */ SAMPLE_A_FOUR_CHARACTER_DRG_CODE( StaticRifResource.SAMPLE_A_BENES, diff --git a/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-carrier.txt b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-carrier.txt new file mode 100644 index 0000000000..ae6478b4cc --- /dev/null +++ b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-carrier.txt @@ -0,0 +1,2 @@ +DML_IND|BENE_ID|CLM_ID|CLM_GRP_ID|FINAL_ACTION|NCH_NEAR_LINE_REC_IDENT_CD|NCH_CLM_TYPE_CD|CLM_FROM_DT|CLM_THRU_DT|NCH_WKLY_PROC_DT|CARR_CLM_ENTRY_CD|CLM_DISP_CD|CARR_NUM|CARR_CLM_PMT_DNL_CD|CLM_PMT_AMT|CARR_CLM_PRMRY_PYR_PD_AMT|RFR_PHYSN_UPIN|RFR_PHYSN_NPI|CARR_CLM_PRVDR_ASGNMT_IND_SW|NCH_CLM_PRVDR_PMT_AMT|NCH_CLM_BENE_PMT_AMT|NCH_CARR_CLM_SBMTD_CHRG_AMT|NCH_CARR_CLM_ALOWD_AMT|CARR_CLM_CASH_DDCTBL_APLD_AMT|CARR_CLM_HCPCS_YR_CD|CARR_CLM_RFRNG_PIN_NUM|PRNCPAL_DGNS_CD|PRNCPAL_DGNS_VRSN_CD|ICD_DGNS_CD1|ICD_DGNS_VRSN_CD1|ICD_DGNS_CD2|ICD_DGNS_VRSN_CD2|ICD_DGNS_CD3|ICD_DGNS_VRSN_CD3|ICD_DGNS_CD4|ICD_DGNS_VRSN_CD4|ICD_DGNS_CD5|ICD_DGNS_VRSN_CD5|ICD_DGNS_CD6|ICD_DGNS_VRSN_CD6|ICD_DGNS_CD7|ICD_DGNS_VRSN_CD7|ICD_DGNS_CD8|ICD_DGNS_VRSN_CD8|ICD_DGNS_CD9|ICD_DGNS_VRSN_CD9|ICD_DGNS_CD10|ICD_DGNS_VRSN_CD10|ICD_DGNS_CD11|ICD_DGNS_VRSN_CD11|ICD_DGNS_CD12|ICD_DGNS_VRSN_CD12|CLM_CLNCL_TRIL_NUM|CARR_CLM_CNTL_NUM|CARR_CLM_BLG_NPI_NUM|LINE_NUM|CARR_PRFRNG_PIN_NUM|PRF_PHYSN_UPIN|PRF_PHYSN_NPI|ORG_NPI_NUM|CARR_LINE_PRVDR_TYPE_CD|TAX_NUM|PRVDR_STATE_CD|PRVDR_ZIP|PRVDR_SPCLTY|PRTCPTNG_IND_CD|CARR_LINE_RDCD_PMT_PHYS_ASTN_C|LINE_SRVC_CNT|LINE_CMS_TYPE_SRVC_CD|LINE_PLACE_OF_SRVC_CD|CARR_LINE_PRCNG_LCLTY_CD|LINE_1ST_EXPNS_DT|LINE_LAST_EXPNS_DT|HCPCS_CD|HCPCS_1ST_MDFR_CD|HCPCS_2ND_MDFR_CD|BETOS_CD|LINE_NCH_PMT_AMT|LINE_BENE_PMT_AMT|LINE_PRVDR_PMT_AMT|LINE_BENE_PTB_DDCTBL_AMT|LINE_BENE_PRMRY_PYR_CD|LINE_BENE_PRMRY_PYR_PD_AMT|LINE_COINSRNC_AMT|LINE_SBMTD_CHRG_AMT|LINE_ALOWD_CHRG_AMT|LINE_PRCSG_IND_CD|LINE_PMT_80_100_CD|LINE_SERVICE_DEDUCTIBLE|CARR_LINE_MTUS_CNT|CARR_LINE_MTUS_CD|LINE_ICD_DGNS_CD|LINE_ICD_DGNS_VRSN_CD|HPSA_SCRCTY_IND_CD|CARR_LINE_RX_NUM|LINE_HCT_HGB_RSLT_NUM|LINE_HCT_HGB_TYPE_CD|LINE_NDC_CD|CARR_LINE_CLIA_LAB_NUM|CARR_LINE_ANSTHSA_UNIT_CNT +INSERT|567834|9991831999|900|F|O|71|27-OCT-1999|27-OCT-1999|06-NOV-1999|1|1|61026|1|199.99|0|1234534|8765676|A|123.45|888.00|245.04|166.23|777.00|5|K25852|A02|0|A02|0|29189|9|B04|0|B05|0|||||||||||||||||0|74655592568216|1234567890|6|K25555||1923124|0000000000|0|204299999|IL|555558202|41|1|0|1.0|1|11|15|27-OCT-1999|27-OCT-1999|92999|LT||T2D|37.5|0|37.5|0|E|0|9.57|75|47.84|A|0|0|1|3|A52|0|||42.0|R1|000000000|BB889999AA|0 diff --git a/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-dme.txt b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-dme.txt new file mode 100644 index 0000000000..4205a3a682 --- /dev/null +++ b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-dme.txt @@ -0,0 +1,2 @@ +DML_IND|BENE_ID|CLM_ID|CLM_GRP_ID|FINAL_ACTION|NCH_NEAR_LINE_REC_IDENT_CD|NCH_CLM_TYPE_CD|CLM_FROM_DT|CLM_THRU_DT|NCH_WKLY_PROC_DT|CARR_CLM_ENTRY_CD|CLM_DISP_CD|CARR_NUM|CARR_CLM_PMT_DNL_CD|CLM_PMT_AMT|CARR_CLM_PRMRY_PYR_PD_AMT|CARR_CLM_PRVDR_ASGNMT_IND_SW|NCH_CLM_PRVDR_PMT_AMT|NCH_CLM_BENE_PMT_AMT|NCH_CARR_CLM_SBMTD_CHRG_AMT|NCH_CARR_CLM_ALOWD_AMT|CARR_CLM_CASH_DDCTBL_APLD_AMT|CARR_CLM_HCPCS_YR_CD|PRNCPAL_DGNS_CD|PRNCPAL_DGNS_VRSN_CD|ICD_DGNS_CD1|ICD_DGNS_VRSN_CD1|ICD_DGNS_CD2|ICD_DGNS_VRSN_CD2|ICD_DGNS_CD3|ICD_DGNS_VRSN_CD3|ICD_DGNS_CD4|ICD_DGNS_VRSN_CD4|ICD_DGNS_CD5|ICD_DGNS_VRSN_CD5|ICD_DGNS_CD6|ICD_DGNS_VRSN_CD6|ICD_DGNS_CD7|ICD_DGNS_VRSN_CD7|ICD_DGNS_CD8|ICD_DGNS_VRSN_CD8|ICD_DGNS_CD9|ICD_DGNS_VRSN_CD9|ICD_DGNS_CD10|ICD_DGNS_VRSN_CD10|ICD_DGNS_CD11|ICD_DGNS_VRSN_CD11|ICD_DGNS_CD12|ICD_DGNS_VRSN_CD12|RFR_PHYSN_UPIN|RFR_PHYSN_NPI|CLM_CLNCL_TRIL_NUM|CARR_CLM_CNTL_NUM|LINE_NUM|TAX_NUM|PRVDR_SPCLTY|PRTCPTNG_IND_CD|LINE_SRVC_CNT|LINE_CMS_TYPE_SRVC_CD|LINE_PLACE_OF_SRVC_CD|LINE_1ST_EXPNS_DT|LINE_LAST_EXPNS_DT|HCPCS_CD|HCPCS_1ST_MDFR_CD|HCPCS_2ND_MDFR_CD|BETOS_CD|LINE_NCH_PMT_AMT|LINE_BENE_PMT_AMT|LINE_PRVDR_PMT_AMT|LINE_BENE_PTB_DDCTBL_AMT|LINE_BENE_PRMRY_PYR_CD|LINE_BENE_PRMRY_PYR_PD_AMT|LINE_COINSRNC_AMT|LINE_PRMRY_ALOWD_CHRG_AMT|LINE_SBMTD_CHRG_AMT|LINE_ALOWD_CHRG_AMT|LINE_PRCSG_IND_CD|LINE_PMT_80_100_CD|LINE_SERVICE_DEDUCTIBLE|LINE_ICD_DGNS_CD|LINE_ICD_DGNS_VRSN_CD|LINE_DME_PRCHS_PRICE_AMT|PRVDR_NUM|PRVDR_NPI|DMERC_LINE_PRCNG_STATE_CD|PRVDR_STATE_CD|DMERC_LINE_SUPPLR_TYPE_CD|HCPCS_3RD_MDFR_CD|HCPCS_4TH_MDFR_CD|DMERC_LINE_SCRN_SVGS_AMT|DMERC_LINE_MTUS_CNT|DMERC_LINE_MTUS_CD|LINE_HCT_HGB_RSLT_NUM|LINE_HCT_HGB_TYPE_CD|LINE_NDC_CD +INSERT|567834|2188888888|900|F|M|82|03-FEB-2014|03-FEB-2014|14-FEB-2014|1|01|99999|1|777.75|0|A|666.75|666.66|1752.75|754.79|777.00|3|B04|0|B04|0|A37|0|||||||||||||||||||||I99999|1306849450|0|74655592568216|1|9994931888|A5|1|60|P|12|03-FEB-2014|03-FEB-2014|G0137|YY||D9Z|123.45|11.00|120.00|18.00|E|11.00|20.20|20.29|130.45|129.45|A|0|0|A25|0|82.29|1219966666|1244444444|AL|MO|3|||0.00|60.234|3|44.4|R2|000000000| diff --git a/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-hha.txt b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-hha.txt new file mode 100644 index 0000000000..b46bc08f14 --- /dev/null +++ b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-hha.txt @@ -0,0 +1,2 @@ +DML_IND|BENE_ID|CLM_ID|CLM_GRP_ID|FINAL_ACTION|NCH_NEAR_LINE_REC_IDENT_CD|NCH_CLM_TYPE_CD|CLM_FROM_DT|CLM_THRU_DT|NCH_WKLY_PROC_DT|FI_CLM_PROC_DT|PRVDR_NUM|CLM_FAC_TYPE_CD|CLM_SRVC_CLSFCTN_TYPE_CD|CLM_FREQ_CD|FI_NUM|CLM_MDCR_NON_PMT_RSN_CD|CLM_PMT_AMT|NCH_PRMRY_PYR_CLM_PD_AMT|NCH_PRMRY_PYR_CD|PRVDR_STATE_CD|ORG_NPI_NUM|AT_PHYSN_UPIN|AT_PHYSN_NPI|PTNT_DSCHRG_STUS_CD|CLM_PPS_IND_CD|CLM_TOT_CHRG_AMT|PRNCPAL_DGNS_CD|PRNCPAL_DGNS_VRSN_CD|ICD_DGNS_CD1|ICD_DGNS_VRSN_CD1|ICD_DGNS_CD2|ICD_DGNS_VRSN_CD2|ICD_DGNS_CD3|ICD_DGNS_VRSN_CD3|ICD_DGNS_CD4|ICD_DGNS_VRSN_CD4|ICD_DGNS_CD5|ICD_DGNS_VRSN_CD5|ICD_DGNS_CD6|ICD_DGNS_VRSN_CD6|ICD_DGNS_CD7|ICD_DGNS_VRSN_CD7|ICD_DGNS_CD8|ICD_DGNS_VRSN_CD8|ICD_DGNS_CD9|ICD_DGNS_VRSN_CD9|ICD_DGNS_CD10|ICD_DGNS_VRSN_CD10|ICD_DGNS_CD11|ICD_DGNS_VRSN_CD11|ICD_DGNS_CD12|ICD_DGNS_VRSN_CD12|ICD_DGNS_CD13|ICD_DGNS_VRSN_CD13|ICD_DGNS_CD14|ICD_DGNS_VRSN_CD14|ICD_DGNS_CD15|ICD_DGNS_VRSN_CD15|ICD_DGNS_CD16|ICD_DGNS_VRSN_CD16|ICD_DGNS_CD17|ICD_DGNS_VRSN_CD17|ICD_DGNS_CD18|ICD_DGNS_VRSN_CD18|ICD_DGNS_CD19|ICD_DGNS_VRSN_CD19|ICD_DGNS_CD20|ICD_DGNS_VRSN_CD20|ICD_DGNS_CD21|ICD_DGNS_VRSN_CD21|ICD_DGNS_CD22|ICD_DGNS_VRSN_CD22|ICD_DGNS_CD23|ICD_DGNS_VRSN_CD23|ICD_DGNS_CD24|ICD_DGNS_VRSN_CD24|ICD_DGNS_CD25|ICD_DGNS_VRSN_CD25|FST_DGNS_E_CD|FST_DGNS_E_VRSN_CD|ICD_DGNS_E_CD1|ICD_DGNS_E_VRSN_CD1|ICD_DGNS_E_CD2|ICD_DGNS_E_VRSN_CD2|ICD_DGNS_E_CD3|ICD_DGNS_E_VRSN_CD3|ICD_DGNS_E_CD4|ICD_DGNS_E_VRSN_CD4|ICD_DGNS_E_CD5|ICD_DGNS_E_VRSN_CD5|ICD_DGNS_E_CD6|ICD_DGNS_E_VRSN_CD6|ICD_DGNS_E_CD7|ICD_DGNS_E_VRSN_CD7|ICD_DGNS_E_CD8|ICD_DGNS_E_VRSN_CD8|ICD_DGNS_E_CD9|ICD_DGNS_E_VRSN_CD9|ICD_DGNS_E_CD10|ICD_DGNS_E_VRSN_CD10|ICD_DGNS_E_CD11|ICD_DGNS_E_VRSN_CD11|ICD_DGNS_E_CD12|ICD_DGNS_E_VRSN_CD12|CLM_HHA_LUPA_IND_CD|CLM_HHA_RFRL_CD|CLM_HHA_TOT_VISIT_CNT|CLM_ADMSN_DT|FI_DOC_CLM_CNTL_NUM|FI_ORIG_CLM_CNTL_NUM|CLAIM_QUERY_CODE|CLM_LINE_NUM|REV_CNTR|REV_CNTR_DT|REV_CNTR_1ST_ANSI_CD|REV_CNTR_APC_HIPPS_CD|HCPCS_CD|HCPCS_1ST_MDFR_CD|HCPCS_2ND_MDFR_CD|REV_CNTR_PMT_MTHD_IND_CD|REV_CNTR_UNIT_CNT|REV_CNTR_RATE_AMT|REV_CNTR_PMT_AMT_AMT|REV_CNTR_TOT_CHRG_AMT|REV_CNTR_NCVRD_CHRG_AMT|REV_CNTR_DDCTBL_COINSRNC_CD|REV_CNTR_STUS_IND_CD|REV_CNTR_NDC_QTY|REV_CNTR_NDC_QTY_QLFR_CD|RNDRNG_PHYSN_UPIN|RNDRNG_PHYSN_NPI +INSERT|567834|2925555555|900|F|W|10|23-JUN-2015|23-JUN-2015|06-NOV-2015|30-OCT-2015|45645|3|2|1|15999|P|188.00|11.00|A|UT|0000000000||2222222222|30|2|199.99|53081|9|53081|9|B01|0|||||||||||||||||||||||||||||||||||||||||||||||B05|0|29189|9|B30|0|||||||||||||||||||||L|1|3|23-JUN-2015|08683096577486|10493204767560565|3|1|0023|23-JUN-2015|CO120|0|2GGGG|KO||3|1|0|26.00|25.00|24.00|4|A|666|DD||345345345| diff --git a/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-hospice.txt b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-hospice.txt new file mode 100644 index 0000000000..3bf1162831 --- /dev/null +++ b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-hospice.txt @@ -0,0 +1,2 @@ +DML_IND|BENE_ID|CLM_ID|CLM_GRP_ID|FINAL_ACTION|NCH_NEAR_LINE_REC_IDENT_CD|NCH_CLM_TYPE_CD|CLM_FROM_DT|CLM_THRU_DT|NCH_WKLY_PROC_DT|FI_CLM_PROC_DT|PRVDR_NUM|CLM_FAC_TYPE_CD|CLM_SRVC_CLSFCTN_TYPE_CD|CLM_FREQ_CD|FI_NUM|CLM_MDCR_NON_PMT_RSN_CD|CLM_PMT_AMT|NCH_PRMRY_PYR_CLM_PD_AMT|NCH_PRMRY_PYR_CD|PRVDR_STATE_CD|ORG_NPI_NUM|AT_PHYSN_UPIN|AT_PHYSN_NPI|PTNT_DSCHRG_STUS_CD|CLM_TOT_CHRG_AMT|NCH_PTNT_STATUS_IND_CD|CLM_UTLZTN_DAY_CNT|NCH_BENE_DSCHRG_DT|PRNCPAL_DGNS_CD|PRNCPAL_DGNS_VRSN_CD|ICD_DGNS_CD1|ICD_DGNS_VRSN_CD1|ICD_DGNS_CD2|ICD_DGNS_VRSN_CD2|ICD_DGNS_CD3|ICD_DGNS_VRSN_CD3|ICD_DGNS_CD4|ICD_DGNS_VRSN_CD4|ICD_DGNS_CD5|ICD_DGNS_VRSN_CD5|ICD_DGNS_CD6|ICD_DGNS_VRSN_CD6|ICD_DGNS_CD7|ICD_DGNS_VRSN_CD7|ICD_DGNS_CD8|ICD_DGNS_VRSN_CD8|ICD_DGNS_CD9|ICD_DGNS_VRSN_CD9|ICD_DGNS_CD10|ICD_DGNS_VRSN_CD10|ICD_DGNS_CD11|ICD_DGNS_VRSN_CD11|ICD_DGNS_CD12|ICD_DGNS_VRSN_CD12|ICD_DGNS_CD13|ICD_DGNS_VRSN_CD13|ICD_DGNS_CD14|ICD_DGNS_VRSN_CD14|ICD_DGNS_CD15|ICD_DGNS_VRSN_CD15|ICD_DGNS_CD16|ICD_DGNS_VRSN_CD16|ICD_DGNS_CD17|ICD_DGNS_VRSN_CD17|ICD_DGNS_CD18|ICD_DGNS_VRSN_CD18|ICD_DGNS_CD19|ICD_DGNS_VRSN_CD19|ICD_DGNS_CD20|ICD_DGNS_VRSN_CD20|ICD_DGNS_CD21|ICD_DGNS_VRSN_CD21|ICD_DGNS_CD22|ICD_DGNS_VRSN_CD22|ICD_DGNS_CD23|ICD_DGNS_VRSN_CD23|ICD_DGNS_CD24|ICD_DGNS_VRSN_CD24|ICD_DGNS_CD25|ICD_DGNS_VRSN_CD25|FST_DGNS_E_CD|FST_DGNS_E_VRSN_CD|ICD_DGNS_E_CD1|ICD_DGNS_E_VRSN_CD1|ICD_DGNS_E_CD2|ICD_DGNS_E_VRSN_CD2|ICD_DGNS_E_CD3|ICD_DGNS_E_VRSN_CD3|ICD_DGNS_E_CD4|ICD_DGNS_E_VRSN_CD4|ICD_DGNS_E_CD5|ICD_DGNS_E_VRSN_CD5|ICD_DGNS_E_CD6|ICD_DGNS_E_VRSN_CD6|ICD_DGNS_E_CD7|ICD_DGNS_E_VRSN_CD7|ICD_DGNS_E_CD8|ICD_DGNS_E_VRSN_CD8|ICD_DGNS_E_CD9|ICD_DGNS_E_VRSN_CD9|ICD_DGNS_E_CD10|ICD_DGNS_E_VRSN_CD10|ICD_DGNS_E_CD11|ICD_DGNS_E_VRSN_CD11|ICD_DGNS_E_CD12|ICD_DGNS_E_VRSN_CD12|CLM_HOSPC_START_DT_ID|BENE_HOSPC_PRD_CNT|FI_DOC_CLM_CNTL_NUM|FI_ORIG_CLM_CNTL_NUM|CLAIM_QUERY_CODE|CLM_LINE_NUM|REV_CNTR|REV_CNTR_DT|HCPCS_CD|HCPCS_1ST_MDFR_CD|HCPCS_2ND_MDFR_CD|REV_CNTR_UNIT_CNT|REV_CNTR_RATE_AMT|REV_CNTR_PRVDR_PMT_AMT|REV_CNTR_BENE_PMT_AMT|REV_CNTR_PMT_AMT_AMT|REV_CNTR_TOT_CHRG_AMT|REV_CNTR_NCVRD_CHRG_AMT|REV_CNTR_DDCTBL_COINSRNC_CD|REV_CNTR_NDC_QTY|REV_CNTR_NDC_QTY_QLFR_CD|RNDRNG_PHYSN_UPIN|RNDRNG_PHYSN_NPI +INSERT|567834|9992223422|900|F|V|50|01-JAN-2014|30-JAN-2014|10-OCT-2014|07-OCT-2014|12345|8|1|1|6666|P|130.32|0|A|AZ|0000000000||8888888888|30|199.99|C|30|29-JUN-2015|72761|9|72761|9|B30|0|||||||||||||||||||||||||||||||||||||||||||||||29189|9|B01|0|A52|0|||||||||||||||||||||06-JUL-2014|2|2718813985998|38875439343923937|3|1|651|01-SEP-2014|A5C|Q9999||||29.00|28.00|26.00|2555.00|300.00|0|5454|B|0|345345345| diff --git a/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-inpatient.txt b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-inpatient.txt new file mode 100644 index 0000000000..485d4a76f6 --- /dev/null +++ b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-inpatient.txt @@ -0,0 +1,2 @@ +DML_IND|BENE_ID|CLM_ID|CLM_GRP_ID|FINAL_ACTION|NCH_NEAR_LINE_REC_IDENT_CD|NCH_CLM_TYPE_CD|CLM_FROM_DT|CLM_THRU_DT|NCH_WKLY_PROC_DT|FI_CLM_PROC_DT|CLAIM_QUERY_CODE|PRVDR_NUM|CLM_FAC_TYPE_CD|CLM_SRVC_CLSFCTN_TYPE_CD|CLM_FREQ_CD|FI_NUM|CLM_MDCR_NON_PMT_RSN_CD|CLM_PMT_AMT|NCH_PRMRY_PYR_CLM_PD_AMT|NCH_PRMRY_PYR_CD|FI_CLM_ACTN_CD|PRVDR_STATE_CD|ORG_NPI_NUM|AT_PHYSN_UPIN|AT_PHYSN_NPI|OP_PHYSN_UPIN|OP_PHYSN_NPI|OT_PHYSN_UPIN|OT_PHYSN_NPI|CLM_MCO_PD_SW|PTNT_DSCHRG_STUS_CD|CLM_PPS_IND_CD|CLM_TOT_CHRG_AMT|CLM_ADMSN_DT|CLM_IP_ADMSN_TYPE_CD|CLM_SRC_IP_ADMSN_CD|NCH_PTNT_STATUS_IND_CD|CLM_PASS_THRU_PER_DIEM_AMT|NCH_BENE_IP_DDCTBL_AMT|NCH_BENE_PTA_COINSRNC_LBLTY_AM|NCH_BENE_BLOOD_DDCTBL_LBLTY_AM|NCH_PROFNL_CMPNT_CHRG_AMT|NCH_IP_NCVRD_CHRG_AMT|NCH_IP_TOT_DDCTN_AMT|CLM_TOT_PPS_CPTL_AMT|CLM_PPS_CPTL_FSP_AMT|CLM_PPS_CPTL_OUTLIER_AMT|CLM_PPS_CPTL_DSPRPRTNT_SHR_AMT|CLM_PPS_CPTL_IME_AMT|CLM_PPS_CPTL_EXCPTN_AMT|CLM_PPS_OLD_CPTL_HLD_HRMLS_AMT|CLM_PPS_CPTL_DRG_WT_NUM|CLM_UTLZTN_DAY_CNT|BENE_TOT_COINSRNC_DAYS_CNT|BENE_LRD_USED_CNT|CLM_NON_UTLZTN_DAYS_CNT|NCH_BLOOD_PNTS_FRNSHD_QTY|NCH_VRFD_NCVRD_STAY_FROM_DT|NCH_VRFD_NCVRD_STAY_THRU_DT|NCH_ACTV_OR_CVRD_LVL_CARE_THRU|NCH_BENE_MDCR_BNFTS_EXHTD_DT_I|NCH_BENE_DSCHRG_DT|CLM_DRG_CD|CLM_DRG_OUTLIER_STAY_CD|NCH_DRG_OUTLIER_APRVD_PMT_AMT|ADMTG_DGNS_CD|ADMTG_DGNS_VRSN_CD|PRNCPAL_DGNS_CD|PRNCPAL_DGNS_VRSN_CD|ICD_DGNS_CD1|ICD_DGNS_VRSN_CD1|CLM_POA_IND_SW1|ICD_DGNS_CD2|ICD_DGNS_VRSN_CD2|CLM_POA_IND_SW2|ICD_DGNS_CD3|ICD_DGNS_VRSN_CD3|CLM_POA_IND_SW3|ICD_DGNS_CD4|ICD_DGNS_VRSN_CD4|CLM_POA_IND_SW4|ICD_DGNS_CD5|ICD_DGNS_VRSN_CD5|CLM_POA_IND_SW5|ICD_DGNS_CD6|ICD_DGNS_VRSN_CD6|CLM_POA_IND_SW6|ICD_DGNS_CD7|ICD_DGNS_VRSN_CD7|CLM_POA_IND_SW7|ICD_DGNS_CD8|ICD_DGNS_VRSN_CD8|CLM_POA_IND_SW8|ICD_DGNS_CD9|ICD_DGNS_VRSN_CD9|CLM_POA_IND_SW9|ICD_DGNS_CD10|ICD_DGNS_VRSN_CD10|CLM_POA_IND_SW10|ICD_DGNS_CD11|ICD_DGNS_VRSN_CD11|CLM_POA_IND_SW11|ICD_DGNS_CD12|ICD_DGNS_VRSN_CD12|CLM_POA_IND_SW12|ICD_DGNS_CD13|ICD_DGNS_VRSN_CD13|CLM_POA_IND_SW13|ICD_DGNS_CD14|ICD_DGNS_VRSN_CD14|CLM_POA_IND_SW14|ICD_DGNS_CD15|ICD_DGNS_VRSN_CD15|CLM_POA_IND_SW15|ICD_DGNS_CD16|ICD_DGNS_VRSN_CD16|CLM_POA_IND_SW16|ICD_DGNS_CD17|ICD_DGNS_VRSN_CD17|CLM_POA_IND_SW17|ICD_DGNS_CD18|ICD_DGNS_VRSN_CD18|CLM_POA_IND_SW18|ICD_DGNS_CD19|ICD_DGNS_VRSN_CD19|CLM_POA_IND_SW19|ICD_DGNS_CD20|ICD_DGNS_VRSN_CD20|CLM_POA_IND_SW20|ICD_DGNS_CD21|ICD_DGNS_VRSN_CD21|CLM_POA_IND_SW21|ICD_DGNS_CD22|ICD_DGNS_VRSN_CD22|CLM_POA_IND_SW22|ICD_DGNS_CD23|ICD_DGNS_VRSN_CD23|CLM_POA_IND_SW23|ICD_DGNS_CD24|ICD_DGNS_VRSN_CD24|CLM_POA_IND_SW24|ICD_DGNS_CD25|ICD_DGNS_VRSN_CD25|CLM_POA_IND_SW25|FST_DGNS_E_CD|FST_DGNS_E_VRSN_CD|ICD_DGNS_E_CD1|ICD_DGNS_E_VRSN_CD1|CLM_E_POA_IND_SW1|ICD_DGNS_E_CD2|ICD_DGNS_E_VRSN_CD2|CLM_E_POA_IND_SW2|ICD_DGNS_E_CD3|ICD_DGNS_E_VRSN_CD3|CLM_E_POA_IND_SW3|ICD_DGNS_E_CD4|ICD_DGNS_E_VRSN_CD4|CLM_E_POA_IND_SW4|ICD_DGNS_E_CD5|ICD_DGNS_E_VRSN_CD5|CLM_E_POA_IND_SW5|ICD_DGNS_E_CD6|ICD_DGNS_E_VRSN_CD6|CLM_E_POA_IND_SW6|ICD_DGNS_E_CD7|ICD_DGNS_E_VRSN_CD7|CLM_E_POA_IND_SW7|ICD_DGNS_E_CD8|ICD_DGNS_E_VRSN_CD8|CLM_E_POA_IND_SW8|ICD_DGNS_E_CD9|ICD_DGNS_E_VRSN_CD9|CLM_E_POA_IND_SW9|ICD_DGNS_E_CD10|ICD_DGNS_E_VRSN_CD10|CLM_E_POA_IND_SW10|ICD_DGNS_E_CD11|ICD_DGNS_E_VRSN_CD11|CLM_E_POA_IND_SW11|ICD_DGNS_E_CD12|ICD_DGNS_E_VRSN_CD12|CLM_E_POA_IND_SW12|ICD_PRCDR_CD1|ICD_PRCDR_VRSN_CD1|PRCDR_DT1|ICD_PRCDR_CD2|ICD_PRCDR_VRSN_CD2|PRCDR_DT2|ICD_PRCDR_CD3|ICD_PRCDR_VRSN_CD3|PRCDR_DT3|ICD_PRCDR_CD4|ICD_PRCDR_VRSN_CD4|PRCDR_DT4|ICD_PRCDR_CD5|ICD_PRCDR_VRSN_CD5|PRCDR_DT5|ICD_PRCDR_CD6|ICD_PRCDR_VRSN_CD6|PRCDR_DT6|ICD_PRCDR_CD7|ICD_PRCDR_VRSN_CD7|PRCDR_DT7|ICD_PRCDR_CD8|ICD_PRCDR_VRSN_CD8|PRCDR_DT8|ICD_PRCDR_CD9|ICD_PRCDR_VRSN_CD9|PRCDR_DT9|ICD_PRCDR_CD10|ICD_PRCDR_VRSN_CD10|PRCDR_DT10|ICD_PRCDR_CD11|ICD_PRCDR_VRSN_CD11|PRCDR_DT11|ICD_PRCDR_CD12|ICD_PRCDR_VRSN_CD12|PRCDR_DT12|ICD_PRCDR_CD13|ICD_PRCDR_VRSN_CD13|PRCDR_DT13|ICD_PRCDR_CD14|ICD_PRCDR_VRSN_CD14|PRCDR_DT14|ICD_PRCDR_CD15|ICD_PRCDR_VRSN_CD15|PRCDR_DT15|ICD_PRCDR_CD16|ICD_PRCDR_VRSN_CD16|PRCDR_DT16|ICD_PRCDR_CD17|ICD_PRCDR_VRSN_CD17|PRCDR_DT17|ICD_PRCDR_CD18|ICD_PRCDR_VRSN_CD18|PRCDR_DT18|ICD_PRCDR_CD19|ICD_PRCDR_VRSN_CD19|PRCDR_DT19|ICD_PRCDR_CD20|ICD_PRCDR_VRSN_CD20|PRCDR_DT20|ICD_PRCDR_CD21|ICD_PRCDR_VRSN_CD21|PRCDR_DT21|ICD_PRCDR_CD22|ICD_PRCDR_VRSN_CD22|PRCDR_DT22|ICD_PRCDR_CD23|ICD_PRCDR_VRSN_CD23|PRCDR_DT23|ICD_PRCDR_CD24|ICD_PRCDR_VRSN_CD24|PRCDR_DT24|ICD_PRCDR_CD25|ICD_PRCDR_VRSN_CD25|PRCDR_DT25|IME_OP_CLM_VAL_AMT|DSH_OP_CLM_VAL_AMT|CLM_UNCOMPD_CARE_PMT_AMT|FI_DOC_CLM_CNTL_NUM|FI_ORIG_CLM_CNTL_NUM|CLM_LINE_NUM|REV_CNTR|HCPCS_CD|REV_CNTR_UNIT_CNT|REV_CNTR_RATE_AMT|REV_CNTR_TOT_CHRG_AMT|REV_CNTR_NCVRD_CHRG_AMT|REV_CNTR_DDCTBL_COINSRNC_CD|REV_CNTR_NDC_QTY|REV_CNTR_NDC_QTY_QLFR_CD|RNDRNG_PHYSN_UPIN|RNDRNG_PHYSN_NPI +INSERT|567834|333333222222|900|F|V|60|15-JAN-2016|27-JAN-2016|26-FEB-2016|19-FEB-2016|3|777776|1|1|1|8299|A|7699.48|11.00|A|1|IA|0000000000||161999999||3333444555||161943433|0|51|2|84999.37|15-JAN-2016|1|4|A|10.00|112.00|5.00|6.00|4.00|33.00|14.00|646.23|552.56|0|25.09|68.58|0|0|1.2494|12|0|0|0|19|||||27-JAN-2016|695|0|23.99|A37|0|A40|0|A40|0|Y|A52|0|N|29189|9|N|A15|0|N|B01|0|N|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||A01|0|A01|0|N|A02|0|Y|||||||||||||||||||||||||||||||BQ0HZZZ|0|16-JAN-2016|CD1YYZZ|0|16-JAN-2016|2W52X6Z|0|15-JAN-2016|BP17ZZZ|0|17-JAN-2016|D9YD8ZZ|0|24-JAN-2016|F00ZCKZ|0|24-JAN-2016||||||||||||||||||||||||||||||||||||||||||||||||||||||||||66125.51|25|120.56|28486613848|261660474641024|1|6767|M55|0|0|84888.88|3699.00|A|77|GG||345345345| diff --git a/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-outpatient.txt b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-outpatient.txt new file mode 100644 index 0000000000..d53bfe8b4c --- /dev/null +++ b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-outpatient.txt @@ -0,0 +1,2 @@ +DML_IND|BENE_ID|CLM_ID|CLM_GRP_ID|FINAL_ACTION|NCH_NEAR_LINE_REC_IDENT_CD|NCH_CLM_TYPE_CD|CLM_FROM_DT|CLM_THRU_DT|NCH_WKLY_PROC_DT|FI_CLM_PROC_DT|CLAIM_QUERY_CODE|PRVDR_NUM|CLM_FAC_TYPE_CD|CLM_SRVC_CLSFCTN_TYPE_CD|CLM_FREQ_CD|FI_NUM|CLM_MDCR_NON_PMT_RSN_CD|CLM_PMT_AMT|NCH_PRMRY_PYR_CLM_PD_AMT|NCH_PRMRY_PYR_CD|PRVDR_STATE_CD|ORG_NPI_NUM|AT_PHYSN_UPIN|AT_PHYSN_NPI|OP_PHYSN_UPIN|OP_PHYSN_NPI|OT_PHYSN_UPIN|OT_PHYSN_NPI|CLM_MCO_PD_SW|PTNT_DSCHRG_STUS_CD|CLM_TOT_CHRG_AMT|NCH_BENE_BLOOD_DDCTBL_LBLTY_AM|NCH_PROFNL_CMPNT_CHRG_AMT|PRNCPAL_DGNS_CD|PRNCPAL_DGNS_VRSN_CD|ICD_DGNS_CD1|ICD_DGNS_VRSN_CD1|ICD_DGNS_CD2|ICD_DGNS_VRSN_CD2|ICD_DGNS_CD3|ICD_DGNS_VRSN_CD3|ICD_DGNS_CD4|ICD_DGNS_VRSN_CD4|ICD_DGNS_CD5|ICD_DGNS_VRSN_CD5|ICD_DGNS_CD6|ICD_DGNS_VRSN_CD6|ICD_DGNS_CD7|ICD_DGNS_VRSN_CD7|ICD_DGNS_CD8|ICD_DGNS_VRSN_CD8|ICD_DGNS_CD9|ICD_DGNS_VRSN_CD9|ICD_DGNS_CD10|ICD_DGNS_VRSN_CD10|ICD_DGNS_CD11|ICD_DGNS_VRSN_CD11|ICD_DGNS_CD12|ICD_DGNS_VRSN_CD12|ICD_DGNS_CD13|ICD_DGNS_VRSN_CD13|ICD_DGNS_CD14|ICD_DGNS_VRSN_CD14|ICD_DGNS_CD15|ICD_DGNS_VRSN_CD15|ICD_DGNS_CD16|ICD_DGNS_VRSN_CD16|ICD_DGNS_CD17|ICD_DGNS_VRSN_CD17|ICD_DGNS_CD18|ICD_DGNS_VRSN_CD18|ICD_DGNS_CD19|ICD_DGNS_VRSN_CD19|ICD_DGNS_CD20|ICD_DGNS_VRSN_CD20|ICD_DGNS_CD21|ICD_DGNS_VRSN_CD21|ICD_DGNS_CD22|ICD_DGNS_VRSN_CD22|ICD_DGNS_CD23|ICD_DGNS_VRSN_CD23|ICD_DGNS_CD24|ICD_DGNS_VRSN_CD24|ICD_DGNS_CD25|ICD_DGNS_VRSN_CD25|FST_DGNS_E_CD|FST_DGNS_E_VRSN_CD|ICD_DGNS_E_CD1|ICD_DGNS_E_VRSN_CD1|ICD_DGNS_E_CD2|ICD_DGNS_E_VRSN_CD2|ICD_DGNS_E_CD3|ICD_DGNS_E_VRSN_CD3|ICD_DGNS_E_CD4|ICD_DGNS_E_VRSN_CD4|ICD_DGNS_E_CD5|ICD_DGNS_E_VRSN_CD5|ICD_DGNS_E_CD6|ICD_DGNS_E_VRSN_CD6|ICD_DGNS_E_CD7|ICD_DGNS_E_VRSN_CD7|ICD_DGNS_E_CD8|ICD_DGNS_E_VRSN_CD8|ICD_DGNS_E_CD9|ICD_DGNS_E_VRSN_CD9|ICD_DGNS_E_CD10|ICD_DGNS_E_VRSN_CD10|ICD_DGNS_E_CD11|ICD_DGNS_E_VRSN_CD11|ICD_DGNS_E_CD12|ICD_DGNS_E_VRSN_CD12|ICD_PRCDR_CD1|ICD_PRCDR_VRSN_CD1|PRCDR_DT1|ICD_PRCDR_CD2|ICD_PRCDR_VRSN_CD2|PRCDR_DT2|ICD_PRCDR_CD3|ICD_PRCDR_VRSN_CD3|PRCDR_DT3|ICD_PRCDR_CD4|ICD_PRCDR_VRSN_CD4|PRCDR_DT4|ICD_PRCDR_CD5|ICD_PRCDR_VRSN_CD5|PRCDR_DT5|ICD_PRCDR_CD6|ICD_PRCDR_VRSN_CD6|PRCDR_DT6|ICD_PRCDR_CD7|ICD_PRCDR_VRSN_CD7|PRCDR_DT7|ICD_PRCDR_CD8|ICD_PRCDR_VRSN_CD8|PRCDR_DT8|ICD_PRCDR_CD9|ICD_PRCDR_VRSN_CD9|PRCDR_DT9|ICD_PRCDR_CD10|ICD_PRCDR_VRSN_CD10|PRCDR_DT10|ICD_PRCDR_CD11|ICD_PRCDR_VRSN_CD11|PRCDR_DT11|ICD_PRCDR_CD12|ICD_PRCDR_VRSN_CD12|PRCDR_DT12|ICD_PRCDR_CD13|ICD_PRCDR_VRSN_CD13|PRCDR_DT13|ICD_PRCDR_CD14|ICD_PRCDR_VRSN_CD14|PRCDR_DT14|ICD_PRCDR_CD15|ICD_PRCDR_VRSN_CD15|PRCDR_DT15|ICD_PRCDR_CD16|ICD_PRCDR_VRSN_CD16|PRCDR_DT16|ICD_PRCDR_CD17|ICD_PRCDR_VRSN_CD17|PRCDR_DT17|ICD_PRCDR_CD18|ICD_PRCDR_VRSN_CD18|PRCDR_DT18|ICD_PRCDR_CD19|ICD_PRCDR_VRSN_CD19|PRCDR_DT19|ICD_PRCDR_CD20|ICD_PRCDR_VRSN_CD20|PRCDR_DT20|ICD_PRCDR_CD21|ICD_PRCDR_VRSN_CD21|PRCDR_DT21|ICD_PRCDR_CD22|ICD_PRCDR_VRSN_CD22|PRCDR_DT22|ICD_PRCDR_CD23|ICD_PRCDR_VRSN_CD23|PRCDR_DT23|ICD_PRCDR_CD24|ICD_PRCDR_VRSN_CD24|PRCDR_DT24|ICD_PRCDR_CD25|ICD_PRCDR_VRSN_CD25|PRCDR_DT25|RSN_VISIT_CD1|RSN_VISIT_VRSN_CD1|RSN_VISIT_CD2|RSN_VISIT_VRSN_CD2|RSN_VISIT_CD3|RSN_VISIT_VRSN_CD3|NCH_BENE_PTB_DDCTBL_AMT|NCH_BENE_PTB_COINSRNC_AMT|CLM_OP_PRVDR_PMT_AMT|CLM_OP_BENE_PMT_AMT|FI_DOC_CLM_CNTL_NUM|FI_ORIG_CLM_CNTL_NUM|CLM_LINE_NUM|REV_CNTR|REV_CNTR_DT|REV_CNTR_1ST_ANSI_CD|REV_CNTR_2ND_ANSI_CD|REV_CNTR_3RD_ANSI_CD|REV_CNTR_4TH_ANSI_CD|REV_CNTR_APC_HIPPS_CD|HCPCS_CD|HCPCS_1ST_MDFR_CD|HCPCS_2ND_MDFR_CD|REV_CNTR_PMT_MTHD_IND_CD|REV_CNTR_DSCNT_IND_CD|REV_CNTR_PACKG_IND_CD|REV_CNTR_OTAF_PMT_CD|REV_CNTR_IDE_NDC_UPC_NUM|REV_CNTR_UNIT_CNT|REV_CNTR_RATE_AMT|REV_CNTR_BLOOD_DDCTBL_AMT|REV_CNTR_CASH_DDCTBL_AMT|REV_CNTR_COINSRNC_WGE_ADJSTD_C|REV_CNTR_RDCD_COINSRNC_AMT|REV_CNTR_1ST_MSP_PD_AMT|REV_CNTR_2ND_MSP_PD_AMT|REV_CNTR_PRVDR_PMT_AMT|REV_CNTR_BENE_PMT_AMT|REV_CNTR_PTNT_RSPNSBLTY_PMT|REV_CNTR_PMT_AMT_AMT|REV_CNTR_TOT_CHRG_AMT|REV_CNTR_NCVRD_CHRG_AMT|REV_CNTR_STUS_IND_CD|REV_CNTR_NDC_QTY|REV_CNTR_NDC_QTY_QLFR_CD|RNDRNG_PHYSN_UPIN|RNDRNG_PHYSN_NPI +INSERT|567834|1234567890|900|F|W|40|24-JAN-2011|24-JAN-2011|26-FEB-2011|18-FEB-2011|3|999999|1|3|1|15444|A|693.11|11.00|A|KY|0000000000||2222222222||3333333333||4444|0|1|8888.85|6.00|66.89|A40|0|29189|9|A52|0|||||||||||||||||||||||||||||||||||||||||||||||A06|0|A06|0|A15|0|||||||||||||||||||||CD1YYZZ|0|16-JAN-2016|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||A37|0|||||112.00|175.73|693.92|44.00|32490593716374487|373273882012|25|1|03-JAN-1942|CO120|CR121|||0|M99|XX||2||||000000000|111|5|10.45|12.89|15.23|11.00|0|0|200|300|500|5000.00|999.85|134.00| A|77|GG||345345345| diff --git a/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-snf.txt b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-snf.txt new file mode 100644 index 0000000000..144447590d --- /dev/null +++ b/apps/bfd-model/bfd-model-rif-samples/src/main/resources/rif-static-samples/samhsa/sample-a-snf.txt @@ -0,0 +1,2 @@ +DML_IND|BENE_ID|CLM_ID|CLM_GRP_ID|FINAL_ACTION|NCH_NEAR_LINE_REC_IDENT_CD|NCH_CLM_TYPE_CD|CLM_FROM_DT|CLM_THRU_DT|NCH_WKLY_PROC_DT|FI_CLM_PROC_DT|CLAIM_QUERY_CODE|PRVDR_NUM|CLM_FAC_TYPE_CD|CLM_SRVC_CLSFCTN_TYPE_CD|CLM_FREQ_CD|FI_NUM|CLM_MDCR_NON_PMT_RSN_CD|CLM_PMT_AMT|NCH_PRMRY_PYR_CLM_PD_AMT|NCH_PRMRY_PYR_CD|FI_CLM_ACTN_CD|PRVDR_STATE_CD|ORG_NPI_NUM|AT_PHYSN_UPIN|AT_PHYSN_NPI|OP_PHYSN_UPIN|OP_PHYSN_NPI|OT_PHYSN_UPIN|OT_PHYSN_NPI|CLM_MCO_PD_SW|PTNT_DSCHRG_STUS_CD|CLM_PPS_IND_CD|CLM_TOT_CHRG_AMT|CLM_ADMSN_DT|CLM_IP_ADMSN_TYPE_CD|CLM_SRC_IP_ADMSN_CD|NCH_PTNT_STATUS_IND_CD|NCH_BENE_IP_DDCTBL_AMT|NCH_BENE_PTA_COINSRNC_LBLTY_AM|NCH_BENE_BLOOD_DDCTBL_LBLTY_AM|NCH_IP_NCVRD_CHRG_AMT|NCH_IP_TOT_DDCTN_AMT|CLM_PPS_CPTL_FSP_AMT|CLM_PPS_CPTL_OUTLIER_AMT|CLM_PPS_CPTL_DSPRPRTNT_SHR_AMT|CLM_PPS_CPTL_IME_AMT|CLM_PPS_CPTL_EXCPTN_AMT|CLM_PPS_OLD_CPTL_HLD_HRMLS_AMT|CLM_UTLZTN_DAY_CNT|BENE_TOT_COINSRNC_DAYS_CNT|CLM_NON_UTLZTN_DAYS_CNT|NCH_BLOOD_PNTS_FRNSHD_QTY|NCH_QLFYD_STAY_FROM_DT|NCH_QLFYD_STAY_THRU_DT|NCH_VRFD_NCVRD_STAY_FROM_DT|NCH_VRFD_NCVRD_STAY_THRU_DT|NCH_ACTV_OR_CVRD_LVL_CARE_THRU|NCH_BENE_MDCR_BNFTS_EXHTD_DT_I|NCH_BENE_DSCHRG_DT|CLM_DRG_CD|ADMTG_DGNS_CD|ADMTG_DGNS_VRSN_CD|PRNCPAL_DGNS_CD|PRNCPAL_DGNS_VRSN_CD|ICD_DGNS_CD1|ICD_DGNS_VRSN_CD1|ICD_DGNS_CD2|ICD_DGNS_VRSN_CD2|ICD_DGNS_CD3|ICD_DGNS_VRSN_CD3|ICD_DGNS_CD4|ICD_DGNS_VRSN_CD4|ICD_DGNS_CD5|ICD_DGNS_VRSN_CD5|ICD_DGNS_CD6|ICD_DGNS_VRSN_CD6|ICD_DGNS_CD7|ICD_DGNS_VRSN_CD7|ICD_DGNS_CD8|ICD_DGNS_VRSN_CD8|ICD_DGNS_CD9|ICD_DGNS_VRSN_CD9|ICD_DGNS_CD10|ICD_DGNS_VRSN_CD10|ICD_DGNS_CD11|ICD_DGNS_VRSN_CD11|ICD_DGNS_CD12|ICD_DGNS_VRSN_CD12|ICD_DGNS_CD13|ICD_DGNS_VRSN_CD13|ICD_DGNS_CD14|ICD_DGNS_VRSN_CD14|ICD_DGNS_CD15|ICD_DGNS_VRSN_CD15|ICD_DGNS_CD16|ICD_DGNS_VRSN_CD16|ICD_DGNS_CD17|ICD_DGNS_VRSN_CD17|ICD_DGNS_CD18|ICD_DGNS_VRSN_CD18|ICD_DGNS_CD19|ICD_DGNS_VRSN_CD19|ICD_DGNS_CD20|ICD_DGNS_VRSN_CD20|ICD_DGNS_CD21|ICD_DGNS_VRSN_CD21|ICD_DGNS_CD22|ICD_DGNS_VRSN_CD22|ICD_DGNS_CD23|ICD_DGNS_VRSN_CD23|ICD_DGNS_CD24|ICD_DGNS_VRSN_CD24|ICD_DGNS_CD25|ICD_DGNS_VRSN_CD25|FST_DGNS_E_CD|FST_DGNS_E_VRSN_CD|ICD_DGNS_E_CD1|ICD_DGNS_E_VRSN_CD1|ICD_DGNS_E_CD2|ICD_DGNS_E_VRSN_CD2|ICD_DGNS_E_CD3|ICD_DGNS_E_VRSN_CD3|ICD_DGNS_E_CD4|ICD_DGNS_E_VRSN_CD4|ICD_DGNS_E_CD5|ICD_DGNS_E_VRSN_CD5|ICD_DGNS_E_CD6|ICD_DGNS_E_VRSN_CD6|ICD_DGNS_E_CD7|ICD_DGNS_E_VRSN_CD7|ICD_DGNS_E_CD8|ICD_DGNS_E_VRSN_CD8|ICD_DGNS_E_CD9|ICD_DGNS_E_VRSN_CD9|ICD_DGNS_E_CD10|ICD_DGNS_E_VRSN_CD10|ICD_DGNS_E_CD11|ICD_DGNS_E_VRSN_CD11|ICD_DGNS_E_CD12|ICD_DGNS_E_VRSN_CD12|ICD_PRCDR_CD1|ICD_PRCDR_VRSN_CD1|PRCDR_DT1|ICD_PRCDR_CD2|ICD_PRCDR_VRSN_CD2|PRCDR_DT2|ICD_PRCDR_CD3|ICD_PRCDR_VRSN_CD3|PRCDR_DT3|ICD_PRCDR_CD4|ICD_PRCDR_VRSN_CD4|PRCDR_DT4|ICD_PRCDR_CD5|ICD_PRCDR_VRSN_CD5|PRCDR_DT5|ICD_PRCDR_CD6|ICD_PRCDR_VRSN_CD6|PRCDR_DT6|ICD_PRCDR_CD7|ICD_PRCDR_VRSN_CD7|PRCDR_DT7|ICD_PRCDR_CD8|ICD_PRCDR_VRSN_CD8|PRCDR_DT8|ICD_PRCDR_CD9|ICD_PRCDR_VRSN_CD9|PRCDR_DT9|ICD_PRCDR_CD10|ICD_PRCDR_VRSN_CD10|PRCDR_DT10|ICD_PRCDR_CD11|ICD_PRCDR_VRSN_CD11|PRCDR_DT11|ICD_PRCDR_CD12|ICD_PRCDR_VRSN_CD12|PRCDR_DT12|ICD_PRCDR_CD13|ICD_PRCDR_VRSN_CD13|PRCDR_DT13|ICD_PRCDR_CD14|ICD_PRCDR_VRSN_CD14|PRCDR_DT14|ICD_PRCDR_CD15|ICD_PRCDR_VRSN_CD15|PRCDR_DT15|ICD_PRCDR_CD16|ICD_PRCDR_VRSN_CD16|PRCDR_DT16|ICD_PRCDR_CD17|ICD_PRCDR_VRSN_CD17|PRCDR_DT17|ICD_PRCDR_CD18|ICD_PRCDR_VRSN_CD18|PRCDR_DT18|ICD_PRCDR_CD19|ICD_PRCDR_VRSN_CD19|PRCDR_DT19|ICD_PRCDR_CD20|ICD_PRCDR_VRSN_CD20|PRCDR_DT20|ICD_PRCDR_CD21|ICD_PRCDR_VRSN_CD21|PRCDR_DT21|ICD_PRCDR_CD22|ICD_PRCDR_VRSN_CD22|PRCDR_DT22|ICD_PRCDR_CD23|ICD_PRCDR_VRSN_CD23|PRCDR_DT23|ICD_PRCDR_CD24|ICD_PRCDR_VRSN_CD24|PRCDR_DT24|ICD_PRCDR_CD25|ICD_PRCDR_VRSN_CD25|PRCDR_DT25|FI_DOC_CLM_CNTL_NUM|FI_ORIG_CLM_CNTL_NUM|CLM_LINE_NUM|REV_CNTR|HCPCS_CD|REV_CNTR_UNIT_CNT|REV_CNTR_RATE_AMT|REV_CNTR_TOT_CHRG_AMT|REV_CNTR_NCVRD_CHRG_AMT|REV_CNTR_DDCTBL_COINSRNC_CD|REV_CNTR_NDC_QTY|REV_CNTR_NDC_QTY_QLFR_CD|RNDRNG_PHYSN_UPIN|RNDRNG_PHYSN_NPI +INSERT|567834|777777777|900|F|V|20|01-DEC-2013|18-DEC-2013|14-FEB-2014|07-FEB-2014|3|299999|2|1|1|11111|B|3333.33|11.00|A|1|FL|0000000000||2222222222||3333333333||4444444444|0|1|2|5555.03|05-NOV-2013|3|4|A|112.00|5.00|6.00|33.00|14.00|9.00|8.00|7.00|6.00|5.00|4.00|17|17|0|19|23-SEP-2013|05-NOV-2013|11-JAN-2002|21-JAN-2002||31-JAN-2002|18-DEC-2013|645|6202|9|3736|9|3736|9|V0182|9|||||||||||||||||||||||||||||||||||29189||||||||||||E9281|9|E9281|9|3310|9|||||||||||||||||||||9214|9|16-JAN-2016|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||23443453453|34534535535|1|22|MMM|477|5.00|95.00|88.00|A|234.567|ML||345345345| diff --git a/apps/bfd-server/bfd-server-war/src/main/resources/samhsa-related-codes/codes-cpt.csv b/apps/bfd-server/bfd-server-war/src/main/resources/samhsa-related-codes/codes-cpt.csv index 158bdc424d..cb738f3113 100644 --- a/apps/bfd-server/bfd-server-war/src/main/resources/samhsa-related-codes/codes-cpt.csv +++ b/apps/bfd-server/bfd-server-war/src/main/resources/samhsa-related-codes/codes-cpt.csv @@ -58,4 +58,5 @@ "G2172","All-inclusive payment for services related to highly coordinated and integrated opioid use disorder (OUD) treatment services furnished for the demonstration project" "G1028","Take-home supply of nasal naloxone; 2-pack of 8mg per 0.1 ml nasal spray (provision of the services by a medicare-enrolled opioid treatment program); list separately in addition to code for primary procedure" "G2215","Take-home supply of nasal naloxone; 2-pack of 4mg per 0.1 ml nasal spray (provision of the services by a medicare-enrolled opioid treatment program); list separately in addition to code for primary procedure" -"G2216","Take-home supply of injectable naloxone (provision of the services by a medicare-enrolled opioid treatment program); list separately in addition to code for primary procedure" \ No newline at end of file +"G2216","Take-home supply of injectable naloxone (provision of the services by a medicare-enrolled opioid treatment program); list separately in addition to code for primary procedure" +"G0137","Intensive outpatient services; minimum of nine services over a 7-contiguous day period, which can include individual and group therapy with physicians or psychologists (or other mental health professionals to the extent authorized under State law); occupational therapy requiring the skills of a qualified occupational therapist; services of social workers, trained psychiatric nurses, and other staff trained to work with psychiatric patients; drugs and biologicals furnished for therapeutic purposes, excluding opioid agonist and antagonist medications that are FDA-approved for use in treatment of OUD or opioid antagonist medications for the emergency treatment of known or suspected opioid overdose; individualized activity therapies that are not primarily recreational or diversionary; family counseling (the primary purpose of which is treatment of the individual’s condition); patient training and education (to the extent that training and educational activities are closely and clearly related to individual’s care and treatment); diagnostic services (not including toxicology testing); (provision of the services by a Medicare-enrolled Opioid Treatment Program); List separately in addition to code for primary procedure, if applicable)." \ No newline at end of file diff --git a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/ExplanationOfBenefitE2EBase.java b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/ExplanationOfBenefitE2EBase.java index 9d669170ef..7e8e6259ab 100644 --- a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/ExplanationOfBenefitE2EBase.java +++ b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/ExplanationOfBenefitE2EBase.java @@ -45,6 +45,9 @@ public abstract class ExplanationOfBenefitE2EBase extends ServerRequiredTest { /** The SAMHSA ICD9 diagnosis code. */ protected static final String SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE = "29189"; + /** The SAMHSA CPT code. */ + protected static final String SAMPLE_SAMHSA_CPT_CODE = "G0137"; + /** * Verifies that an EOB Carrier claim can be requested using the read endpoint, successfully * returns a 200 response, and has the claim id and a couple other EOB details present in the @@ -582,7 +585,7 @@ public void testEobByPatientIdWithExcludeSamhsaTrueExpectFiltering() { // Adjust the sampleA data that was loaded to include some samhsa data // We could also just keep a samhsa set, or have the default set have samhsa // so that we don't need a separate set or modification - String patientId = testUtils.getPatientId(testUtils.loadSampleAData(true)); + String patientId = testUtils.getPatientId(testUtils.loadSampleASamhsaData()); String requestString = eobEndpoint + "?patient=" + patientId + "&excludeSAMHSA=true"; given() @@ -598,96 +601,6 @@ public void testEobByPatientIdWithExcludeSamhsaTrueExpectFiltering() { .get(requestString); } - /** - * Verifies that EOB search by patient id does not filter SAMHSA results when excludeSAMHSA is set - * to false. - */ - @Test - public void testEobByPatientIdWithExcludeSamhsaFalseExpectNoFiltering() { - - // Adjust the sampleA data that was loaded to include some samhsa data by passing true - String patientId = testUtils.getPatientId(testUtils.loadSampleAData(true)); - String requestString = eobEndpoint + "?patient=" + patientId + "&excludeSAMHSA=false"; - - given() - .spec(requestAuth) - .expect() - .body("resourceType", equalTo("Bundle")) - .body("entry.size()", equalTo(8)) - // Check nothing is filtered and samhsa data is returned - .body( - "entry.find { it.resource.id.contains('carrier') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('hha') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('dme') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('hospice') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('inpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('outpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('snf') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - // Make sure pde is there too - .body("entry.resource.id", hasItem(containsString("pde"))) - .statusCode(200) - .when() - .get(requestString); - } - - /** - * Verifies that EOB search by patient id does not filter SAMHSA results when excludeSAMHSA is not - * explicitly set (should default to false internally). - */ - @Test - public void testEobByPatientIdWithExcludeSamhsaDefaultExpectNoFiltering() { - - // Adjust the sampleA data that was loaded to include some samhsa data by passing true - String patientId = testUtils.getPatientId(testUtils.loadSampleAData(true)); - String requestString = eobEndpoint + "?patient=" + patientId; - - given() - .spec(requestAuth) - .expect() - .body("resourceType", equalTo("Bundle")) - .body("entry.size()", equalTo(8)) - // Check nothing is filtered and samhsa data is returned - .body( - "entry.find { it.resource.id.contains('carrier') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('hha') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('dme') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('hospice') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('inpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('outpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - .body( - "entry.find { it.resource.id.contains('snf') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", - hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) - // Make sure pde is there too - .body("entry.resource.id", hasItem(containsString("pde"))) - .statusCode(200) - .when() - .get(requestString); - } - /** * Ensure nothing unusual happens when we excludeSAMHSA = false and the result has non-samhsa * data. @@ -696,7 +609,7 @@ public void testEobByPatientIdWithExcludeSamhsaDefaultExpectNoFiltering() { public void testEobByPatientIdForNonSamhsaEobsWithExcludeSamhsaTrueExpectNoError() { // dont load samhsa data - String patientId = testUtils.getPatientId(testUtils.loadSampleAData(false)); + String patientId = testUtils.getPatientId(testUtils.loadSampleAData()); // call samhsa filter, but it shouldn't do anything since there is nothing to filter String requestString = eobEndpoint + "?patient=" + patientId + "&excludeSAMHSA=true"; diff --git a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/ServerTestUtils.java b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/ServerTestUtils.java index 324ec37164..595fa7deb9 100644 --- a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/ServerTestUtils.java +++ b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/ServerTestUtils.java @@ -43,7 +43,6 @@ import gov.cms.bfd.server.sharedutils.BfdMDC; import gov.cms.bfd.server.war.commons.ClaimType; import gov.cms.bfd.server.war.commons.CommonTransformerUtils; -import gov.cms.bfd.server.war.stu3.providers.Stu3EobSamhsaMatcherTest; import gov.cms.bfd.sharedutils.database.DatabaseUtils; import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException; import io.restassured.response.Response; @@ -84,7 +83,6 @@ import javax.management.MBeanServer; import javax.net.ssl.SSLContext; import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Table; import javax.sql.DataSource; @@ -447,231 +445,18 @@ public static List parseData(List sampleResources) { * @return the loaded records */ public List loadSampleAData() { - return loadSampleAData(false); + return ServerTestUtils.get() + .loadData(Arrays.asList(StaticRifResourceGroup.SAMPLE_A.getResources())); } /** - * Loads the sample A data to use in tests. + * Loads the sample A data with various samhsa codes to use in tests. * - * @param addSamhsa if samhsa data should be added to the carrier test data * @return the loaded records */ - public List loadSampleAData(boolean addSamhsa) { - - List loadedRecords = - ServerTestUtils.get() - .loadData(Arrays.asList(StaticRifResourceGroup.SAMPLE_A.getResources())); - if (addSamhsa) { - addSamhsaToLoadedRecords(loadedRecords); - } - - return loadedRecords; - } - - /** - * Load the SAMPLE_A resources and then tweak carrier claim types to have a SAMHSA diagnosis code. - * - * @param loadedRecords the loaded records - */ - private void addSamhsaToLoadedRecords(List loadedRecords) { - // Load the SAMPLE_A resources normally. - EntityManager entityManager = null; - - try { - EntityManagerFactory entityManagerFactory = - PipelineTestUtils.get().getPipelineApplicationState().getEntityManagerFactory(); - entityManager = entityManagerFactory.createEntityManager(); - - // Tweak the SAMPLE_A claims such that they are SAMHSA-related. - adjustCarrierClaimForSamhsaDiagnosis(loadedRecords, entityManager); - adjustHhaRecordForSamhsaDiagnosis(loadedRecords, entityManager); - adjustDmeRecordForSamhsaDiagnosis(loadedRecords, entityManager); - adjustInpatientRecordForSamhsaDiagnosis(loadedRecords, entityManager); - adjustHospiceRecordForSamhsaDiagnosis(loadedRecords, entityManager); - adjustOutpatientRecordForSamhsaDiagnosis(loadedRecords, entityManager); - adjustSnfRecordForSamhsaDiagnosis(loadedRecords, entityManager); - - } finally { - if (entityManager != null && entityManager.getTransaction().isActive()) - entityManager.getTransaction().rollback(); - if (entityManager != null) entityManager.close(); - } - } - - /** - * Adjusts the carrier claim to support samhsa. - * - * @param loadedRecords the loaded records - * @param entityManager the entity manager - */ - private void adjustCarrierClaimForSamhsaDiagnosis( - List loadedRecords, EntityManager entityManager) { - - CarrierClaim carrierRifRecord = - loadedRecords.stream() - .filter(r -> r instanceof CarrierClaim) - .map(CarrierClaim.class::cast) - .findFirst() - .get(); - - entityManager.getTransaction().begin(); - carrierRifRecord = entityManager.find(CarrierClaim.class, carrierRifRecord.getClaimId()); - carrierRifRecord.setDiagnosis2Code( - Optional.of(Stu3EobSamhsaMatcherTest.SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)); - carrierRifRecord.setDiagnosis2CodeVersion(Optional.of('9')); - entityManager.merge(carrierRifRecord); - entityManager.getTransaction().commit(); - } - - /** - * Adjusts the first inpatient record to support samhsa. - * - * @param loadedRecords the loaded records - * @param entityManager the entity manager - */ - private void adjustInpatientRecordForSamhsaDiagnosis( - List loadedRecords, EntityManager entityManager) { - - InpatientClaim inpatientRifRecord = - loadedRecords.stream() - .filter(r -> r instanceof InpatientClaim) - .map(InpatientClaim.class::cast) - .findFirst() - .get(); - - entityManager.getTransaction().begin(); - inpatientRifRecord = entityManager.find(InpatientClaim.class, inpatientRifRecord.getClaimId()); - inpatientRifRecord.setDiagnosis2Code( - Optional.of(Stu3EobSamhsaMatcherTest.SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)); - inpatientRifRecord.setDiagnosis2CodeVersion(Optional.of('9')); - entityManager.merge(inpatientRifRecord); - entityManager.getTransaction().commit(); - } - - /** - * Adjusts the first outpatient record to support samhsa. - * - * @param loadedRecords the loaded records - * @param entityManager the entity manager - */ - private void adjustOutpatientRecordForSamhsaDiagnosis( - List loadedRecords, EntityManager entityManager) { - - OutpatientClaim outpatientRifRecord = - loadedRecords.stream() - .filter(r -> r instanceof OutpatientClaim) - .map(OutpatientClaim.class::cast) - .findFirst() - .get(); - - entityManager.getTransaction().begin(); - outpatientRifRecord = - entityManager.find(OutpatientClaim.class, outpatientRifRecord.getClaimId()); - outpatientRifRecord.setDiagnosis2Code( - Optional.of(Stu3EobSamhsaMatcherTest.SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)); - outpatientRifRecord.setDiagnosis2CodeVersion(Optional.of('9')); - entityManager.merge(outpatientRifRecord); - entityManager.getTransaction().commit(); - } - - /** - * Adjusts the first HHA record to support samhsa. - * - * @param loadedRecords the loaded records - * @param entityManager the entity manager - */ - private void adjustHhaRecordForSamhsaDiagnosis( - List loadedRecords, EntityManager entityManager) { - - HHAClaim hhaRifRecord = - loadedRecords.stream() - .filter(r -> r instanceof HHAClaim) - .map(HHAClaim.class::cast) - .findFirst() - .get(); - - entityManager.getTransaction().begin(); - hhaRifRecord = entityManager.find(HHAClaim.class, hhaRifRecord.getClaimId()); - hhaRifRecord.setDiagnosis2Code( - Optional.of(Stu3EobSamhsaMatcherTest.SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)); - hhaRifRecord.setDiagnosis2CodeVersion(Optional.of('9')); - entityManager.merge(hhaRifRecord); - entityManager.getTransaction().commit(); - } - - /** - * Adjusts the first SNF record to support samhsa. - * - * @param loadedRecords the loaded records - * @param entityManager the entity manager - */ - private void adjustSnfRecordForSamhsaDiagnosis( - List loadedRecords, EntityManager entityManager) { - - SNFClaim snfRifRecord = - loadedRecords.stream() - .filter(r -> r instanceof SNFClaim) - .map(SNFClaim.class::cast) - .findFirst() - .get(); - - entityManager.getTransaction().begin(); - snfRifRecord = entityManager.find(SNFClaim.class, snfRifRecord.getClaimId()); - snfRifRecord.setDiagnosis2Code( - Optional.of(Stu3EobSamhsaMatcherTest.SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)); - snfRifRecord.setDiagnosis2CodeVersion(Optional.of('9')); - entityManager.merge(snfRifRecord); - entityManager.getTransaction().commit(); - } - - /** - * Adjusts the first Hospice record to support samhsa. - * - * @param loadedRecords the loaded records - * @param entityManager the entity manager - */ - private void adjustHospiceRecordForSamhsaDiagnosis( - List loadedRecords, EntityManager entityManager) { - - HospiceClaim hospiceRifRecord = - loadedRecords.stream() - .filter(r -> r instanceof HospiceClaim) - .map(HospiceClaim.class::cast) - .findFirst() - .get(); - - entityManager.getTransaction().begin(); - hospiceRifRecord = entityManager.find(HospiceClaim.class, hospiceRifRecord.getClaimId()); - hospiceRifRecord.setDiagnosis2Code( - Optional.of(Stu3EobSamhsaMatcherTest.SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)); - hospiceRifRecord.setDiagnosis2CodeVersion(Optional.of('9')); - entityManager.merge(hospiceRifRecord); - entityManager.getTransaction().commit(); - } - - /** - * Adjusts the first DME record to support samhsa. - * - * @param loadedRecords the loaded records - * @param entityManager the entity manager - */ - private void adjustDmeRecordForSamhsaDiagnosis( - List loadedRecords, EntityManager entityManager) { - - DMEClaim dmeRifRecord = - loadedRecords.stream() - .filter(r -> r instanceof DMEClaim) - .map(DMEClaim.class::cast) - .findFirst() - .get(); - - entityManager.getTransaction().begin(); - dmeRifRecord = entityManager.find(DMEClaim.class, dmeRifRecord.getClaimId()); - dmeRifRecord.setDiagnosis2Code( - Optional.of(Stu3EobSamhsaMatcherTest.SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)); - dmeRifRecord.setDiagnosis2CodeVersion(Optional.of('9')); - entityManager.merge(dmeRifRecord); - entityManager.getTransaction().commit(); + public List loadSampleASamhsaData() { + return ServerTestUtils.get() + .loadData(Arrays.asList(StaticRifResourceGroup.SAMPLE_A_SAMHSA.getResources())); } /** diff --git a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/r4/providers/ExplanationOfBenefitE2E.java b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/r4/providers/ExplanationOfBenefitE2E.java index 823e757074..f758c4cdcb 100644 --- a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/r4/providers/ExplanationOfBenefitE2E.java +++ b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/r4/providers/ExplanationOfBenefitE2E.java @@ -1,6 +1,7 @@ package gov.cms.bfd.server.war.r4.providers; import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; @@ -66,4 +67,94 @@ public void testEobByPatientIdWithIncludeTaxNumbersTrueExpectTaxNumbers() { .when() .get(requestString); } + + /** + * Verifies that EOB search by patient id does not filter SAMHSA results when excludeSAMHSA is set + * to false. + */ + @Test + public void testEobByPatientIdWithExcludeSamhsaFalseExpectNoFiltering() { + + // Adjust the sampleA data that was loaded to include some samhsa data by passing true + String patientId = testUtils.getPatientId(testUtils.loadSampleASamhsaData()); + String requestString = eobEndpoint + "?patient=" + patientId + "&excludeSAMHSA=false"; + + given() + .spec(requestAuth) + .expect() + .body("resourceType", equalTo("Bundle")) + .body("entry.size()", equalTo(8)) + // Check nothing is filtered and samhsa data is returned + .body( + "entry.find { it.resource.id.contains('carrier') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('hha') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('dme') }.resource.item.productOrService.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_CPT_CODE)) + .body( + "entry.find { it.resource.id.contains('hospice') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('inpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('outpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('snf') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + // Make sure pde is there too + .body("entry.resource.id", hasItem(containsString("pde"))) + .statusCode(200) + .when() + .get(requestString); + } + + /** + * Verifies that EOB search by patient id does not filter SAMHSA results when excludeSAMHSA is not + * explicitly set (should default to false internally). + */ + @Test + public void testEobByPatientIdWithExcludeSamhsaDefaultExpectNoFiltering() { + + // Adjust the sampleA data that was loaded to include some samhsa data by passing true + String patientId = testUtils.getPatientId(testUtils.loadSampleASamhsaData()); + String requestString = eobEndpoint + "?patient=" + patientId; + + given() + .spec(requestAuth) + .expect() + .body("resourceType", equalTo("Bundle")) + .body("entry.size()", equalTo(8)) + // Check nothing is filtered and samhsa data is returned + .body( + "entry.find { it.resource.id.contains('carrier') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('hha') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('dme') }.resource.item.productOrService.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_CPT_CODE)) + .body( + "entry.find { it.resource.id.contains('hospice') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('inpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('outpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('snf') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + // Make sure pde is there too + .body("entry.resource.id", hasItem(containsString("pde"))) + .statusCode(200) + .when() + .get(requestString); + } } diff --git a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/ExplanationOfBenefitE2E.java b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/ExplanationOfBenefitE2E.java index 4e229d96a5..1896f56cd2 100644 --- a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/ExplanationOfBenefitE2E.java +++ b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/ExplanationOfBenefitE2E.java @@ -1,7 +1,9 @@ package gov.cms.bfd.server.war.stu3.providers; import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; import gov.cms.bfd.model.rif.entities.CarrierClaim; import gov.cms.bfd.model.rif.entities.DMEClaim; @@ -67,4 +69,94 @@ Tax num value (for v1) is found in the eob.careTeam[N].provider.identifier[N].va .when() .get(requestString); } + + /** + * Verifies that EOB search by patient id does not filter SAMHSA results when excludeSAMHSA is set + * to false. + */ + @Test + public void testEobByPatientIdWithExcludeSamhsaFalseExpectNoFiltering() { + + // Adjust the sampleA data that was loaded to include some samhsa data by passing true + String patientId = testUtils.getPatientId(testUtils.loadSampleASamhsaData()); + String requestString = eobEndpoint + "?patient=" + patientId + "&excludeSAMHSA=false"; + + given() + .spec(requestAuth) + .expect() + .body("resourceType", equalTo("Bundle")) + .body("entry.size()", equalTo(8)) + // Check nothing is filtered and samhsa data is returned + .body( + "entry.find { it.resource.id.contains('carrier') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('hha') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('dme') }.resource.item.service.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_CPT_CODE)) + .body( + "entry.find { it.resource.id.contains('hospice') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('inpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('outpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('snf') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + // Make sure pde is there too + .body("entry.resource.id", hasItem(containsString("pde"))) + .statusCode(200) + .when() + .get(requestString); + } + + /** + * Verifies that EOB search by patient id does not filter SAMHSA results when excludeSAMHSA is not + * explicitly set (should default to false internally). + */ + @Test + public void testEobByPatientIdWithExcludeSamhsaDefaultExpectNoFiltering() { + + // Adjust the sampleA data that was loaded to include some samhsa data by passing true + String patientId = testUtils.getPatientId(testUtils.loadSampleASamhsaData()); + String requestString = eobEndpoint + "?patient=" + patientId; + + given() + .spec(requestAuth) + .expect() + .body("resourceType", equalTo("Bundle")) + .body("entry.size()", equalTo(8)) + // Check nothing is filtered and samhsa data is returned + .body( + "entry.find { it.resource.id.contains('carrier') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('hha') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('dme') }.resource.item.service.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_CPT_CODE)) + .body( + "entry.find { it.resource.id.contains('hospice') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('inpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('outpatient') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + .body( + "entry.find { it.resource.id.contains('snf') }.resource.diagnosis.diagnosisCodeableConcept.coding.code.flatten()", + hasItem(SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE)) + // Make sure pde is there too + .body("entry.resource.id", hasItem(containsString("pde"))) + .statusCode(200) + .when() + .get(requestString); + } } diff --git a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/Stu3EobSamhsaMatcherTest.java b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/Stu3EobSamhsaMatcherTest.java index f3c147dd1f..4c5c1eee1c 100644 --- a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/Stu3EobSamhsaMatcherTest.java +++ b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/Stu3EobSamhsaMatcherTest.java @@ -38,13 +38,12 @@ /** * Unit tests for {@link Stu3EobSamhsaMatcherTest}. Integration with {@link * ExplanationOfBenefitResourceProvider} is covered by {@link - * ExplanationOfBenefitResourceProviderE2E#searchForSamhsaEobsWithExcludeSamhsaTrue} and related - * integration tests. + * ExplanationOfBenefitE2E#testEobByPatientIdWithExcludeSamhsaTrueExpectFiltering} and related E2E + * tests. */ public final class Stu3EobSamhsaMatcherTest { - // TODO complete and verify that these exactly match real values in our DB /** The SAMHSA CPT code. */ - public static final String SAMPLE_SAMHSA_CPT_CODE = "4320F"; + public static final String SAMPLE_SAMHSA_CPT_CODE = "G0137"; /** The SAMHSA ICD9 diagnosis code. */ public static final String SAMPLE_SAMHSA_ICD_9_DIAGNOSIS_CODE = "29189"; @@ -122,7 +121,7 @@ public void containsOnlyKnownSystemsTest( doReturn(system).when(mockCoding).getSystem(); return mockCoding; }) - .collect(Collectors.toUnmodifiableList()); + .toList(); doReturn(codings).when(mockConcept).getCoding();