From 81f506b41f70daf5600f1fc87f1e7b27b8b4686a Mon Sep 17 00:00:00 2001
From: MahiFentaye <168698136+MahiFentaye@users.noreply.github.com>
Date: Wed, 15 Jan 2025 10:25:57 -0500
Subject: [PATCH 1/2] Update pom.xml
adding missed dependency
---
apps/bfd-pipeline/bfd-pipeline-shared-utils/pom.xml | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/pom.xml b/apps/bfd-pipeline/bfd-pipeline-shared-utils/pom.xml
index 0a20188bec..e45a57dc71 100644
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/pom.xml
+++ b/apps/bfd-pipeline/bfd-pipeline-shared-utils/pom.xml
@@ -124,6 +124,14 @@
jcl-over-slf4j
test
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-yaml
+
+
+ org.apache.commons
+ commons-text
+
From b86c73b369235ccab9267f82e854cf13ed970f4e Mon Sep 17 00:00:00 2001
From: Mahi Fentaye <168698136+MahiFentaye@users.noreply.github.com>
Date: Fri, 24 Jan 2025 10:53:16 -0500
Subject: [PATCH 2/2] BFD-3665 - Populate Tags in FHIR Resource (#2512)
---
.../pipeline/ccw/rif/load/RifLoaderIT.java | 2 +-
.../bfd/pipeline/sharedutils/SamhsaUtil.java | 2 +-
.../adapters/SamhsaCarrierAdapter.java | 2 +-
.../adapters/SamhsaDmeAdapter.java | 2 +-
.../adapters/SamhsaHHAAdapter.java | 2 +-
.../adapters/SamhsaHospiceAdapter.java | 2 +-
.../adapters/SamhsaInpatientAdapter.java | 2 +-
.../adapters/SamhsaOutpatientAdapter.java | 2 +-
.../adapters/SamhsaSnfAdapter.java | 3 +-
.../pipeline/sharedutils/model/TagCode.java | 26 -
.../war/commons/SecurityTagManager.java | 126 ++
.../war/commons/TransformerConstants.java | 15 +
.../providers/CarrierClaimTransformerV2.java | 24 +-
.../r4/providers/DMEClaimTransformerV2.java | 24 +-
.../r4/providers/HHAClaimTransformerV2.java | 24 +-
.../providers/HospiceClaimTransformerV2.java | 24 +-
.../InpatientClaimTransformerV2.java | 24 +-
.../OutpatientClaimTransformerV2.java | 24 +-
.../r4/providers/SNFClaimTransformerV2.java | 24 +-
.../pac/FissClaimResponseTransformerV2.java | 24 +-
.../providers/pac/FissClaimTransformerV2.java | 23 +-
.../pac/McsClaimResponseTransformerV2.java | 23 +-
.../providers/pac/McsClaimTransformerV2.java | 25 +-
.../providers/CarrierClaimTransformer.java | 24 +-
.../stu3/providers/DMEClaimTransformer.java | 26 +-
.../stu3/providers/HHAClaimTransformer.java | 25 +-
.../providers/HospiceClaimTransformer.java | 26 +-
.../providers/InpatientClaimTransformer.java | 27 +-
.../providers/OutpatientClaimTransformer.java | 26 +-
.../stu3/providers/SNFClaimTransformer.java | 25 +-
.../war/EndpointJsonComparatorBase.java | 44 +-
.../CarrierClaimTransformerV2Test.java | 8 +-
.../providers/DMEClaimTransformerV2Test.java | 7 +-
.../EndpointJsonResponseComparatorV2E2E.java | 24 +
.../providers/HHAClaimTransformerV2Test.java | 7 +-
.../HospiceClaimTransformerV2Test.java | 7 +-
.../InpatientClaimTransformerV2Test.java | 7 +-
.../OutpatientClaimTransformerV2Test.java | 9 +-
...PatientClaimsEobTaskTransformerV2Test.java | 26 +-
.../providers/SNFClaimTransformerV2Test.java | 7 +-
...saMatcherR4FromClaimTransformerV2Test.java | 20 +-
.../r4/providers/TransformerTestUtilsV2.java | 26 +-
.../r4/providers/TransformerUtilsV2Test.java | 21 +-
.../pac/FissClaimTransformerV2Test.java | 5 +-
.../pac/McsClaimTransformerV2Test.java | 6 +-
.../R4ClaimSamhsaMatcherTransformerTest.java | 14 +-
.../CarrierClaimTransformerTest.java | 7 +-
.../providers/DMEClaimTransformerTest.java | 7 +-
.../EndpointJsonResponseComparatorE2E.java | 23 +
.../providers/HHAClaimTransformerTest.java | 7 +-
.../HospiceClaimTransformerTest.java | 7 +-
.../InpatientClaimTransformerTest.java | 7 +-
.../OutpatientClaimTransformerTest.java | 7 +-
.../PatientClaimsEobTaskTransformerTest.java | 26 +-
.../providers/SNFClaimTransformerTest.java | 7 +-
...SamhsaMatcherFromClaimTransformerTest.java | 21 +-
.../providers/SecurityTagManagerTest.java | 76 +
.../providers/Stu3EobSamhsaMatcherTest.java | 16 +-
.../stu3/providers/TransformerTestUtils.java | 26 +-
.../stu3/providers/TransformerUtilsTest.java | 19 +-
.../v1/eobByPatientIdAll.json | 49 +-
.../v1/eobByPatientIdAllWithSamhsa.json | 1042 +++++++++++++
.../v1/eobByPatientIdPaged.json | 49 +-
.../endpoint-responses/v1/eobReadCarrier.json | 7 +-
.../v1/eobReadCarrierMultipleLines.json | 7 +-
.../v1/eobReadCarrierWithTaxNumbers.json | 7 +-
.../endpoint-responses/v1/eobReadDme.json | 7 +-
.../v1/eobReadDmeWithTaxNumbers.json | 7 +-
.../endpoint-responses/v1/eobReadHha.json | 7 +-
.../endpoint-responses/v1/eobReadHospice.json | 7 +-
.../v1/eobReadInpatient.json | 7 +-
.../v1/eobReadOutpatient.json | 7 +-
.../endpoint-responses/v1/eobReadSnf.json | 7 +-
.../endpoint-responses/v2/claimFissRead.json | 7 +-
.../v2/claimFissReadWithTaxNumbers.json | 7 +-
.../endpoint-responses/v2/claimMcsRead.json | 7 +-
.../v2/claimMcsReadWithTaxNumbers.json | 7 +-
.../v2/claimResponseFissRead.json | 7 +-
.../v2/claimResponseMcsRead.json | 7 +-
.../v2/claimResponseSearch.json | 14 +-
.../v2/claimResponseSearchPaginated.json | 7 +-
.../endpoint-responses/v2/claimSearch.json | 14 +-
.../v2/claimSearchPaginated.json | 7 +-
.../v2/claimSearchWithTaxNumbers.json | 14 +-
.../v2/eobByPatientIdAll.json | 49 +-
.../v2/eobByPatientIdPaged.json | 49 +-
.../v2/eobReadByPatientWithSamhsa.json | 1371 +++++++++++++++++
.../endpoint-responses/v2/eobReadCarrier.json | 7 +-
.../v2/eobReadCarrierWithMultipleLines.json | 7 +-
.../v2/eobReadCarrierWithTaxNumbers.json | 7 +-
.../endpoint-responses/v2/eobReadDme.json | 7 +-
.../v2/eobReadDmeWithTaxNumbers.json | 7 +-
.../endpoint-responses/v2/eobReadHha.json | 7 +-
.../endpoint-responses/v2/eobReadHospice.json | 7 +-
.../v2/eobReadInpatient.json | 7 +-
.../v2/eobReadOutpatient.json | 7 +-
.../endpoint-responses/v2/eobReadSnf.json | 7 +-
.../java/gov/cms/bfd/sharedutils/TagCode.java | 51 +
98 files changed, 3780 insertions(+), 240 deletions(-)
delete mode 100644 apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/model/TagCode.java
create mode 100644 apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/commons/SecurityTagManager.java
create mode 100644 apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/SecurityTagManagerTest.java
create mode 100644 apps/bfd-server/bfd-server-war/src/test/resources/endpoint-responses/v1/eobByPatientIdAllWithSamhsa.json
create mode 100644 apps/bfd-server/bfd-server-war/src/test/resources/endpoint-responses/v2/eobReadByPatientWithSamhsa.json
create mode 100644 apps/bfd-shared-utils/src/main/java/gov/cms/bfd/sharedutils/TagCode.java
diff --git a/apps/bfd-pipeline/bfd-pipeline-ccw-rif/src/test/java/gov/cms/bfd/pipeline/ccw/rif/load/RifLoaderIT.java b/apps/bfd-pipeline/bfd-pipeline-ccw-rif/src/test/java/gov/cms/bfd/pipeline/ccw/rif/load/RifLoaderIT.java
index 99f71b0ea6..06c4a042ce 100644
--- a/apps/bfd-pipeline/bfd-pipeline-ccw-rif/src/test/java/gov/cms/bfd/pipeline/ccw/rif/load/RifLoaderIT.java
+++ b/apps/bfd-pipeline/bfd-pipeline-ccw-rif/src/test/java/gov/cms/bfd/pipeline/ccw/rif/load/RifLoaderIT.java
@@ -42,7 +42,7 @@
import gov.cms.bfd.pipeline.ccw.rif.extract.s3.DataSetManifest.DataSetManifestEntry;
import gov.cms.bfd.pipeline.ccw.rif.extract.s3.DataSetManifest.PreValidationProperties;
import gov.cms.bfd.pipeline.sharedutils.IdHasher;
-import gov.cms.bfd.pipeline.sharedutils.model.TagCode;
+import gov.cms.bfd.sharedutils.TagCode;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/SamhsaUtil.java b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/SamhsaUtil.java
index 5dbb9600d8..0f27d1b866 100644
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/SamhsaUtil.java
+++ b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/SamhsaUtil.java
@@ -27,8 +27,8 @@
import gov.cms.bfd.pipeline.sharedutils.adapters.SamhsaOutpatientAdapter;
import gov.cms.bfd.pipeline.sharedutils.adapters.SamhsaSnfAdapter;
import gov.cms.bfd.pipeline.sharedutils.model.SamhsaEntry;
-import gov.cms.bfd.pipeline.sharedutils.model.TagCode;
import gov.cms.bfd.pipeline.sharedutils.model.TagDetails;
+import gov.cms.bfd.sharedutils.TagCode;
import jakarta.persistence.EntityManager;
import java.io.IOException;
import java.io.InputStream;
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaCarrierAdapter.java b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaCarrierAdapter.java
index ec8c3340ac..d10aa5ee66 100644
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaCarrierAdapter.java
+++ b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaCarrierAdapter.java
@@ -7,8 +7,8 @@
import gov.cms.bfd.model.rif.samhsa.CarrierTag;
import gov.cms.bfd.pipeline.sharedutils.SamhsaUtil;
import gov.cms.bfd.pipeline.sharedutils.model.SamhsaFields;
-import gov.cms.bfd.pipeline.sharedutils.model.TagCode;
import gov.cms.bfd.pipeline.sharedutils.model.TagDetails;
+import gov.cms.bfd.sharedutils.TagCode;
import jakarta.persistence.EntityManager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaDmeAdapter.java b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaDmeAdapter.java
index 5fc1ec970d..91bf5637d0 100644
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaDmeAdapter.java
+++ b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaDmeAdapter.java
@@ -7,8 +7,8 @@
import gov.cms.bfd.model.rif.samhsa.DmeTag;
import gov.cms.bfd.pipeline.sharedutils.SamhsaUtil;
import gov.cms.bfd.pipeline.sharedutils.model.SamhsaFields;
-import gov.cms.bfd.pipeline.sharedutils.model.TagCode;
import gov.cms.bfd.pipeline.sharedutils.model.TagDetails;
+import gov.cms.bfd.sharedutils.TagCode;
import jakarta.persistence.EntityManager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaHHAAdapter.java b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaHHAAdapter.java
index 5738bf5750..67d2e5d49c 100644
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaHHAAdapter.java
+++ b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaHHAAdapter.java
@@ -7,8 +7,8 @@
import gov.cms.bfd.model.rif.samhsa.HhaTag;
import gov.cms.bfd.pipeline.sharedutils.SamhsaUtil;
import gov.cms.bfd.pipeline.sharedutils.model.SamhsaFields;
-import gov.cms.bfd.pipeline.sharedutils.model.TagCode;
import gov.cms.bfd.pipeline.sharedutils.model.TagDetails;
+import gov.cms.bfd.sharedutils.TagCode;
import jakarta.persistence.EntityManager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaHospiceAdapter.java b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaHospiceAdapter.java
index 24206571bd..cf884fad1a 100644
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaHospiceAdapter.java
+++ b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaHospiceAdapter.java
@@ -7,8 +7,8 @@
import gov.cms.bfd.model.rif.samhsa.HospiceTag;
import gov.cms.bfd.pipeline.sharedutils.SamhsaUtil;
import gov.cms.bfd.pipeline.sharedutils.model.SamhsaFields;
-import gov.cms.bfd.pipeline.sharedutils.model.TagCode;
import gov.cms.bfd.pipeline.sharedutils.model.TagDetails;
+import gov.cms.bfd.sharedutils.TagCode;
import jakarta.persistence.EntityManager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaInpatientAdapter.java b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaInpatientAdapter.java
index 7a20cf1d0e..7bf07d9b08 100644
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaInpatientAdapter.java
+++ b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaInpatientAdapter.java
@@ -7,8 +7,8 @@
import gov.cms.bfd.model.rif.samhsa.InpatientTag;
import gov.cms.bfd.pipeline.sharedutils.SamhsaUtil;
import gov.cms.bfd.pipeline.sharedutils.model.SamhsaFields;
-import gov.cms.bfd.pipeline.sharedutils.model.TagCode;
import gov.cms.bfd.pipeline.sharedutils.model.TagDetails;
+import gov.cms.bfd.sharedutils.TagCode;
import jakarta.persistence.EntityManager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaOutpatientAdapter.java b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaOutpatientAdapter.java
index 242046dae4..07c5760477 100644
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaOutpatientAdapter.java
+++ b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaOutpatientAdapter.java
@@ -7,8 +7,8 @@
import gov.cms.bfd.model.rif.samhsa.OutpatientTag;
import gov.cms.bfd.pipeline.sharedutils.SamhsaUtil;
import gov.cms.bfd.pipeline.sharedutils.model.SamhsaFields;
-import gov.cms.bfd.pipeline.sharedutils.model.TagCode;
import gov.cms.bfd.pipeline.sharedutils.model.TagDetails;
+import gov.cms.bfd.sharedutils.TagCode;
import jakarta.persistence.EntityManager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaSnfAdapter.java b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaSnfAdapter.java
index 4afdbba113..5cc6509846 100644
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaSnfAdapter.java
+++ b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/adapters/SamhsaSnfAdapter.java
@@ -1,6 +1,5 @@
package gov.cms.bfd.pipeline.sharedutils.adapters;
-import static java.util.Map.*;
import static java.util.Map.entry;
import gov.cms.bfd.model.rif.entities.SNFClaim;
@@ -8,8 +7,8 @@
import gov.cms.bfd.model.rif.samhsa.SnfTag;
import gov.cms.bfd.pipeline.sharedutils.SamhsaUtil;
import gov.cms.bfd.pipeline.sharedutils.model.SamhsaFields;
-import gov.cms.bfd.pipeline.sharedutils.model.TagCode;
import gov.cms.bfd.pipeline.sharedutils.model.TagDetails;
+import gov.cms.bfd.sharedutils.TagCode;
import jakarta.persistence.EntityManager;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
diff --git a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/model/TagCode.java b/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/model/TagCode.java
deleted file mode 100644
index 6fb7ee60ee..0000000000
--- a/apps/bfd-pipeline/bfd-pipeline-shared-utils/src/main/java/gov/cms/bfd/pipeline/sharedutils/model/TagCode.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package gov.cms.bfd.pipeline.sharedutils.model;
-
-/** ENUM of TAG codes. */
-public enum TagCode {
- /** Tag Code R. */
- R("R"),
- /** Tag Code 42CFRPart2. */
- _42CFRPart2("42CFRPart2");
-
- /** Name of the enum in the DB. */
- private String dbName;
-
- /**
- * Constructor.
- *
- * @param dbName Sets the DB name of the enum.
- */
- TagCode(String dbName) {
- this.dbName = dbName;
- }
-
- @Override
- public String toString() {
- return this.dbName;
- }
-}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/commons/SecurityTagManager.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/commons/SecurityTagManager.java
new file mode 100644
index 0000000000..4016899bff
--- /dev/null
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/commons/SecurityTagManager.java
@@ -0,0 +1,126 @@
+package gov.cms.bfd.server.war.commons;
+
+import gov.cms.bfd.sharedutils.TagCode;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.hl7.fhir.r4.model.Coding;
+import org.springframework.stereotype.Service;
+
+/** Find security level. */
+@Service
+public final class SecurityTagManager {
+
+ /** The Entity manager. */
+ private EntityManager entityManager;
+
+ /**
+ * Sets the {@link #entityManager}.
+ *
+ * @param entityManager a JPA {@link EntityManager} connected to the application's database
+ */
+ @PersistenceContext
+ public void setEntityManager(EntityManager entityManager) {
+ this.entityManager = entityManager;
+ }
+
+ /**
+ * Query tags for a specific claim from a specific table.
+ *
+ * @param claimId the name of the variable
+ * @param tagClass the name of the tag class
+ * @return queryTagsForClaim
+ */
+ public Set queryTagsForClaim(String claimId, Class> tagClass) {
+
+ String sql = "SELECT t.code FROM " + tagClass.getSimpleName() + " t WHERE t.claim = :claim";
+
+ Query query = entityManager.createQuery(sql);
+ query.setParameter("claim", claimId);
+
+ @SuppressWarnings("unchecked")
+ List resultList = query.getResultList();
+
+ return new HashSet<>(resultList);
+ }
+
+ /**
+ * Determines the security level based on the collected tags.
+ *
+ * @param claimId value of claimId
+ * @param tagClass value of tagClass
+ * @return SecurityLevel
+ */
+ public List getClaimSecurityLevel(String claimId, Class> tagClass) {
+
+ // Query tags associated with the claim
+ List securityTags = queryTagsForClaim(claimId, tagClass).stream().toList();
+
+ List securityTagCoding = new ArrayList<>();
+
+ // If no security tags are found, directly add the default "Normal" tag
+ if (securityTags.isEmpty()) {
+ Coding coding = new Coding();
+ coding
+ .setSystem(TransformerConstants.SAMHSA_CONFIDENTIALITY_CODE_SYSTEM_URL)
+ .setCode("N")
+ .setDisplay("Normal");
+ securityTagCoding.add(coding);
+ } else {
+ // Check for each tag and set corresponding code and display
+ for (String securityTag : securityTags) {
+ Coding coding = new Coding();
+ // Convert the securityTag string to the TagCode enum
+ TagCode tagCode = TagCode.fromString(securityTag);
+ // Check each security tag and apply corresponding values
+ if (tagCode != null) {
+ switch (tagCode) {
+ case R:
+ coding
+ .setSystem(TransformerConstants.SAMHSA_CONFIDENTIALITY_CODE_SYSTEM_URL)
+ .setCode(TagCode.R.toString())
+ .setDisplay(TagCode.R.getDisplayName());
+ break;
+ case _42CFRPart2:
+ coding
+ .setSystem(TransformerConstants.SAMHSA_ACT_CODE_SYSTEM_URL)
+ .setCode(TagCode._42CFRPart2.toString())
+ .setDisplay(TagCode._42CFRPart2.getDisplayName());
+ break;
+ }
+ }
+ securityTagCoding.add(coding);
+ }
+ }
+
+ return securityTagCoding;
+ }
+
+ /**
+ * Determines the security level based on the collected tags.
+ *
+ * @param claimId value of claimId
+ * @param tagClass value of tagClass
+ * @return SecurityLevel
+ */
+ public List getClaimSecurityLevelDstu3(
+ String claimId, Class> tagClass) {
+
+ List securityTagCoding = new ArrayList<>();
+ List coding = getClaimSecurityLevel(claimId, tagClass);
+ for (Coding code : coding) {
+ org.hl7.fhir.dstu3.model.Coding securityTag = new org.hl7.fhir.dstu3.model.Coding();
+ securityTag
+ .setSystem("http://terminology.hl7.org/CodeSystem/v3-Confidentiality")
+ .setCode(code.getCode())
+ .setDisplay(code.getDisplay());
+
+ securityTagCoding.add(securityTag);
+ }
+ return securityTagCoding;
+ }
+}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/commons/TransformerConstants.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/commons/TransformerConstants.java
index 0c2994bee0..2965956e56 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/commons/TransformerConstants.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/commons/TransformerConstants.java
@@ -703,4 +703,19 @@ public enum CurrencyIdentifier {
*/
public static final String C4DIC_LOGO_URL =
"https://www.hhs.gov/sites/default/files/logo-white-lg.png";
+
+ /**
+ * URL for v3 Confidentiality Code System HL7 v3 Confidentiality Code
+ * System.
+ */
+ public static final String SAMHSA_CONFIDENTIALITY_CODE_SYSTEM_URL =
+ "http://terminology.hl7.org/CodeSystem/v3-Confidentiality";
+
+ /**
+ * URL for v3 Act Code System v3 Act
+ * Code System.
+ */
+ public static final String SAMHSA_ACT_CODE_SYSTEM_URL =
+ "http://terminology.hl7.org/CodeSystem/v3-ActCode";
}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/CarrierClaimTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/CarrierClaimTransformerV2.java
index 18aabb3d6c..be90f6dbac 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/CarrierClaimTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/CarrierClaimTransformerV2.java
@@ -10,19 +10,23 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.CarrierClaim;
import gov.cms.bfd.model.rif.entities.CarrierClaimLine;
+import gov.cms.bfd.model.rif.samhsa.CarrierTag;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.Diagnosis;
import gov.cms.bfd.server.war.commons.Diagnosis.DiagnosisLabel;
import gov.cms.bfd.server.war.commons.MedicareSegment;
import gov.cms.bfd.server.war.commons.Profile;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.carin.C4BBAdjudication;
import gov.cms.bfd.server.war.commons.carin.C4BBClaimProfessionalAndNonClinicianCareTeamRole;
import gov.cms.bfd.server.war.commons.carin.C4BBPractitionerIdentifierType;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.math.BigDecimal;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.ExplanationOfBenefit;
import org.hl7.fhir.r4.model.ExplanationOfBenefit.CareTeamComponent;
import org.hl7.fhir.r4.model.ExplanationOfBenefit.ItemComponent;
@@ -48,6 +52,9 @@ final class CarrierClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
private static final String METRIC_NAME =
MetricRegistry.name(CarrierClaimTransformerV2.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -58,14 +65,17 @@ final class CarrierClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
* @param metricRegistry the metric registry
* @param drugCodeDisplayLookup the drug code display lookup
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
public CarrierClaimTransformerV2(
MetricRegistry metricRegistry,
FdaDrugCodeDisplayLookup drugCodeDisplayLookup,
- NPIOrgLookup npiOrgLookup) {
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
this.drugCodeDisplayLookup = requireNonNull(drugCodeDisplayLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -83,7 +93,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((CarrierClaim) claim, includeTaxNumber);
+ CarrierClaim carrierClaim = (CarrierClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(
+ String.valueOf(carrierClaim.getClaimId()), CarrierTag.class);
+ eob = transformClaim(carrierClaim, includeTaxNumber, securityTags);
}
return eob;
}
@@ -93,15 +107,19 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
*
* @param claimGroup the CCW {@link CarrierClaim} to transform
* @param includeTaxNumbers whether to include tax numbers in the response
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* CarrierClaim}
*/
- private ExplanationOfBenefit transformClaim(CarrierClaim claimGroup, boolean includeTaxNumbers) {
+ private ExplanationOfBenefit transformClaim(
+ CarrierClaim claimGroup, boolean includeTaxNumbers, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Required values not directly mapped
eob.getMeta().addProfile(Profile.C4BB.getVersionedEobNonclinicianUrl());
+ eob.getMeta().setSecurity(securityTags);
+
// TODO: ExplanationOfBenefit.outcome is a required field. Needs to be mapped.
// eob.setOutcome(?)
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/DMEClaimTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/DMEClaimTransformerV2.java
index df02d767f5..0cffc598d5 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/DMEClaimTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/DMEClaimTransformerV2.java
@@ -10,18 +10,22 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.DMEClaim;
import gov.cms.bfd.model.rif.entities.DMEClaimLine;
+import gov.cms.bfd.model.rif.samhsa.DmeTag;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.Diagnosis;
import gov.cms.bfd.server.war.commons.Diagnosis.DiagnosisLabel;
import gov.cms.bfd.server.war.commons.MedicareSegment;
import gov.cms.bfd.server.war.commons.Profile;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.carin.C4BBAdjudication;
import gov.cms.bfd.server.war.commons.carin.C4BBClaimProfessionalAndNonClinicianCareTeamRole;
import gov.cms.bfd.server.war.commons.carin.C4BBPractitionerIdentifierType;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.ExplanationOfBenefit;
import org.hl7.fhir.r4.model.ExplanationOfBenefit.CareTeamComponent;
import org.hl7.fhir.r4.model.ExplanationOfBenefit.ItemComponent;
@@ -46,6 +50,9 @@ final class DMEClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
private static final String METRIC_NAME =
MetricRegistry.name(DMEClaimTransformerV2.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -56,14 +63,17 @@ final class DMEClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
* @param metricRegistry the metric registry
* @param drugCodeDisplayLookup the drug code display lookup
* @param npiOrgLookup the npi display lookup
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
DMEClaimTransformerV2(
MetricRegistry metricRegistry,
FdaDrugCodeDisplayLookup drugCodeDisplayLookup,
- NPIOrgLookup npiOrgLookup) {
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.drugCodeDisplayLookup = requireNonNull(drugCodeDisplayLookup);
this.npiOrgLookup = npiOrgLookup;
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -82,7 +92,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((DMEClaim) claim, includeTaxNumber);
+ DMEClaim dmeClaim = (DMEClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(
+ String.valueOf(dmeClaim.getClaimId()), DmeTag.class);
+ eob = transformClaim(dmeClaim, includeTaxNumber, securityTags);
}
return eob;
}
@@ -92,15 +106,19 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
*
* @param includeTaxNumbers whether to include tax numbers in the transformed EOB
* @param claimGroup the CCW {@link DMEClaim} to transform
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* DMEClaim}
*/
- private ExplanationOfBenefit transformClaim(DMEClaim claimGroup, boolean includeTaxNumbers) {
+ private ExplanationOfBenefit transformClaim(
+ DMEClaim claimGroup, boolean includeTaxNumbers, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Required values not directly mapped
eob.getMeta().addProfile(Profile.C4BB.getVersionedEobInpatientUrl());
+ eob.getMeta().setSecurity(securityTags);
+
// Common group level fields between all claim types
// Claim Type + Claim ID => ExplanationOfBenefit.id
// CLM_ID => ExplanationOfBenefit.identifier
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/HHAClaimTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/HHAClaimTransformerV2.java
index 42da112fad..4dcc0e74ff 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/HHAClaimTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/HHAClaimTransformerV2.java
@@ -9,17 +9,21 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.HHAClaim;
import gov.cms.bfd.model.rif.entities.HHAClaimLine;
+import gov.cms.bfd.model.rif.samhsa.HhaTag;
import gov.cms.bfd.server.war.commons.C4BBInstutionalClaimSubtypes;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
import gov.cms.bfd.server.war.commons.Profile;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.carin.C4BBClaimProfessionalAndNonClinicianCareTeamRole;
import gov.cms.bfd.server.war.commons.carin.C4BBOrganizationIdentifierType;
import gov.cms.bfd.server.war.commons.carin.C4BBPractitionerIdentifierType;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.ExplanationOfBenefit;
import org.hl7.fhir.r4.model.ExplanationOfBenefit.ItemComponent;
import org.hl7.fhir.r4.model.Quantity;
@@ -39,6 +43,9 @@ final class HHAClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
private static final String METRIC_NAME =
MetricRegistry.name(HHAClaimTransformerV2.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -48,10 +55,15 @@ final class HHAClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
*
* @param metricRegistry the metric registry
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
- public HHAClaimTransformerV2(MetricRegistry metricRegistry, NPIOrgLookup npiOrgLookup) {
+ public HHAClaimTransformerV2(
+ MetricRegistry metricRegistry,
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -69,7 +81,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((HHAClaim) claim);
+ HHAClaim hhaClaim = (HHAClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(
+ String.valueOf(hhaClaim.getClaimId()), HhaTag.class);
+ eob = transformClaim(hhaClaim, securityTags);
}
return eob;
}
@@ -78,14 +94,16 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link HHAClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link HHAClaim} to transform
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* HHAClaim}
*/
- private ExplanationOfBenefit transformClaim(HHAClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(HHAClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Required values not directly mapped
eob.getMeta().addProfile(Profile.C4BB.getVersionedEobNonclinicianUrl());
+ eob.getMeta().setSecurity(securityTags);
// Common group level fields between all claim types
// Claim Type + Claim ID => ExplanationOfBenefit.id
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/HospiceClaimTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/HospiceClaimTransformerV2.java
index e804570141..270da08de7 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/HospiceClaimTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/HospiceClaimTransformerV2.java
@@ -9,18 +9,22 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.HospiceClaim;
import gov.cms.bfd.model.rif.entities.HospiceClaimLine;
+import gov.cms.bfd.model.rif.samhsa.HospiceTag;
import gov.cms.bfd.server.war.commons.C4BBInstutionalClaimSubtypes;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
import gov.cms.bfd.server.war.commons.Profile;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.carin.C4BBAdjudication;
import gov.cms.bfd.server.war.commons.carin.C4BBClaimInstitutionalCareTeamRole;
import gov.cms.bfd.server.war.commons.carin.C4BBOrganizationIdentifierType;
import gov.cms.bfd.server.war.commons.carin.C4BBPractitionerIdentifierType;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.ExplanationOfBenefit;
import org.hl7.fhir.r4.model.ExplanationOfBenefit.ItemComponent;
import org.springframework.stereotype.Component;
@@ -41,6 +45,9 @@ final class HospiceClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
private static final String METRIC_NAME =
MetricRegistry.name(HospiceClaimTransformerV2.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -50,10 +57,15 @@ final class HospiceClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
*
* @param metricRegistry the metric registry
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
- public HospiceClaimTransformerV2(MetricRegistry metricRegistry, NPIOrgLookup npiOrgLookup) {
+ public HospiceClaimTransformerV2(
+ MetricRegistry metricRegistry,
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -71,7 +83,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((HospiceClaim) claim);
+ HospiceClaim hospiceClaim = (HospiceClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(
+ String.valueOf(hospiceClaim.getClaimId()), HospiceTag.class);
+ eob = transformClaim(hospiceClaim, securityTags);
}
return eob;
}
@@ -80,14 +96,16 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link HospiceClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link HospiceClaim} to transform
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* HospiceClaim}
*/
- private ExplanationOfBenefit transformClaim(HospiceClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(HospiceClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Required values not directly mapped
eob.getMeta().addProfile(Profile.C4BB.getVersionedEobInpatientUrl());
+ eob.getMeta().setSecurity(securityTags);
// Common group level fields between all claim types
// Claim Type + Claim ID => ExplanationOfBenefit.id
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/InpatientClaimTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/InpatientClaimTransformerV2.java
index e188bf36dd..ee27dd6294 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/InpatientClaimTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/InpatientClaimTransformerV2.java
@@ -9,17 +9,20 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.InpatientClaim;
import gov.cms.bfd.model.rif.entities.InpatientClaimLine;
+import gov.cms.bfd.model.rif.samhsa.InpatientTag;
import gov.cms.bfd.server.war.commons.C4BBInstutionalClaimSubtypes;
import gov.cms.bfd.server.war.commons.CCWUtils;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
import gov.cms.bfd.server.war.commons.Profile;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.TransformerConstants;
import gov.cms.bfd.server.war.commons.carin.C4BBClaimInstitutionalCareTeamRole;
import gov.cms.bfd.server.war.commons.carin.C4BBOrganizationIdentifierType;
import gov.cms.bfd.server.war.commons.carin.C4BBPractitionerIdentifierType;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Arrays;
+import java.util.List;
import java.util.Optional;
import org.hl7.fhir.r4.model.CodeableConcept;
import org.hl7.fhir.r4.model.Coding;
@@ -43,6 +46,9 @@ final class InpatientClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
private static final String METRIC_NAME =
MetricRegistry.name(InpatientClaimTransformerV2.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -52,10 +58,15 @@ final class InpatientClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
*
* @param metricRegistry the metric registry
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTag lookup
*/
- public InpatientClaimTransformerV2(MetricRegistry metricRegistry, NPIOrgLookup npiOrgLookup) {
+ public InpatientClaimTransformerV2(
+ MetricRegistry metricRegistry,
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -74,7 +85,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((InpatientClaim) claim);
+ InpatientClaim inpatientClaim = (InpatientClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(
+ String.valueOf(inpatientClaim.getClaimId()), InpatientTag.class);
+ eob = transformClaim(inpatientClaim, securityTags);
}
return eob;
}
@@ -83,14 +98,17 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link InpatientClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link InpatientClaim} to transform
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* InpatientClaim}
*/
- private ExplanationOfBenefit transformClaim(InpatientClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(
+ InpatientClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Required values not directly mapped
eob.getMeta().addProfile(Profile.C4BB.getVersionedEobInpatientUrl());
+ eob.getMeta().setSecurity(securityTags);
// Common group level fields between all claim types
// Claim Type + Claim ID => ExplanationOfBenefit.id
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/OutpatientClaimTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/OutpatientClaimTransformerV2.java
index db8b2a9303..b2dda26063 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/OutpatientClaimTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/OutpatientClaimTransformerV2.java
@@ -11,18 +11,22 @@
import gov.cms.bfd.model.rif.entities.InpatientClaim;
import gov.cms.bfd.model.rif.entities.OutpatientClaim;
import gov.cms.bfd.model.rif.entities.OutpatientClaimLine;
+import gov.cms.bfd.model.rif.samhsa.OutpatientTag;
import gov.cms.bfd.server.war.commons.C4BBInstutionalClaimSubtypes;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
import gov.cms.bfd.server.war.commons.Profile;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.carin.C4BBAdjudication;
import gov.cms.bfd.server.war.commons.carin.C4BBClaimInstitutionalCareTeamRole;
import gov.cms.bfd.server.war.commons.carin.C4BBOrganizationIdentifierType;
import gov.cms.bfd.server.war.commons.carin.C4BBPractitionerIdentifierType;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.ExplanationOfBenefit;
import org.hl7.fhir.r4.model.ExplanationOfBenefit.ItemComponent;
import org.springframework.stereotype.Component;
@@ -47,6 +51,9 @@ final class OutpatientClaimTransformerV2 implements ClaimTransformerInterfaceV2
private static final String METRIC_NAME =
MetricRegistry.name(OutpatientClaimTransformerV2.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -57,14 +64,17 @@ final class OutpatientClaimTransformerV2 implements ClaimTransformerInterfaceV2
* @param metricRegistry the metric registry
* @param drugCodeDisplayLookup the drug code display lookup
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
public OutpatientClaimTransformerV2(
MetricRegistry metricRegistry,
FdaDrugCodeDisplayLookup drugCodeDisplayLookup,
- NPIOrgLookup npiOrgLookup) {
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
this.drugCodeDisplayLookup = requireNonNull(drugCodeDisplayLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -83,7 +93,12 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((OutpatientClaim) claim);
+
+ OutpatientClaim outpatientClaim = (OutpatientClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(
+ String.valueOf(outpatientClaim.getClaimId()), OutpatientTag.class);
+ eob = transformClaim(outpatientClaim, securityTags);
}
return eob;
}
@@ -92,14 +107,17 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link InpatientClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link InpatientClaim} to transform
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* OutpatientClaim}
*/
- private ExplanationOfBenefit transformClaim(OutpatientClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(
+ OutpatientClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Required values not directly mapped
eob.getMeta().addProfile(Profile.C4BB.getVersionedEobOutpatientUrl());
+ eob.getMeta().setSecurity(securityTags);
// Common group level fields between all claim types
// Claim Type + Claim ID => ExplanationOfBenefit.id
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/SNFClaimTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/SNFClaimTransformerV2.java
index e15f9830a2..a101bfa111 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/SNFClaimTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/SNFClaimTransformerV2.java
@@ -10,19 +10,23 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.SNFClaim;
import gov.cms.bfd.model.rif.entities.SNFClaimLine;
+import gov.cms.bfd.model.rif.samhsa.SnfTag;
import gov.cms.bfd.server.war.commons.C4BBInstutionalClaimSubtypes;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.CommonTransformerUtils;
import gov.cms.bfd.server.war.commons.MedicareSegment;
import gov.cms.bfd.server.war.commons.Profile;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.carin.C4BBClaimInstitutionalCareTeamRole;
import gov.cms.bfd.server.war.commons.carin.C4BBOrganizationIdentifierType;
import gov.cms.bfd.server.war.commons.carin.C4BBPractitionerIdentifierType;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.math.BigDecimal;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.ExplanationOfBenefit;
import org.hl7.fhir.r4.model.ExplanationOfBenefit.ItemComponent;
import org.hl7.fhir.r4.model.Period;
@@ -42,6 +46,9 @@ public class SNFClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
private static final String METRIC_NAME =
MetricRegistry.name(SNFClaimTransformerV2.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -51,10 +58,15 @@ public class SNFClaimTransformerV2 implements ClaimTransformerInterfaceV2 {
*
* @param metricRegistry the metric registry
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
- public SNFClaimTransformerV2(MetricRegistry metricRegistry, NPIOrgLookup npiOrgLookup) {
+ public SNFClaimTransformerV2(
+ MetricRegistry metricRegistry,
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -73,7 +85,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((SNFClaim) claim);
+ SNFClaim snfClaim = (SNFClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(
+ String.valueOf(snfClaim.getClaimId()), SnfTag.class);
+ eob = transformClaim(snfClaim, securityTags);
}
return eob;
}
@@ -82,14 +98,16 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link SNFClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link SNFClaim} to transform
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* SNFClaim}
*/
- private ExplanationOfBenefit transformClaim(SNFClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(SNFClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Required values not directly mapped
eob.getMeta().addProfile(Profile.C4BB.getVersionedEobInpatientUrl());
+ eob.getMeta().setSecurity(securityTags);
// Common group level fields between all claim types
// Claim Type + Claim ID => ExplanationOfBenefit.id
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/FissClaimResponseTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/FissClaimResponseTransformerV2.java
index 8133343d6b..76f64a8581 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/FissClaimResponseTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/FissClaimResponseTransformerV2.java
@@ -7,7 +7,9 @@
import com.newrelic.api.agent.Trace;
import gov.cms.bfd.model.rda.entities.RdaFissClaim;
import gov.cms.bfd.model.rda.entities.RdaFissRevenueLine;
+import gov.cms.bfd.model.rda.samhsa.FissTag;
import gov.cms.bfd.server.war.commons.BBCodingSystems;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.carin.C4BBAdjudicationDiscriminator;
import gov.cms.bfd.server.war.r4.providers.pac.common.AbstractTransformerV2;
import gov.cms.bfd.server.war.r4.providers.pac.common.FissTransformerV2;
@@ -41,6 +43,9 @@ public class FissClaimResponseTransformerV2 extends AbstractTransformerV2
private static final String METRIC_NAME =
MetricRegistry.name(FissClaimResponseTransformerV2.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* The known FISS status codes and their associated {@link ClaimResponse.RemittanceOutcome}
* mappings.
@@ -67,10 +72,13 @@ public class FissClaimResponseTransformerV2 extends AbstractTransformerV2
* called by tests.
*
* @param metricRegistry the metric registry
+ * @param securityTagManager the security tag manager
*/
- public FissClaimResponseTransformerV2(MetricRegistry metricRegistry) {
+ public FissClaimResponseTransformerV2(
+ MetricRegistry metricRegistry, SecurityTagManager securityTagManager) {
requireNonNull(metricRegistry);
this.metricRegistry = metricRegistry;
+ this.securityTagManager = securityTagManager;
}
/**
@@ -87,7 +95,10 @@ public ClaimResponse transform(Object claimEntity, boolean includeTaxNumbers) {
}
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- return transformClaim((RdaFissClaim) claimEntity);
+ RdaFissClaim rdaFissClaim = (RdaFissClaim) claimEntity;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(rdaFissClaim.getClaimId(), FissTag.class);
+ return transformClaim(rdaFissClaim, securityTags);
}
}
@@ -95,10 +106,11 @@ public ClaimResponse transform(Object claimEntity, boolean includeTaxNumbers) {
* Transforms an {@link RdaFissClaim} to a FHIR {@link ClaimResponse}.
*
* @param claimGroup the {@link RdaFissClaim} to transform
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link ClaimResponse} resource that represents the specified {@link
* RdaFissClaim}
*/
- private ClaimResponse transformClaim(RdaFissClaim claimGroup) {
+ private ClaimResponse transformClaim(RdaFissClaim claimGroup, List securityTags) {
ClaimResponse claim = new ClaimResponse();
claim.setId("f-" + claimGroup.getClaimId());
@@ -114,7 +126,11 @@ private ClaimResponse transformClaim(RdaFissClaim claimGroup) {
claim.setRequest(new Reference(String.format("Claim/f-%s", claimGroup.getClaimId())));
claim.setItem(getClaimItems(claimGroup));
- claim.setMeta(new Meta().setLastUpdated(Date.from(claimGroup.getLastUpdated())));
+ // Add the Coding to the list
+ Meta meta =
+ new Meta().setSecurity(securityTags).setLastUpdated(Date.from(claimGroup.getLastUpdated()));
+
+ claim.setMeta(meta);
claim.setCreated(new Date());
return claim;
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/FissClaimTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/FissClaimTransformerV2.java
index ed25704d30..d4f0c56fda 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/FissClaimTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/FissClaimTransformerV2.java
@@ -11,9 +11,11 @@
import gov.cms.bfd.model.rda.entities.RdaFissPayer;
import gov.cms.bfd.model.rda.entities.RdaFissProcCode;
import gov.cms.bfd.model.rda.entities.RdaFissRevenueLine;
+import gov.cms.bfd.model.rda.samhsa.FissTag;
import gov.cms.bfd.server.war.commons.BBCodingSystems;
import gov.cms.bfd.server.war.commons.CCWUtils;
import gov.cms.bfd.server.war.commons.IcdCode;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.TransformerConstants;
import gov.cms.bfd.server.war.commons.carin.C4BBOrganizationIdentifierType;
import gov.cms.bfd.server.war.commons.carin.C4BBSupportingInfoType;
@@ -62,6 +64,9 @@ public class FissClaimTransformerV2 extends AbstractTransformerV2
/** The Metric registry. */
private final MetricRegistry metricRegistry;
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/** The METRIC_NAME constant. */
private static final String METRIC_NAME =
MetricRegistry.name(FissClaimTransformerV2.class.getSimpleName(), "transform");
@@ -74,9 +79,12 @@ public class FissClaimTransformerV2 extends AbstractTransformerV2
* called by tests.
*
* @param metricRegistry the metric registry
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
- public FissClaimTransformerV2(MetricRegistry metricRegistry) {
+ public FissClaimTransformerV2(
+ MetricRegistry metricRegistry, SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -93,7 +101,10 @@ public Claim transform(Object claimEntity, boolean includeTaxNumbers) {
}
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- return transformClaim((RdaFissClaim) claimEntity, includeTaxNumbers);
+ RdaFissClaim rdaFissClaim = (RdaFissClaim) claimEntity;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(rdaFissClaim.getClaimId(), FissTag.class);
+ return transformClaim(rdaFissClaim, includeTaxNumbers, securityTags);
}
}
@@ -102,9 +113,11 @@ public Claim transform(Object claimEntity, boolean includeTaxNumbers) {
*
* @param claimGroup the {@link RdaFissClaim} to transform
* @param includeTaxNumbers Indicates if tax numbers should be included in the results
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link Claim} resource that represents the specified {@link RdaFissClaim}
*/
- private Claim transformClaim(RdaFissClaim claimGroup, boolean includeTaxNumbers) {
+ private Claim transformClaim(
+ RdaFissClaim claimGroup, boolean includeTaxNumbers, List securityTags) {
Claim claim = new Claim();
boolean isIcd9 =
@@ -135,7 +148,9 @@ private Claim transformClaim(RdaFissClaim claimGroup, boolean includeTaxNumbers)
claim.setInsurance(getInsurance(claimGroup));
claim.setItem(getClaimItems(claimGroup));
- claim.setMeta(new Meta().setLastUpdated(Date.from(claimGroup.getLastUpdated())));
+ Meta meta =
+ new Meta().setSecurity(securityTags).setLastUpdated(Date.from(claimGroup.getLastUpdated()));
+ claim.setMeta(meta);
claim.setCreated(new Date());
return claim;
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/McsClaimResponseTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/McsClaimResponseTransformerV2.java
index f952c18494..69dfffd695 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/McsClaimResponseTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/McsClaimResponseTransformerV2.java
@@ -5,7 +5,9 @@
import com.google.common.base.Strings;
import com.newrelic.api.agent.Trace;
import gov.cms.bfd.model.rda.entities.RdaMcsClaim;
+import gov.cms.bfd.model.rda.samhsa.McsTag;
import gov.cms.bfd.server.war.commons.BBCodingSystems;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.r4.providers.pac.common.AbstractTransformerV2;
import gov.cms.bfd.server.war.r4.providers.pac.common.McsTransformerV2;
import gov.cms.bfd.server.war.r4.providers.pac.common.ResourceTransformer;
@@ -16,6 +18,7 @@
import java.util.Map;
import org.hl7.fhir.r4.model.Claim;
import org.hl7.fhir.r4.model.ClaimResponse;
+import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.Extension;
import org.hl7.fhir.r4.model.Identifier;
import org.hl7.fhir.r4.model.Meta;
@@ -35,6 +38,9 @@ public class McsClaimResponseTransformerV2 extends AbstractTransformerV2
private static final String METRIC_NAME =
MetricRegistry.name(McsClaimResponseTransformerV2.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* There are only 2 statuses currently being used, and only the ones listed below are mapped to
* "CANCELLED". For brevity, the rest are defaulted to "ACTIVE" using {@link
@@ -82,9 +88,12 @@ public class McsClaimResponseTransformerV2 extends AbstractTransformerV2
* Instantiates a new Mcs claim response transformer v2. @param metricRegistry the metric registry
*
* @param metricRegistry the metric registry
+ * @param securityTagManager the security tag manager
*/
- public McsClaimResponseTransformerV2(MetricRegistry metricRegistry) {
+ public McsClaimResponseTransformerV2(
+ MetricRegistry metricRegistry, SecurityTagManager securityTagManager) {
this.metricRegistry = metricRegistry;
+ this.securityTagManager = securityTagManager;
}
/**
@@ -101,7 +110,10 @@ public ClaimResponse transform(Object claimEntity, boolean includeTaxNumbers) {
}
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- return transformClaim((RdaMcsClaim) claimEntity);
+ RdaMcsClaim rdaMcsClaim = (RdaMcsClaim) claimEntity;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(rdaMcsClaim.getIdrClmHdIcn(), McsTag.class);
+ return transformClaim(rdaMcsClaim, securityTags);
}
}
@@ -109,9 +121,10 @@ public ClaimResponse transform(Object claimEntity, boolean includeTaxNumbers) {
* Transforms a {@link RdaMcsClaim} into a FHIR {@link Claim}.
*
* @param claimGroup the {@link RdaMcsClaim} to transform
+ * @param securityTags securityTags of the claim
* @return a FHIR {@link ClaimResponse} resource that represents the specified {@link RdaMcsClaim}
*/
- private ClaimResponse transformClaim(RdaMcsClaim claimGroup) {
+ private ClaimResponse transformClaim(RdaMcsClaim claimGroup, List securityTags) {
ClaimResponse claim = new ClaimResponse();
claim.setId("m-" + claimGroup.getIdrClmHdIcn());
@@ -128,7 +141,9 @@ private ClaimResponse transformClaim(RdaMcsClaim claimGroup) {
claim.setPatient(new Reference("#patient"));
claim.setRequest(new Reference(String.format("Claim/m-%s", claimGroup.getIdrClmHdIcn())));
- claim.setMeta(new Meta().setLastUpdated(Date.from(claimGroup.getLastUpdated())));
+ Meta meta =
+ new Meta().setSecurity(securityTags).setLastUpdated(Date.from(claimGroup.getLastUpdated()));
+ claim.setMeta(meta);
claim.setCreated(new Date());
return claim;
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/McsClaimTransformerV2.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/McsClaimTransformerV2.java
index 3a42d2cef3..4ac1b9b8d2 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/McsClaimTransformerV2.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/pac/McsClaimTransformerV2.java
@@ -1,13 +1,17 @@
package gov.cms.bfd.server.war.r4.providers.pac;
+import static java.util.Objects.requireNonNull;
+
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import com.newrelic.api.agent.Trace;
import gov.cms.bfd.model.rda.entities.RdaMcsClaim;
import gov.cms.bfd.model.rda.entities.RdaMcsDetail;
import gov.cms.bfd.model.rda.entities.RdaMcsDiagnosisCode;
+import gov.cms.bfd.model.rda.samhsa.McsTag;
import gov.cms.bfd.server.war.commons.BBCodingSystems;
import gov.cms.bfd.server.war.commons.IcdCode;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.TransformerConstants;
import gov.cms.bfd.server.war.r4.providers.pac.common.AbstractTransformerV2;
import gov.cms.bfd.server.war.r4.providers.pac.common.McsTransformerV2;
@@ -44,6 +48,9 @@
public class McsClaimTransformerV2 extends AbstractTransformerV2
implements ResourceTransformer {
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/** The metric name. */
private static final String METRIC_NAME =
MetricRegistry.name(McsClaimResponseTransformerV2.class.getSimpleName(), "transform");
@@ -72,9 +79,12 @@ public class McsClaimTransformerV2 extends AbstractTransformerV2
* called by tests.
*
* @param metricRegistry the metric registry
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
- public McsClaimTransformerV2(MetricRegistry metricRegistry) {
+ public McsClaimTransformerV2(
+ MetricRegistry metricRegistry, SecurityTagManager securityTagManager) {
this.metricRegistry = metricRegistry;
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -92,7 +102,10 @@ public Claim transform(Object claimEntity, boolean includeTaxNumbers) {
}
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- return transformClaim((RdaMcsClaim) claimEntity, includeTaxNumbers);
+ RdaMcsClaim claim = (RdaMcsClaim) claimEntity;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevel(claim.getIdrClmHdIcn(), McsTag.class);
+ return transformClaim(claim, includeTaxNumbers, securityTags);
}
}
@@ -101,9 +114,11 @@ public Claim transform(Object claimEntity, boolean includeTaxNumbers) {
*
* @param claimGroup the {@link RdaMcsClaim} to transform
* @param includeTaxNumbers Indicates if tax numbers should be included in the results
+ * @param securityTags securityTags tag of a claim
* @return a FHIR {@link Claim} resource that represents the specified {@link RdaMcsClaim}
*/
- private Claim transformClaim(RdaMcsClaim claimGroup, boolean includeTaxNumbers) {
+ private Claim transformClaim(
+ RdaMcsClaim claimGroup, boolean includeTaxNumbers, List securityTags) {
Claim claim = new Claim();
claim.setId("m-" + claimGroup.getIdrClmHdIcn());
@@ -129,8 +144,10 @@ private Claim transformClaim(RdaMcsClaim claimGroup, boolean includeTaxNumbers)
claim.setItem(getItems(claimGroup));
claim.setCreated(new Date());
- claim.setMeta(new Meta().setLastUpdated(Date.from(claimGroup.getLastUpdated())));
+ Meta meta =
+ new Meta().setSecurity(securityTags).setLastUpdated(Date.from(claimGroup.getLastUpdated()));
+ claim.setMeta(meta);
return claim;
}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/CarrierClaimTransformer.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/CarrierClaimTransformer.java
index b9ab773ff8..b7446323b2 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/CarrierClaimTransformer.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/CarrierClaimTransformer.java
@@ -11,15 +11,19 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.CarrierClaim;
import gov.cms.bfd.model.rif.entities.CarrierClaimLine;
+import gov.cms.bfd.model.rif.samhsa.CarrierTag;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.IdentifierType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.TransformerConstants;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.math.BigDecimal;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.hl7.fhir.dstu3.model.Coding;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit.ItemComponent;
import org.hl7.fhir.dstu3.model.codesystems.ClaimCareteamrole;
@@ -42,6 +46,9 @@ final class CarrierClaimTransformer implements ClaimTransformerInterface {
private static final String METRIC_NAME =
MetricRegistry.name(CarrierClaimTransformer.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -52,14 +59,17 @@ final class CarrierClaimTransformer implements ClaimTransformerInterface {
* @param metricRegistry the metric registry
* @param drugCodeDisplayLookup the drug code display lookup
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
public CarrierClaimTransformer(
MetricRegistry metricRegistry,
FdaDrugCodeDisplayLookup drugCodeDisplayLookup,
- NPIOrgLookup npiOrgLookup) {
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
this.drugCodeDisplayLookup = requireNonNull(drugCodeDisplayLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -77,7 +87,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((CarrierClaim) claim, includeTaxNumber);
+ CarrierClaim carrierClaim = (CarrierClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevelDstu3(
+ String.valueOf(carrierClaim.getClaimId()), CarrierTag.class);
+ eob = transformClaim(carrierClaim, includeTaxNumber, securityTags);
}
return eob;
}
@@ -87,10 +101,12 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
*
* @param claimGroup the CCW {@link CarrierClaim} to transform
* @param includeTaxNumbers whether to include tax numbers in the response
+ * @param securityTags securityTags of a claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* CarrierClaim}
*/
- private ExplanationOfBenefit transformClaim(CarrierClaim claimGroup, boolean includeTaxNumbers) {
+ private ExplanationOfBenefit transformClaim(
+ CarrierClaim claimGroup, boolean includeTaxNumbers, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Common group level fields between all claim types
@@ -314,6 +330,8 @@ private ExplanationOfBenefit transformClaim(CarrierClaim claimGroup, boolean inc
}
TransformerUtils.setLastUpdated(eob, claimGroup.getLastUpdated());
+
+ eob.getMeta().setSecurity(securityTags);
return eob;
}
}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/DMEClaimTransformer.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/DMEClaimTransformer.java
index 6a73b9d83d..e2c6447002 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/DMEClaimTransformer.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/DMEClaimTransformer.java
@@ -9,14 +9,18 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.DMEClaim;
import gov.cms.bfd.model.rif.entities.DMEClaimLine;
+import gov.cms.bfd.model.rif.samhsa.DmeTag;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.IdentifierType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.server.war.commons.TransformerConstants;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.hl7.fhir.dstu3.model.Coding;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit.ItemComponent;
import org.hl7.fhir.dstu3.model.Extension;
@@ -38,6 +42,9 @@ final class DMEClaimTransformer implements ClaimTransformerInterface {
private static final String METRIC_NAME =
MetricRegistry.name(DMEClaimTransformer.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -47,11 +54,15 @@ final class DMEClaimTransformer implements ClaimTransformerInterface {
*
* @param metricRegistry the metric registry
* @param drugCodeDisplayLookup the drug code display lookup
+ * @param securityTagManager SamhsaSecurityTag lookup
*/
public DMEClaimTransformer(
- MetricRegistry metricRegistry, FdaDrugCodeDisplayLookup drugCodeDisplayLookup) {
+ MetricRegistry metricRegistry,
+ FdaDrugCodeDisplayLookup drugCodeDisplayLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.drugCodeDisplayLookup = requireNonNull(drugCodeDisplayLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -69,7 +80,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((DMEClaim) claim, includeTaxNumber);
+ DMEClaim dmeClaim = (DMEClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevelDstu3(
+ String.valueOf(dmeClaim.getClaimId()), DmeTag.class);
+ eob = transformClaim(dmeClaim, includeTaxNumber, securityTags);
}
return eob;
}
@@ -79,10 +94,12 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
*
* @param claimGroup the {@link DMEClaim} to use
* @param includeTaxNumbers whether to include tax numbers in the transformed EOB
+ * @param securityTags securityTags of a claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* DMEClaim}
*/
- private ExplanationOfBenefit transformClaim(DMEClaim claimGroup, boolean includeTaxNumbers) {
+ private ExplanationOfBenefit transformClaim(
+ DMEClaim claimGroup, boolean includeTaxNumbers, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Common group level fields between all claim types
@@ -303,6 +320,9 @@ private ExplanationOfBenefit transformClaim(DMEClaim claimGroup, boolean include
}
}
TransformerUtils.setLastUpdated(eob, claimGroup.getLastUpdated());
+
+ eob.getMeta().setSecurity(securityTags);
+
return eob;
}
}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/HHAClaimTransformer.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/HHAClaimTransformer.java
index 45b16c161a..b8dbe48c19 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/HHAClaimTransformer.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/HHAClaimTransformer.java
@@ -10,13 +10,17 @@
import gov.cms.bfd.model.rif.entities.HHAClaim;
import gov.cms.bfd.model.rif.entities.HHAClaimLine;
import gov.cms.bfd.model.rif.entities.OutpatientClaim;
+import gov.cms.bfd.model.rif.samhsa.HhaTag;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.hl7.fhir.dstu3.model.Address;
+import org.hl7.fhir.dstu3.model.Coding;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit.BenefitComponent;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit.ItemComponent;
@@ -37,6 +41,9 @@ final class HHAClaimTransformer implements ClaimTransformerInterface {
private static final String METRIC_NAME =
MetricRegistry.name(HHAClaimTransformer.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -46,10 +53,15 @@ final class HHAClaimTransformer implements ClaimTransformerInterface {
*
* @param metricRegistry the metric registry
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTags lookup
*/
- public HHAClaimTransformer(MetricRegistry metricRegistry, NPIOrgLookup npiOrgLookup) {
+ public HHAClaimTransformer(
+ MetricRegistry metricRegistry,
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -67,7 +79,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((HHAClaim) claim);
+ HHAClaim hhaClaim = (HHAClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevelDstu3(
+ String.valueOf(hhaClaim.getClaimId()), HhaTag.class);
+ eob = transformClaim(hhaClaim, securityTags);
}
return eob;
}
@@ -76,10 +92,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link HHAClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link HHAClaim} to transform
+ * @param securityTags securityTags tag of a claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* HHAClaim}
*/
- private ExplanationOfBenefit transformClaim(HHAClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(HHAClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Common group level fields between all claim types
@@ -197,6 +214,8 @@ private ExplanationOfBenefit transformClaim(HHAClaim claimGroup) {
}
TransformerUtils.setLastUpdated(eob, claimGroup.getLastUpdated());
+
+ eob.getMeta().setSecurity(securityTags);
return eob;
}
}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/HospiceClaimTransformer.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/HospiceClaimTransformer.java
index 529ea9e2ed..eaed315a0d 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/HospiceClaimTransformer.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/HospiceClaimTransformer.java
@@ -9,13 +9,17 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.HospiceClaim;
import gov.cms.bfd.model.rif.entities.HospiceClaimLine;
+import gov.cms.bfd.model.rif.samhsa.HospiceTag;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.hl7.fhir.dstu3.model.Address;
+import org.hl7.fhir.dstu3.model.Coding;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit.ItemComponent;
import org.springframework.stereotype.Component;
@@ -35,6 +39,9 @@ final class HospiceClaimTransformer implements ClaimTransformerInterface {
private static final String METRIC_NAME =
MetricRegistry.name(HospiceClaimTransformer.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -44,10 +51,15 @@ final class HospiceClaimTransformer implements ClaimTransformerInterface {
*
* @param metricRegistry the metric registry
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager securityTagManager
*/
- public HospiceClaimTransformer(MetricRegistry metricRegistry, NPIOrgLookup npiOrgLookup) {
+ public HospiceClaimTransformer(
+ MetricRegistry metricRegistry,
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -65,7 +77,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((HospiceClaim) claim);
+ HospiceClaim hospiceClaim = (HospiceClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevelDstu3(
+ String.valueOf(hospiceClaim.getClaimId()), HospiceTag.class);
+ eob = transformClaim(hospiceClaim, securityTags);
}
return eob;
}
@@ -74,10 +90,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link HospiceClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link HospiceClaim} to transform
+ * @param securityTags securityTags tag of a claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* HospiceClaim}
*/
- private ExplanationOfBenefit transformClaim(HospiceClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(HospiceClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Common group level fields between all claim types
@@ -197,6 +214,9 @@ private ExplanationOfBenefit transformClaim(HospiceClaim claimGroup) {
eob, item, claimLine.getDeductibleCoinsuranceCd());
}
TransformerUtils.setLastUpdated(eob, claimGroup.getLastUpdated());
+
+ eob.getMeta().setSecurity(securityTags);
+
return eob;
}
}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/InpatientClaimTransformer.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/InpatientClaimTransformer.java
index 9a64b9a99f..6f8dbfd190 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/InpatientClaimTransformer.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/InpatientClaimTransformer.java
@@ -9,12 +9,16 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.InpatientClaim;
import gov.cms.bfd.model.rif.entities.InpatientClaimLine;
+import gov.cms.bfd.model.rif.samhsa.InpatientTag;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Collections;
+import java.util.List;
import java.util.Optional;
import org.hl7.fhir.dstu3.model.Address;
+import org.hl7.fhir.dstu3.model.Coding;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit.ItemComponent;
import org.springframework.stereotype.Component;
@@ -34,6 +38,9 @@ final class InpatientClaimTransformer implements ClaimTransformerInterface {
private static final String METRIC_NAME =
MetricRegistry.name(InpatientClaimTransformer.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -43,10 +50,15 @@ final class InpatientClaimTransformer implements ClaimTransformerInterface {
*
* @param metricRegistry the metric registry
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTag lookup
*/
- public InpatientClaimTransformer(MetricRegistry metricRegistry, NPIOrgLookup npiOrgLookup) {
+ public InpatientClaimTransformer(
+ MetricRegistry metricRegistry,
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -64,7 +76,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((InpatientClaim) claim);
+ InpatientClaim inpatientClaim = (InpatientClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevelDstu3(
+ String.valueOf(inpatientClaim.getClaimId()), InpatientTag.class);
+ eob = transformClaim(inpatientClaim, securityTags);
}
return eob;
}
@@ -73,10 +89,12 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link InpatientClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link InpatientClaim} to transform
+ * @param securityTags securityTags tag of a claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* InpatientClaim}
*/
- private ExplanationOfBenefit transformClaim(InpatientClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(
+ InpatientClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Common group level fields between all claim types
@@ -277,6 +295,9 @@ private ExplanationOfBenefit transformClaim(InpatientClaim claimGroup) {
eob, item, claimLine.getDeductibleCoinsuranceCd());
}
TransformerUtils.setLastUpdated(eob, claimGroup.getLastUpdated());
+
+ eob.getMeta().setSecurity(securityTags);
+
return eob;
}
}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/OutpatientClaimTransformer.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/OutpatientClaimTransformer.java
index e1b87c354c..aa994e9597 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/OutpatientClaimTransformer.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/OutpatientClaimTransformer.java
@@ -10,13 +10,17 @@
import gov.cms.bfd.model.rif.entities.InpatientClaim;
import gov.cms.bfd.model.rif.entities.OutpatientClaim;
import gov.cms.bfd.model.rif.entities.OutpatientClaimLine;
+import gov.cms.bfd.model.rif.samhsa.OutpatientTag;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.MedicareSegment;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.hl7.fhir.dstu3.model.Address;
+import org.hl7.fhir.dstu3.model.Coding;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit.ItemComponent;
import org.springframework.stereotype.Component;
@@ -38,6 +42,9 @@ final class OutpatientClaimTransformer implements ClaimTransformerInterface {
private static final String METRIC_NAME =
MetricRegistry.name(OutpatientClaimTransformer.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -47,10 +54,15 @@ final class OutpatientClaimTransformer implements ClaimTransformerInterface {
*
* @param metricRegistry the metric registry
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTag lookup
*/
- public OutpatientClaimTransformer(MetricRegistry metricRegistry, NPIOrgLookup npiOrgLookup) {
+ public OutpatientClaimTransformer(
+ MetricRegistry metricRegistry,
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -68,7 +80,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((OutpatientClaim) claim);
+ OutpatientClaim outpatientClaim = (OutpatientClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevelDstu3(
+ String.valueOf(outpatientClaim.getClaimId()), OutpatientTag.class);
+ eob = transformClaim(outpatientClaim, securityTags);
}
return eob;
}
@@ -77,10 +93,12 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link InpatientClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link OutpatientClaim} to transform
+ * @param securityTags securityTags tag of a claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* OutpatientClaim}
*/
- private ExplanationOfBenefit transformClaim(OutpatientClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(
+ OutpatientClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Common group level fields between all claim types
@@ -316,6 +334,8 @@ private ExplanationOfBenefit transformClaim(OutpatientClaim claimGroup) {
}
}
TransformerUtils.setLastUpdated(eob, claimGroup.getLastUpdated());
+
+ eob.getMeta().setSecurity(securityTags);
return eob;
}
}
diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/SNFClaimTransformer.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/SNFClaimTransformer.java
index 58cd9e2011..bba46f3e04 100644
--- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/SNFClaimTransformer.java
+++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/SNFClaimTransformer.java
@@ -10,15 +10,19 @@
import gov.cms.bfd.model.codebook.data.CcwCodebookVariable;
import gov.cms.bfd.model.rif.entities.SNFClaim;
import gov.cms.bfd.model.rif.entities.SNFClaimLine;
+import gov.cms.bfd.model.rif.samhsa.SnfTag;
import gov.cms.bfd.server.war.commons.ClaimType;
import gov.cms.bfd.server.war.commons.CommonTransformerUtils;
import gov.cms.bfd.server.war.commons.MedicareSegment;
+import gov.cms.bfd.server.war.commons.SecurityTagManager;
import gov.cms.bfd.sharedutils.exceptions.BadCodeMonkeyException;
import java.math.BigDecimal;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.hl7.fhir.dstu3.model.Address;
+import org.hl7.fhir.dstu3.model.Coding;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit.ItemComponent;
import org.hl7.fhir.dstu3.model.ExplanationOfBenefit.SupportingInformationComponent;
@@ -39,6 +43,9 @@ public class SNFClaimTransformer implements ClaimTransformerInterface {
private static final String METRIC_NAME =
MetricRegistry.name(SNFClaimTransformer.class.getSimpleName(), "transform");
+ /** The securityTagManager. */
+ private final SecurityTagManager securityTagManager;
+
/**
* Instantiates a new transformer.
*
@@ -48,10 +55,15 @@ public class SNFClaimTransformer implements ClaimTransformerInterface {
*
* @param metricRegistry the metric registry
* @param npiOrgLookup the npi org lookup
+ * @param securityTagManager SamhsaSecurityTag lookup
*/
- public SNFClaimTransformer(MetricRegistry metricRegistry, NPIOrgLookup npiOrgLookup) {
+ public SNFClaimTransformer(
+ MetricRegistry metricRegistry,
+ NPIOrgLookup npiOrgLookup,
+ SecurityTagManager securityTagManager) {
this.metricRegistry = requireNonNull(metricRegistry);
this.npiOrgLookup = requireNonNull(npiOrgLookup);
+ this.securityTagManager = requireNonNull(securityTagManager);
}
/**
@@ -69,7 +81,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
}
ExplanationOfBenefit eob;
try (Timer.Context ignored = metricRegistry.timer(METRIC_NAME).time()) {
- eob = transformClaim((SNFClaim) claim);
+ SNFClaim snfClaim = (SNFClaim) claim;
+ List securityTags =
+ securityTagManager.getClaimSecurityLevelDstu3(
+ String.valueOf(snfClaim.getClaimId()), SnfTag.class);
+ eob = transformClaim(snfClaim, securityTags);
}
return eob;
}
@@ -78,10 +94,11 @@ public ExplanationOfBenefit transform(Object claim, boolean includeTaxNumber) {
* Transforms a specified {@link SNFClaim} into a FHIR {@link ExplanationOfBenefit}.
*
* @param claimGroup the CCW {@link SNFClaim} to transform
+ * @param securityTags securityTags tag of a claim
* @return a FHIR {@link ExplanationOfBenefit} resource that represents the specified {@link
* SNFClaim}
*/
- private ExplanationOfBenefit transformClaim(SNFClaim claimGroup) {
+ private ExplanationOfBenefit transformClaim(SNFClaim claimGroup, List securityTags) {
ExplanationOfBenefit eob = new ExplanationOfBenefit();
// Common group level fields between all claim types
@@ -239,6 +256,8 @@ private ExplanationOfBenefit transformClaim(SNFClaim claimGroup) {
eob, item, claimLine.getDeductibleCoinsuranceCd());
}
TransformerUtils.setLastUpdated(eob, claimGroup.getLastUpdated());
+
+ eob.getMeta().setSecurity(securityTags);
return eob;
}
}
diff --git a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/EndpointJsonComparatorBase.java b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/EndpointJsonComparatorBase.java
index 79a998754a..6e511f9e01 100644
--- a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/EndpointJsonComparatorBase.java
+++ b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/EndpointJsonComparatorBase.java
@@ -11,6 +11,7 @@
import gov.cms.bfd.model.rif.samples.StaticRifResourceGroup;
import io.restassured.http.Header;
import io.restassured.http.Headers;
+import io.restassured.specification.RequestSpecification;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Path;
@@ -78,16 +79,34 @@ protected static String getJsonResponseFor(String requestString) {
requestString, new Headers(new Header("Content-Type", "application/json+fhir")));
}
+ /**
+ * Gets the json response for the specified endpoint request string and default content type json
+ * header.
+ *
+ * @param requestString the request string
+ * @param requestSpec the request Spec
+ * @return the json response for
+ */
+ protected static String getJsonResponseFor(
+ String requestString, RequestSpecification requestSpec) {
+ return getJsonResponseFor(
+ requestString,
+ new Headers(new Header("Content-Type", "application/json+fhir")),
+ requestSpec);
+ }
+
/**
* Gets the json response for the specified endpoint request string and specified headers.
*
* @param requestString the request string
* @param headers the headers for the request
+ * @param requestSpec the request Specification
* @return the json response for
*/
- protected static String getJsonResponseFor(String requestString, Headers headers) {
+ protected static String getJsonResponseFor(
+ String requestString, Headers headers, RequestSpecification requestSpec) {
return given()
- .spec(requestAuth)
+ .spec(requestSpec)
.headers(headers)
.expect()
.log()
@@ -101,6 +120,17 @@ protected static String getJsonResponseFor(String requestString, Headers headers
.asString();
}
+ /**
+ * Gets the json response for the specified endpoint request string and specified headers.
+ *
+ * @param requestString the request string
+ * @param headers the headers for the request
+ * @return the json response for
+ */
+ protected static String getJsonResponseFor(String requestString, Headers headers) {
+ return getJsonResponseFor(requestString, headers, requestAuth);
+ }
+
/**
* Gets the expected json response directory. These are generated as a point in time comparison
* when we know the responses are in a good state so that the json response tests can regression
@@ -207,6 +237,16 @@ protected static Beneficiary getSampleABene() {
return ServerTestUtils.get().getFirstBeneficiary(loadedRecords);
}
+ /**
+ * Gets the first sample A beneficiary.
+ *
+ * @return the first sample A beneficiary
+ */
+ protected static Beneficiary getSampleABeneSamhsa() {
+ List