/**
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations under
* the License.
*
* The Original Code is OpenELIS code.
*
* Copyright (C) ITECH, University of Washington, Seattle WA. All Rights Reserved.
*
*/
package us.mn.state.health.lims.dataexchange.order.action;
import java.util.List;
import us.mn.state.health.lims.common.services.StatusService;
import us.mn.state.health.lims.common.services.StatusService.ExternalOrderStatus;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.dataexchange.order.action.IOrderExistanceChecker.CheckResult;
import us.mn.state.health.lims.dataexchange.order.action.IOrderInterpreter.InterpreterResults;
import us.mn.state.health.lims.dataexchange.order.action.IOrderInterpreter.OrderType;
import us.mn.state.health.lims.dataexchange.order.valueholder.ElectronicOrder;
import ca.uhn.hl7v2.model.Message;
public class OrderWorker{
public enum OrderResult{
OK,
DUPLICATE_ORDER,
NON_CANCELABLE_ORDER,
MESSAGE_ERROR
}
private final Message orderMessage;
private IOrderInterpreter interpreter;
private IOrderExistanceChecker existanceChecker;
private IOrderPersister persister;
private StatusService statusService;
private List<InterpreterResults> interpretResults;
private CheckResult checkResult;
public OrderWorker(Message message){
orderMessage = message;
}
public void setInterpreter(IOrderInterpreter interpreter){
this.interpreter = interpreter;
}
public void setExistanceChecker(IOrderExistanceChecker orderExistanceChecker){
existanceChecker = orderExistanceChecker;
}
public void setPersister(IOrderPersister orderPersister){
this.persister = orderPersister;
}
private StatusService getStatusService(){
if( statusService == null){
statusService = StatusService.getInstance();
}
return statusService;
}
public void setStatusService(StatusService statusService){
this.statusService = statusService;
}
public List<InterpreterResults> getMessageErrors(){
return interpretResults;
}
public List<String> getUnsupportedTests(){
return interpreter.getUnsupportedTests();
}
public List<String> getUnsupportedPanels(){
return interpreter.getUnsupportedPanels();
}
public CheckResult getExistanceCheckResult(){
return checkResult;
}
public OrderResult handleOrderRequest() throws IllegalStateException{
if(interpreter == null || persister == null || existanceChecker == null){
throw new IllegalStateException("Interpreter, existanceChecker or persister have not been set");
}
interpretResults = interpreter.interpret(orderMessage);
if(interpretResults.get(0) == InterpreterResults.OK){
String referringOrderNumber = interpreter.getReferringOrderNumber();
String message = interpreter.getMessage();
OrderType orderType = interpreter.getOrderType();
MessagePatient patient = interpreter.getMessagePatient();
checkResult = existanceChecker.check(referringOrderNumber);
switch(checkResult){
case ORDER_FOUND_QUEUED:
if(orderType == OrderType.CANCEL){
cancelOrder(referringOrderNumber);
return OrderResult.OK;
}else{
return OrderResult.DUPLICATE_ORDER;
}
case ORDER_FOUND_INPROGRESS:
return orderType == OrderType.CANCEL ? OrderResult.NON_CANCELABLE_ORDER : OrderResult.DUPLICATE_ORDER;
case NOT_FOUND:
if(orderType == OrderType.CANCEL){
return OrderResult.NON_CANCELABLE_ORDER;
}else{
insertNewOrder(referringOrderNumber, message, patient);
}
break;
case ORDER_FOUND_CANCELED:
if(orderType == OrderType.CANCEL){
return OrderResult.NON_CANCELABLE_ORDER;
}else{
insertNewOrder(referringOrderNumber, message, patient);
}
break;
}
}else{
return OrderResult.MESSAGE_ERROR;
}
return OrderResult.OK;
}
private void cancelOrder(String referringOrderNumber){
persister.cancelOrder( referringOrderNumber);
}
private void insertNewOrder(String referringOrderNumber, String message, MessagePatient patient){
ElectronicOrder eOrder = new ElectronicOrder();
eOrder.setExternalId(referringOrderNumber);
eOrder.setData(message);
eOrder.setStatusId( getStatusService().getStatusID(ExternalOrderStatus.Entered));
eOrder.setOrderTimestamp(DateUtil.getNowAsTimestamp());
eOrder.setSysUserId(persister.getServiceUserId());
persister.persist(patient, eOrder);
}
}