diff --git a/src/main/java/org/openelisglobal/common/provider/query/LabOrderSearchProvider.java b/src/main/java/org/openelisglobal/common/provider/query/LabOrderSearchProvider.java index 31097a167..305a2612f 100644 --- a/src/main/java/org/openelisglobal/common/provider/query/LabOrderSearchProvider.java +++ b/src/main/java/org/openelisglobal/common/provider/query/LabOrderSearchProvider.java @@ -231,12 +231,12 @@ public void processRequest(HttpServletRequest request, HttpServletResponse respo } } - if (!GenericValidator.isBlankOrNull(serviceRequest.getRequester().getReferenceElement().getIdPart()) - && serviceRequest.getRequester().getReference().contains(ResourceType.Practitioner.toString())) { + if (!GenericValidator.isBlankOrNull(task.getOwner().getReferenceElement().getIdPart()) + && task.getOwner().getReference().contains(ResourceType.Practitioner.toString())) { try { requesterPerson = localFhirClient.read() // .resource(Practitioner.class) // - .withId(serviceRequest.getRequester().getReferenceElement().getIdPart()) // + .withId(task.getOwner().getReferenceElement().getIdPart()) // .execute(); LogEvent.logDebug(this.getClass().getSimpleName(), "processRequest", "found matching requester " + requesterPerson.getIdElement().getIdPart()); @@ -245,6 +245,24 @@ public void processRequest(HttpServletRequest request, HttpServletResponse respo } } + if (requesterPerson == null) { + if (!GenericValidator.isBlankOrNull(serviceRequest.getRequester().getReferenceElement().getIdPart()) + && serviceRequest.getRequester().getReference() + .contains(ResourceType.Practitioner.toString())) { + try { + requesterPerson = localFhirClient.read() // + .resource(Practitioner.class) // + .withId(serviceRequest.getRequester().getReferenceElement().getIdPart()) // + .execute(); + LogEvent.logDebug(this.getClass().getSimpleName(), "processRequest", + "found matching requester " + requesterPerson.getIdElement().getIdPart()); + } catch (ResourceNotFoundException e) { + LogEvent.logWarn(this.getClass().getSimpleName(), "processRequest", "no matching requester"); + } + } + + } + if (specimen != null && !GenericValidator .isBlankOrNull(specimen.getCollection().getCollector().getReferenceElement().getIdPart())) { try { @@ -389,6 +407,14 @@ private void addRequester(StringBuilder xml) { } requesterValuesMap.put(PROVIDER_LAST_NAME, requesterPerson.getNameFirstRep().getFamily()); requesterValuesMap.put(PROVIDER_FIRST_NAME, requesterPerson.getNameFirstRep().getGivenAsSingleString()); + } else { + Provider provider = providerService + .getProviderByFhirId(UUID.fromString(task.getOwner().getReferenceElement().getIdPart())); + if (provider != null) { + requesterValuesMap.put(PROVIDER_ID, provider.getId()); + requesterValuesMap.put(PROVIDER_PERSON_ID, provider.getPerson().getId()); + } + } xml.append(""); XMLUtil.appendKeyValue(PROVIDER_ID, requesterValuesMap.get(PROVIDER_ID), xml); diff --git a/src/main/java/org/openelisglobal/dataexchange/fhir/FhirConfig.java b/src/main/java/org/openelisglobal/dataexchange/fhir/FhirConfig.java index d556ab1ac..ab71aef34 100644 --- a/src/main/java/org/openelisglobal/dataexchange/fhir/FhirConfig.java +++ b/src/main/java/org/openelisglobal/dataexchange/fhir/FhirConfig.java @@ -4,8 +4,19 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.rest.client.apache.ApacheRestfulClientFactory; +import ca.uhn.fhir.rest.client.api.IClientInterceptor; +import ca.uhn.fhir.rest.client.api.IGenericClient; import ca.uhn.fhir.rest.client.api.IRestfulClientFactory; +import ca.uhn.fhir.rest.client.interceptor.BasicAuthInterceptor; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.validator.GenericValidator; import org.apache.http.impl.client.CloseableHttpClient; +import org.hl7.fhir.instance.model.api.IBaseBundle; +import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent; +import org.hl7.fhir.r4.model.Practitioner; +import org.hl7.fhir.r4.model.ResourceType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,6 +40,9 @@ public class FhirConfig { @Value("${org.openelisglobal.fhirstore.password:}") private String password; + @Value("${org.openelisglobal.remote.source.identifier:}#{T(java.util.Collections).emptyList()}") + private List remoteStoreIdentifier; + @Autowired CloseableHttpClient httpClient; @@ -65,4 +79,40 @@ public String getPassword() { public String[] getRemoteStorePaths() { return remoteStorePaths; } + + public List getRemoteStoreIdentifier() { + if (remoteStoreIdentifier.get(0).equals(ResourceType.Practitioner + "/*")) { + remoteStoreIdentifier = new ArrayList<>(); + for (String remoteStorePath : getRemoteStorePaths()) { + IGenericClient fhirClient = fhirContext().newRestfulGenericClient(remoteStorePath); + if (!GenericValidator.isBlankOrNull(getUsername()) + && !getLocalFhirStorePath().equals(remoteStorePath)) { + IClientInterceptor authInterceptor = new BasicAuthInterceptor(getUsername(), getPassword()); + fhirClient.registerInterceptor(authInterceptor); + } + List allBundles = new ArrayList<>(); + Bundle practitionerBundle = fhirClient.search().forResource(Practitioner.class) + .returnBundle(Bundle.class).execute(); + allBundles.add(practitionerBundle); + + while (practitionerBundle.getLink(IBaseBundle.LINK_NEXT) != null) { + practitionerBundle = fhirClient.loadPage().next(practitionerBundle).execute(); + allBundles.add(practitionerBundle); + } + + for (Bundle bundle : allBundles) { + for (BundleEntryComponent bundleComponent : bundle.getEntry()) { + if (bundleComponent.hasResource() + && ResourceType.Practitioner.equals(bundleComponent.getResource().getResourceType())) { + + remoteStoreIdentifier.add(ResourceType.Practitioner + "/" + + bundleComponent.getResource().getIdElement().getIdPart()); + } + } + } + } + } + return remoteStoreIdentifier; + } + } diff --git a/src/main/java/org/openelisglobal/dataexchange/fhir/service/FhirApiWorkFlowServiceImpl.java b/src/main/java/org/openelisglobal/dataexchange/fhir/service/FhirApiWorkFlowServiceImpl.java index 84907ec2b..d22ed6945 100644 --- a/src/main/java/org/openelisglobal/dataexchange/fhir/service/FhirApiWorkFlowServiceImpl.java +++ b/src/main/java/org/openelisglobal/dataexchange/fhir/service/FhirApiWorkFlowServiceImpl.java @@ -81,9 +81,6 @@ public class FhirApiWorkFlowServiceImpl implements FhirApiWorkflowService { @Value("${org.openelisglobal.remote.source.updateStatus}") private Optional remoteStoreUpdateStatus; - @Value("${org.openelisglobal.remote.source.identifier:}#{T(java.util.Collections).emptyList()}") - private List remoteStoreIdentifier; - @Scheduled(initialDelay = 10 * 1000, fixedRate = 2 * 60 * 1000) @Override public void pollForRemoteTasks() { @@ -127,7 +124,7 @@ public void processWorkflow(ResourceType resourceType) { } private void beginTaskCheckIfAcceptedPath(String remoteStorePath) throws FhirLocalPersistingException { - if (remoteStoreIdentifier.isEmpty()) { + if (fhirConfig.getRemoteStoreIdentifier().isEmpty()) { return; } @@ -208,7 +205,7 @@ private void beginTaskCheckIfAcceptedPath(String remoteStorePath) throws FhirLoc } private void beginTaskImportResultsPath(String remoteStorePath) { - if (remoteStoreIdentifier.isEmpty()) { + if (fhirConfig.getRemoteStoreIdentifier().isEmpty()) { return; } @@ -369,7 +366,7 @@ private void addResultImportObject(BundleEntryComponent bundleEntry, } private void beginTaskImportOrderPath(String remoteStorePath) { - if (remoteStoreIdentifier.isEmpty()) { + if (fhirConfig.getRemoteStoreIdentifier().isEmpty()) { return; } @@ -383,7 +380,7 @@ private void beginTaskImportOrderPath(String remoteStorePath) { // .include(Task.INCLUDE_PATIENT)// // .include(Task.INCLUDE_BASED_ON)// .where(Task.STATUS.exactly().code(TaskStatus.REQUESTED.toCode())) // - .where(Task.OWNER.hasAnyOfIds(remoteStoreIdentifier)); + .where(Task.OWNER.hasAnyOfIds(fhirConfig.getRemoteStoreIdentifier())); Bundle importBundle = searchQuery.execute(); importBundles.add(importBundle); if (importBundle.hasEntry()) { diff --git a/src/main/java/org/openelisglobal/referral/fhir/service/FhirReferralServiceImpl.java b/src/main/java/org/openelisglobal/referral/fhir/service/FhirReferralServiceImpl.java index 09aa9cc47..33f24d5c7 100644 --- a/src/main/java/org/openelisglobal/referral/fhir/service/FhirReferralServiceImpl.java +++ b/src/main/java/org/openelisglobal/referral/fhir/service/FhirReferralServiceImpl.java @@ -77,7 +77,6 @@ import org.openelisglobal.testresult.valueholder.TestResult; import org.openelisglobal.typeoftestresult.service.TypeOfTestResultServiceImpl; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -121,9 +120,6 @@ public class FhirReferralServiceImpl implements FhirReferralService { @Autowired private FhirConfig fhirConfig; - @Value("${org.openelisglobal.remote.source.identifier:}#{T(java.util.Collections).emptyList()}") - private List remoteStoreIdentifier; - private final String RESULT_SUBJECT = "Result Note"; private String RESULT_TABLE_ID; private String RESULT_REPORT_ID; @@ -246,9 +242,9 @@ public Task createReferralTask(Organization referralOrganization, Patient patien if (requester.isPresent()) { task.setRequester(fhirTransformService.createReferenceFor(requester.get())); } - if (!remoteStoreIdentifier.isEmpty()) { + if (!fhirConfig.getRemoteStoreIdentifier().isEmpty()) { task.setRestriction(new TaskRestrictionComponent() - .setRecipient(Arrays.asList(new Reference(remoteStoreIdentifier.get(0))))); + .setRecipient(Arrays.asList(new Reference(fhirConfig.getRemoteStoreIdentifier().get(0))))); } task.setAuthoredOn(new Date()); task.setStatus(TaskStatus.REQUESTED);