|
46 | 46 | public class SendViralLoadRequestToCentralServerTask extends AbstractTask { |
47 | 47 |
|
48 | 48 | protected Log log = LogFactory.getLog(SendViralLoadRequestToCentralServerTask.class); |
49 | | - |
50 | 49 | @Override |
51 | 50 | public void execute() { |
52 | | - UgandaEMRHttpURLConnection ugandaEMRHttpURLConnection = new UgandaEMRHttpURLConnection(); |
53 | 51 | 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(); |
265 | 53 | } |
266 | 54 |
|
267 | 55 | } |
0 commit comments