Skip to content

Commit 0d48055

Browse files
authored
UHM-9105 - Support removing orders from reception list (#20)
1 parent 4e2e895 commit 0d48055

File tree

9 files changed

+218
-31
lines changed

9 files changed

+218
-31
lines changed

api/src/main/java/org/openmrs/module/pihapps/PihAppsService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
*/
1414
package org.openmrs.module.pihapps;
1515

16+
import org.openmrs.Concept;
1617
import org.openmrs.Location;
18+
import org.openmrs.Order;
1719
import org.openmrs.api.OpenmrsService;
1820
import org.openmrs.module.pihapps.orders.EncounterFulfillingOrders;
1921
import org.openmrs.module.pihapps.orders.OrderSearchCriteria;
@@ -33,4 +35,6 @@ public interface PihAppsService extends OpenmrsService {
3335
EncounterFulfillingOrders saveEncounterFulfillingOrders(EncounterFulfillingOrders encounterFulfillingOrders);
3436

3537
EncounterFulfillingOrders getEncounterFulfillingOrders(String encounterUuid);
38+
39+
void markOrdersAsNotFulfilled(List<Order> orders, Concept reason);
3640
}

api/src/main/java/org/openmrs/module/pihapps/PihAppsServiceImpl.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.openmrs.annotation.Authorized;
3232
import org.openmrs.api.EncounterService;
3333
import org.openmrs.api.LocationService;
34+
import org.openmrs.api.ObsService;
3435
import org.openmrs.api.OrderService;
3536
import org.openmrs.api.db.hibernate.DbSessionFactory;
3637
import org.openmrs.api.impl.BaseOpenmrsService;
@@ -79,6 +80,9 @@ public class PihAppsServiceImpl extends BaseOpenmrsService implements PihAppsSer
7980
@Setter
8081
private OrderService orderService;
8182

83+
@Setter
84+
private ObsService obsService;
85+
8286
@Setter
8387
private DbSessionFactory sessionFactory;
8488

@@ -319,4 +323,27 @@ public EncounterFulfillingOrders getEncounterFulfillingOrders(String encounterUu
319323
encounterFulfillingOrders.setOrders(orders);
320324
return encounterFulfillingOrders;
321325
}
326+
327+
@Override
328+
@Transactional
329+
@Authorized(PrivilegeConstants.EDIT_ORDERS)
330+
public void markOrdersAsNotFulfilled(List<Order> orders, Concept reason) {
331+
for (Order order : orders) {
332+
orderService.updateOrderFulfillerStatus(order, Order.FulfillerStatus.EXCEPTION, null);
333+
if (reason != null) {
334+
if (labOrderConfig.getReasonTestNotPerformedQuestion() == null) {
335+
throw new IllegalArgumentException("Reason test not performed question is not configured");
336+
}
337+
Obs obs = new Obs();
338+
obs.setPerson(order.getPatient());
339+
obs.setObsDatetime(new Date());
340+
obs.setConcept(labOrderConfig.getReasonTestNotPerformedQuestion());
341+
obs.setOrder(order);
342+
obs.setValueCoded(reason);
343+
obs.setAccessionNumber(order.getAccessionNumber());
344+
obs.setComment("result-entry-form^did-not-perform-dropdown"); // This is here for backwards-compatibility with the labworkflow owa
345+
obsService.saveObs(obs, "");
346+
}
347+
}
348+
}
322349
}

api/src/main/java/org/openmrs/module/pihapps/orders/LabOrderConfig.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,18 @@ public Concept getSpecimenReceivedDateQuestion() {
394394
return conceptService.getConceptByReference(getSpecimenReceivedDateQuestionReference());
395395
}
396396

397+
public String getReasonTestNotPerformedQuestionReference() {
398+
String configVal = ConfigUtil.getGlobalProperty("pihapps.labs.didNotPerformReason");
399+
if (StringUtils.isBlank(configVal)) {
400+
configVal = ConfigUtil.getGlobalProperty("labworkflowowa.didNotPerformReason");
401+
}
402+
return configVal;
403+
}
404+
405+
public Concept getReasonTestNotPerformedQuestion() {
406+
return conceptService.getConceptByReference(getReasonTestNotPerformedQuestionReference());
407+
}
408+
397409
private Map<String, String> map(String... keysAndValues) {
398410
Map<String, String> ret = new LinkedHashMap<>();
399411
for (int i = 0; i < keysAndValues.length; i += 2) {

api/src/main/resources/messages.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ pihapps.labTestLocation=Laboratory Performing Test
7676
pihapps.specimenCollectionDateCannotBeFuture=Specimen Collection Date cannot be in the future
7777
pihapps.specimenReceivedDateCannotBeFuture=Date Specimen Received at Laboratory cannot be in the future
7878
pihapps.specimenReceivedCannotBeBeforeCollected=Date Specimen Received at Laboratory cannot be before Specimen Collection Date
79+
pihapps.reason=Reason
80+
pihapps.reasonRequired=Reason is required
7981

8082
# Login and Visit Location Configuration and Selection Pages
8183
pihapps.login.chooseLocation.title=Choose login location

api/src/main/resources/messages_es.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ pihapps.labTestLocation=Laboratorio que realiza la prueba
7676
pihapps.specimenCollectionDateCannotBeFuture=La fecha de recolección de la muestra no puede ser una fecha futura.
7777
pihapps.specimenReceivedDateCannotBeFuture=La fecha en que se recibió la muestra en el laboratorio no puede ser una fecha futura.
7878
pihapps.specimenReceivedCannotBeBeforeCollected=La fecha de recepción de la muestra en el laboratorio no puede ser anterior a la fecha de recolección de la muestra.
79+
pihapps.reason=Razón
80+
pihapps.reasonRequired=Se requiere razón
7981

8082
# Login and Visit Location Configuration and Selection Pages
8183
pihapps.login.chooseLocation.title=Elija la ubicación de inicio de sesión

api/src/main/resources/messages_fr.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ pihapps.labTestLocation=Laboratoire effectuant les tests
7676
pihapps.specimenCollectionDateCannotBeFuture=La date de prélèvement de l'échantillon ne peut pas être une date future.
7777
pihapps.specimenReceivedDateCannotBeFuture=La date de réception de l'échantillon au laboratoire ne peut pas être une date future.
7878
pihapps.specimenReceivedCannotBeBeforeCollected=La date de réception de l'échantillon au laboratoire ne peut pas être antérieure à la date de prélèvement de l'échantillon.
79+
pihapps.reason=Raison
80+
pihapps.reasonRequired=Une raison est requise
7981

8082
# Login and Visit Location Configuration and Selection Pages
8183
pihapps.login.chooseLocation.title=Choisissez votre lieu

api/src/main/resources/moduleApplicationContext.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<property name="locationService" ref="locationService"/>
2020
<property name="orderService" ref="orderService"/>
2121
<property name="encounterService" ref="encounterService"/>
22+
<property name="obsService" ref="obsService"/>
2223
<property name="sessionFactory" ref="dbSessionFactory"/>
2324
</bean>
2425
</property>

omod/src/main/java/org/openmrs/module/pihapps/rest/LabOrderRestController.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.openmrs.Order;
88
import org.openmrs.OrderType;
99
import org.openmrs.Patient;
10+
import org.openmrs.api.ConceptService;
1011
import org.openmrs.api.OrderService;
1112
import org.openmrs.module.pihapps.PihAppsService;
1213
import org.openmrs.module.pihapps.SortCriteria;
@@ -16,6 +17,7 @@
1617
import org.openmrs.module.pihapps.orders.OrderSearchResult;
1718
import org.openmrs.module.pihapps.orders.PatientWithOrders;
1819
import org.openmrs.module.pihapps.orders.PatientWithOrdersSearchResult;
20+
import org.openmrs.module.webservices.rest.SimpleObject;
1921
import org.openmrs.module.webservices.rest.web.ConversionUtil;
2022
import org.openmrs.module.webservices.rest.web.RequestContext;
2123
import org.openmrs.module.webservices.rest.web.RestUtil;
@@ -24,7 +26,10 @@
2426
import org.openmrs.module.webservices.rest.web.resource.impl.AlreadyPaged;
2527
import org.openmrs.module.webservices.rest.web.response.ResponseException;
2628
import org.springframework.beans.factory.annotation.Autowired;
29+
import org.springframework.http.HttpStatus;
30+
import org.springframework.http.ResponseEntity;
2731
import org.springframework.stereotype.Controller;
32+
import org.springframework.web.bind.annotation.RequestBody;
2833
import org.springframework.web.bind.annotation.RequestMapping;
2934
import org.springframework.web.bind.annotation.RequestMethod;
3035
import org.springframework.web.bind.annotation.RequestParam;
@@ -52,11 +57,14 @@ public class LabOrderRestController {
5257

5358
private final OrderService orderService;
5459

60+
private final ConceptService conceptService;
61+
5562
@Autowired
56-
public LabOrderRestController(PihAppsService pihAppsService, LabOrderConfig labOrderConfig, OrderService orderService) {
63+
public LabOrderRestController(PihAppsService pihAppsService, LabOrderConfig labOrderConfig, OrderService orderService, ConceptService conceptService) {
5764
this.pihAppsService = pihAppsService;
5865
this.labOrderConfig = labOrderConfig;
5966
this.orderService = orderService;
67+
this.conceptService = conceptService;
6068
}
6169

6270
@RequestMapping(value = "/rest/v1/pihapps/labOrder", method = RequestMethod.GET)
@@ -189,6 +197,37 @@ public Object getLabOrderPatients(HttpServletRequest request, HttpServletRespons
189197
return alreadyPaged.toSimpleObject(patientConverter);
190198
}
191199

200+
@RequestMapping(value = "/rest/v1/pihapps/markOrdersAsNotPerformed", method = RequestMethod.POST)
201+
public Object markOrdersAsNotPerformed(HttpServletRequest request, HttpServletResponse response, @RequestBody SimpleObject post) throws ResponseException {
202+
try {
203+
List<String> orderUuids = post.get("orders");
204+
if (orderUuids == null || orderUuids.isEmpty()) {
205+
throw new RuntimeException("You must specify at least one order");
206+
}
207+
List<Order> orders = new ArrayList<>();
208+
for (String orderUuid : orderUuids) {
209+
Order order = orderService.getOrderByUuid(orderUuid);
210+
if (order == null) {
211+
throw new Exception("No order found with uuid " + orderUuid);
212+
}
213+
orders.add(order);
214+
}
215+
Concept reason = null;
216+
if (StringUtils.isNotBlank(post.get("reason"))) {
217+
reason = conceptService.getConceptByReference(post.get("reason"));
218+
if (reason == null) {
219+
throw new Exception("Invalid reason. No concept found with uuid " + post.get("reason"));
220+
}
221+
}
222+
pihAppsService.markOrdersAsNotFulfilled(orders, reason);
223+
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
224+
}
225+
catch (Exception e) {
226+
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
227+
return RestUtil.wrapErrorResponse(e, e.getLocalizedMessage());
228+
}
229+
}
230+
192231
/**
193232
* There is no OrderType Property Editor registered with core, so convert from String uuids to OrderTypes
194233
*/

0 commit comments

Comments
 (0)