Skip to content

Commit ce95214

Browse files
authored
Merge pull request #195 from slubwama/U4X-959
U4X-959: Revamp Viral Load Sync Jobs to enable users manually sync Individual Tests
2 parents 0473c40 + b00ec10 commit ce95214

14 files changed

Lines changed: 1272 additions & 490 deletions

api/src/main/java/org/openmrs/module/ugandaemrsync/api/UgandaEMRSyncService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.Date;
3131
import java.util.List;
3232
import java.util.Properties;
33+
import java.util.Map;
3334

3435
/**
3536
* The main service of this module, which is exposed for other modules. See
@@ -496,5 +497,16 @@ public Encounter addVLToEncounter(String vlQualitative, String vlQuantitative, S
496497
public List<JSONObject> generateDrugOrderToOtherSystem(Collection<Concept> conceptList);
497498

498499
public void sendPrescription();
500+
501+
502+
public List<Map<String, String>> generateAndSyncBulkViralLoadRequest();
503+
504+
public Map sendSingleViralLoadOrder(Order order);
505+
506+
public Map requestLabResult(Order order, SyncTask syncTask);
507+
508+
public Date getDateFromString(String dateString, String format);
509+
510+
public Order getOrderByAccessionNumber(String assessionNumber);
499511
}
500512

api/src/main/java/org/openmrs/module/ugandaemrsync/api/dao/UgandaEMRSyncDao.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public SyncTask getSyncTask(String syncTask) {
7979
}
8080

8181

82+
8283
/**
8384
* @see org.openmrs.module.ugandaemrsync.api.UgandaEMRSyncService#getSyncTasksBySyncTaskId(java.lang.String)
8485
*/

api/src/main/java/org/openmrs/module/ugandaemrsync/api/impl/UgandaEMRSyncServiceImpl.java

Lines changed: 454 additions & 55 deletions
Large diffs are not rendered by default.

api/src/main/java/org/openmrs/module/ugandaemrsync/server/SyncConstant.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public class SyncConstant {
4242
public static final String CARE_SETTING_UUID_OPD = "6f0c9a92-6f24-11e3-af88-005056821db0";
4343

4444
public static final String ORDER_TYPE_DRUG_UUID = "131168f4-15f5-102d-96e4-000c29c2a5d7";
45+
public static final String ORDER_TYPE_TEST_UUID = "52a447d3-a64a-11e3-9aeb-50e549534c5e";
4546

4647
public static final String SERVER_IP = "ugandaemrsync.serverIP";
4748

api/src/main/java/org/openmrs/module/ugandaemrsync/server/SyncFHIRRecord.java

Lines changed: 140 additions & 100 deletions
Large diffs are not rendered by default.

api/src/main/java/org/openmrs/module/ugandaemrsync/server/UgandaEMRRecord.java

Lines changed: 0 additions & 16 deletions
This file was deleted.

api/src/main/java/org/openmrs/module/ugandaemrsync/tasks/ReceiveViralLoadResultFromCentralServerTask.java

Lines changed: 1 addition & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -39,113 +39,8 @@ public void execute() {
3939
}
4040

4141
for (SyncTask syncTask : ugandaEMRSyncService.getIncompleteActionSyncTask(VIRAL_LOAD_SYNC_TASK_TYPE_UUID)) {
42-
Order order = getOrder(syncTask.getSyncTask());
42+
ugandaEMRSyncService.requestLabResult(null, syncTask);
4343

44-
String dataOutput = generateVLFHIRResultRequestBody(VL_RECEIVE_RESULT_FHIR_JSON_STRING, ugandaEMRSyncService.getHealthCenterCode(), ugandaEMRSyncService.getPatientIdentifier(order.getEncounter().getPatient(), PATIENT_IDENTIFIER_TYPE), String.valueOf(syncTask.getSyncTask())).get("json");
45-
46-
Map results = new HashMap();
47-
48-
SyncTaskType syncTaskType = ugandaEMRSyncService.getSyncTaskTypeByUUID(VIRAL_LOAD_RESULT_PULL_TYPE_UUID);
49-
50-
try {
51-
results = ugandaEMRHttpURLConnection.sendPostBy(syncTaskType.getUrl(), syncTaskType.getUrlUserName(), syncTaskType.getUrlPassword(), "", dataOutput, false);
52-
} catch (Exception e) {
53-
log.error("Failed to fetch results", e);
54-
logSyncTask(500, e.getMessage(), order, syncTaskType, false, false);
55-
}
56-
Integer responseCode = null;
57-
String responseMessage = null;
58-
59-
// Parsing responseCode and responseMessage
60-
if (results.containsKey("responseCode") && results.containsKey("responseMessage")) {
61-
responseCode = Integer.parseInt(results.get("responseCode").toString());
62-
responseMessage = results.get("responseMessage").toString();
63-
}
64-
65-
// Processing results if responseCode is valid and status is not pending
66-
if (responseCode != null && (responseCode == 200 || responseCode == 201) && !results.isEmpty() && results.containsKey("status") && !results.get("status").equals("pending")) {
67-
Map reasonReference = (Map) results.get("reasonReference");
68-
ArrayList<Map> result = (ArrayList<Map>) reasonReference.get("result");
69-
70-
// Saving Viral Load Results
71-
if (order.getEncounter() != null && !result.isEmpty()) {
72-
Object qualitativeResult = result.get(0).get("valueString");
73-
Object quantitativeResult = result.get(0).get("valueInteger");
74-
75-
if (quantitativeResult != null && qualitativeResult != null) {
76-
try {
77-
ugandaEMRSyncService.addVLToEncounter(qualitativeResult.toString(), quantitativeResult.toString(), order.getEncounter().getEncounterDatetime().toString(), order.getEncounter(), order);
78-
syncTask.setActionCompleted(true);
79-
ugandaEMRSyncService.saveSyncTask(syncTask);
80-
logSyncTask(responseCode, result.get(0).get("valueString").toString(), order, syncTaskType, false, false);
81-
try {
82-
Context.getOrderService().discontinueOrder(order, "Completed", new Date(), order.getOrderer(), order.getEncounter());
83-
} catch (Exception e) {
84-
log.error("Failed to discontinue order", e);
85-
}
86-
} catch (Exception e) {
87-
log.error("Failed to add results to patient encounter", e);
88-
logSyncTask(500, e.getMessage(), order, syncTaskType, false, false);
89-
}
90-
} else {
91-
logSyncTask(500, "Internal server error: Results of Viral load have a null value", order, syncTaskType, false, false);
92-
}
93-
}
94-
} else {
95-
// Logging based on responseCode or status
96-
if (responseCode != null && !results.containsKey("status")) {
97-
logSyncTask(responseCode, responseMessage, order, syncTaskType, false, false);
98-
} else if (results.containsKey("status")) {
99-
logSyncTask(responseCode, results.get("status").toString(), order, syncTaskType, false, false);
100-
}
101-
}
102-
103-
}
104-
}
105-
106-
private SyncTask logSyncTask(Integer statusCode, String status, Order order, SyncTaskType syncTaskType, boolean anyFurtherAction, boolean anyFurtherActionCompleted) {
107-
UgandaEMRSyncService ugandaEMRSyncService = Context.getService(UgandaEMRSyncService.class);
108-
List<SyncTask> syncTasks = ugandaEMRSyncService.getSyncTasksBySyncTaskId(order.getAccessionNumber()).stream().filter(syncTask -> syncTask.getSyncTaskType().equals(syncTaskType)).collect(Collectors.toList());
109-
if (!syncTasks.isEmpty()) {
110-
SyncTask existingTask = syncTasks.get(0);
111-
existingTask.setRequireAction(anyFurtherAction);
112-
existingTask.setStatus(status);
113-
existingTask.setStatusCode(statusCode);
114-
existingTask.setActionCompleted(anyFurtherActionCompleted);
115-
existingTask.setDateSent(new Date());
116-
return ugandaEMRSyncService.saveSyncTask(existingTask);
117-
} else {
118-
SyncTask newSyncTask = new SyncTask();
119-
newSyncTask.setCreator(Context.getUserService().getUser(1));
120-
newSyncTask.setSentToUrl(syncTaskType.getUrl());
121-
newSyncTask.setRequireAction(anyFurtherAction);
122-
newSyncTask.setStatus(status);
123-
newSyncTask.setStatusCode(statusCode);
124-
newSyncTask.setActionCompleted(anyFurtherActionCompleted);
125-
newSyncTask.setSyncTask(order.getAccessionNumber());
126-
newSyncTask.setSyncTaskType(syncTaskType);
127-
newSyncTask.setSyncTaskType(syncTaskType);
128-
newSyncTask.setDateSent(new Date());
129-
return ugandaEMRSyncService.saveSyncTask(newSyncTask);
130-
}
131-
}
132-
133-
public Map<String, String> generateVLFHIRResultRequestBody(String jsonRequestString, String healthCenterCode, String patientIdentifier, String sampleIdentifier) {
134-
Map<String, String> jsonMap = new HashMap<>();
135-
String filledJsonFile = "";
136-
filledJsonFile = String.format(jsonRequestString, healthCenterCode, patientIdentifier, sampleIdentifier);
137-
jsonMap.put("json", filledJsonFile);
138-
return jsonMap;
139-
}
140-
141-
public Order getOrder(String assessionNumber) {
142-
OrderService orderService = Context.getOrderService();
143-
List list = Context.getAdministrationService().executeSQL(String.format(VIRAL_LOAD_ORDER_QUERY, assessionNumber), true);
144-
if (list.size() > 0) {
145-
for (Object o : list) {
146-
return orderService.getOrder(Integer.parseUnsignedInt(((ArrayList) o).get(0).toString()));
147-
}
14844
}
149-
return null;
15045
}
15146
}

api/src/main/java/org/openmrs/module/ugandaemrsync/tasks/SendViralLoadRequestToCentralServerTask.java

Lines changed: 1 addition & 213 deletions
Original file line numberDiff line numberDiff line change
@@ -46,222 +46,10 @@
4646
public class SendViralLoadRequestToCentralServerTask extends AbstractTask {
4747

4848
protected Log log = LogFactory.getLog(SendViralLoadRequestToCentralServerTask.class);
49-
5049
@Override
5150
public void execute() {
52-
UgandaEMRHttpURLConnection ugandaEMRHttpURLConnection = new UgandaEMRHttpURLConnection();
5351
UgandaEMRSyncService ugandaEMRSyncService = Context.getService(UgandaEMRSyncService.class);
54-
List<Order> orderList = new ArrayList<>();
55-
56-
if (!ugandaEMRHttpURLConnection.isConnectionAvailable()) {
57-
return;
58-
}
59-
60-
try {
61-
orderList = getOrders();
62-
} catch (IOException e) {
63-
log.error("Failed to get orders", e);
64-
} catch (ParseException e) {
65-
log.error("Failed to pass orders to list", e);
66-
}
67-
68-
SyncTaskType syncTaskType = ugandaEMRSyncService.getSyncTaskTypeByUUID(VIRAL_LOAD_SYNC_TYPE_UUID);
69-
70-
for (Order order : orderList) {
71-
List<SyncTask> allSyncTasks = ugandaEMRSyncService.getAllSyncTask();
72-
List<SyncTask> syncTasks = allSyncTasks.stream().filter(p -> order.getAccessionNumber().equals(p.getSyncTask()) && syncTaskType.getId().equals(p.getSyncTaskType().getId())).collect(Collectors.toList());
73-
74-
if (syncTasks.size()<1){
75-
Map<String, String> dataOutput = generateVLFHIROrderTestRequestBody((TestOrder) order, VL_SEND_SAMPLE_FHIR_JSON_STRING);
76-
String json = dataOutput.get("json");
77-
78-
try {
79-
Map map = ugandaEMRHttpURLConnection.sendPostBy(syncTaskType.getUrl(), syncTaskType.getUrlUserName(), syncTaskType.getUrlPassword(), "", json, false);
80-
if (map != null) {
81-
Map responseType = handleReturnedResponses(order, map);
82-
Integer response = (Integer) map.get("responseCode");
83-
84-
if (map.get("responseCode").toString().equals("400") && responseType.get("responseType").toString().equals("Duplicate")) {
85-
response = 200;
86-
}
87-
88-
SyncTask newSyncTask = new SyncTask();
89-
newSyncTask.setDateSent(new Date());
90-
newSyncTask.setCreator(Context.getUserService().getUser(1));
91-
newSyncTask.setSentToUrl(syncTaskType.getUrl());
92-
newSyncTask.setRequireAction(true);
93-
newSyncTask.setActionCompleted(false);
94-
newSyncTask.setSyncTask(order.getAccessionNumber());
95-
newSyncTask.setStatusCode((Integer) response);
96-
newSyncTask.setStatus((String) map.get("responseMessage"));
97-
newSyncTask.setSyncTaskType(ugandaEMRSyncService.getSyncTaskTypeByUUID(VIRAL_LOAD_SYNC_TYPE_UUID));
98-
ugandaEMRSyncService.saveSyncTask(newSyncTask);
99-
}
100-
} catch (Exception e) {
101-
log.error("Failed to create sync task",e);
102-
}
103-
}
104-
}
105-
}
106-
107-
private Map handleReturnedResponses(Order order, Map response) {
108-
Map responseType = new HashMap<>();
109-
OrderService orderService = Context.getOrderService();
110-
try {
111-
if (response.get("responseCode").equals(400) && response.get("responseMessage").toString().contains("The specimen ID:") && response.get("responseMessage").toString().contains("is not HIE compliant")) {
112-
orderService.discontinueOrder(order, response.get("responseMessage").toString(), new Date(), order.getOrderer(), order.getEncounter());
113-
responseType.put("responseType", "Not HIE compliant");
114-
} else if (response.get("responseCode").equals(400) && response.get("responseMessage").toString().toLowerCase().contains("duplicate")) {
115-
//TODO need to update openmrs version in sync in order to support updating fulfiller status
116-
responseType.put("responseType", "Duplicate");
117-
}
118-
} catch (Exception e) {
119-
log.error(e);
120-
}
121-
122-
return responseType;
123-
}
124-
125-
126-
/**
127-
* @return
128-
*/
129-
private List<List<Object>> getViralLoadRequestData() {
130-
return Context.getAdministrationService().executeSQL(SyncConstant.VIRAL_LOAD_ENCOUNTER_QUERY, false);
131-
}
132-
133-
/**
134-
* Generate VL test Request
135-
*
136-
* @param encounter
137-
* @return
138-
*/
139-
public Map<String, String> generateVLFHIRTestRequestBody(Encounter encounter, String jsonFhirMap) {
140-
Map<String, String> jsonMap = new HashMap<>();
141-
UgandaEMRSyncService ugandaEMRSyncService = new UgandaEMRSyncServiceImpl();
142-
String filledJsonFile = "";
143-
if (encounter != null && encounter.getEncounterId() != null) {
144-
String obsSampleType = "";
145-
String obsRequesterContact = "";
146-
String healthCenterName = ugandaEMRSyncService.getHealthCenterName();
147-
String healthCenterCode = ugandaEMRSyncService.getHealthCenterCode();
148-
String requestType = encounter.getEncounterType().getName();
149-
String sourceSystem = "UgandaEMR";
150-
String patientARTNO = ugandaEMRSyncService.getPatientIdentifier(encounter.getPatient(),PATIENT_IDENTIFIER_TYPE);
151-
String sampleID = encounter.getEncounterId().toString();
152-
String sampleCollectionDate = encounter.getEncounterDatetime().toString();
153-
String clinicianNames = getProviderByEncounterRole(encounter, "clinician");
154-
String labTechNames = getProviderByEncounterRole(encounter, "Lab Technician");
155-
156-
157-
for (Obs obs : encounter.getAllObs()) {
158-
if (obs.getConcept().getConceptId() == 165153) {
159-
obsSampleType = obs.getValueCoded().getName().getName();
160-
}
161-
if (obs.getConcept().getConceptId() == 159635) {
162-
obsRequesterContact = obs.getValueText();
163-
}
164-
}
165-
166-
filledJsonFile = String.format(jsonFhirMap, healthCenterCode, healthCenterName, requestType, sourceSystem, patientARTNO, sampleID, obsSampleType, sampleCollectionDate, clinicianNames, obsRequesterContact, labTechNames, "None", "CPHL");
167-
}
168-
jsonMap.put("json", filledJsonFile);
169-
return jsonMap;
170-
}
171-
172-
/**
173-
* Gererates FHIR MESSAGE Basing On Order To Lab That is refereed to Reference Lab
174-
*
175-
* @param testOrder
176-
* @param jsonFHIRMap
177-
* @return
178-
*/
179-
public Map<String, String> generateVLFHIROrderTestRequestBody(TestOrder testOrder, String jsonFHIRMap) {
180-
Map<String, String> jsonMap = new HashMap<>();
181-
UgandaEMRSyncService ugandaEMRSyncService = new UgandaEMRSyncServiceImpl();
182-
String filledJsonFile = "";
183-
if (testOrder != null) {
184-
185-
186-
187-
String healthCenterName = ugandaEMRSyncService.getHealthCenterName();
188-
String healthCenterCode = ugandaEMRSyncService.getHealthCenterCode();
189-
String requestType = proccessMappings(testOrder.getConcept());
190-
String sourceSystem = "UgandaEMR";
191-
String patientARTNO = ugandaEMRSyncService.getPatientIdentifier(testOrder.getPatient(),PATIENT_IDENTIFIER_TYPE);
192-
String sampleID = testOrder.getAccessionNumber();
193-
String sampleCollectionDate = testOrder.getEncounter().getEncounterDatetime().toString();
194-
String clinicianNames = testOrder.getOrderer().getName();
195-
String labTechNames = testOrder.getCreator().getPersonName().getFullName();
196-
String labTechContact = "None";
197-
String ordererContact = "None";
198-
199-
try {
200-
if (getProviderAttributeValue(Objects.requireNonNull(getProviderAppributesFromPerson(testOrder.getCreator().getPerson()))) != null) {
201-
labTechContact = getProviderAttributeValue(Objects.requireNonNull(getProviderAppributesFromPerson(testOrder.getCreator().getPerson())));
202-
}
203-
}catch (Exception e){
204-
log.error("Could not add Lab technician telephone number",e);
205-
}
206-
207-
String obsSampleType = testOrder.getSpecimenSource().getName().getName();
208-
if (getProviderAttributeValue(testOrder.getOrderer().getActiveAttributes()) != null) {
209-
ordererContact = getProviderAttributeValue(testOrder.getOrderer().getActiveAttributes());
210-
}
211-
212-
filledJsonFile = String.format(jsonFHIRMap, healthCenterCode, healthCenterName, requestType, sourceSystem, patientARTNO, sampleID, obsSampleType, sampleCollectionDate, labTechNames, labTechContact,sampleCollectionDate, clinicianNames, ordererContact, "CPHL");
213-
}
214-
jsonMap.put("json", filledJsonFile);
215-
return jsonMap;
216-
}
217-
218-
private String proccessMappings(Concept concept) {
219-
for (ConceptMap conceptMap : concept.getConceptMappings()) {
220-
return conceptMap.getConceptReferenceTerm().getCode();
221-
}
222-
return null;
223-
}
224-
225-
private String getProviderByEncounterRole(Encounter encounter, String encounterRoleName) {
226-
for (EncounterProvider provider : encounter.getActiveEncounterProviders()) {
227-
if (provider.getEncounterRole().getName() == encounterRoleName) {
228-
return provider.getProvider().getName();
229-
}
230-
}
231-
return null;
232-
}
233-
234-
public List<Order> getOrders() throws IOException, ParseException {
235-
OrderService orderService = Context.getOrderService();
236-
List<Order> orders = new ArrayList<>();
237-
List list = Context.getAdministrationService().executeSQL(VIRAL_LOAD_ORDERS_QUERY, true);
238-
if (list.size() > 0) {
239-
for (Object o : list) {
240-
Order order = orderService.getOrder(Integer.parseUnsignedInt(((ArrayList) o).get(0).toString()));
241-
if (order.getAccessionNumber() != null && order.isActive() && order.getInstructions().equalsIgnoreCase("REFER TO cphl")) {
242-
orders.add(order);
243-
}
244-
}
245-
}
246-
return orders;
247-
}
248-
249-
private String getProviderAttributeValue(Collection<ProviderAttribute> providerAttributes) {
250-
for (ProviderAttribute providerAttribute : providerAttributes) {
251-
if (providerAttribute.getAttributeType().getName().equals("Phone Number")) {
252-
return providerAttribute.getValue().toString();
253-
}
254-
255-
}
256-
return null;
257-
}
258-
259-
private Collection<ProviderAttribute> getProviderAppributesFromPerson(Person person) {
260-
List<Provider> providers = (List<Provider>) Context.getProviderService().getProvidersByPerson(person);
261-
if (providers != null) {
262-
return providers.get(0).getActiveAttributes();
263-
}
264-
return null;
52+
ugandaEMRSyncService.generateAndSyncBulkViralLoadRequest();
26553
}
26654

26755
}

0 commit comments

Comments
 (0)