package uk.nhs.kch.rassyeyanie.rules.common.core.filters;
import org.apache.camel.Body;
import org.apache.commons.lang.StringUtils;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.AbstractMessage;
import ca.uhn.hl7v2.model.v24.message.ORM_O01;
import ca.uhn.hl7v2.model.v24.message.ORU_R01;
import ca.uhn.hl7v2.model.v24.segment.OBR;
/* This filter is used to check if there is value in OBR-4.1
The default value are:
- verify true, set to false if want opposite outcome
- messageType "O01" is for as order/order update message
(other type can be is "R01")
- matchValue as below is valid Winpath Lab number.
user can define any as require even an empty string.
*/
public class FillerOrderNumberFilter {
private boolean verify = true;
private String messageType = "O01";
private String matchValue = "[0-9]{2}[A-Z]{1}[0-9]{7}";
public boolean shouldProcessMessage(@Body AbstractMessage message)
throws HL7Exception
{
boolean outcome = true;
if (messageType.equals("O01"))
outcome = checkOrderMessage(message);
else // "R01"
outcome = checkResultMessage(message);
if (this.verify)
{
return (outcome);
}
else
{
return !(outcome);
}
}
private boolean checkResultMessage(AbstractMessage message) {
boolean conformsFiller = true;
ORU_R01 r01 = (ORU_R01) message;
int resultCount = r01.getPATIENT_RESULT().getORDER_OBSERVATIONReps();
for (int i = 0; i < resultCount && conformsFiller; i++)
{
OBR obr = r01.getPATIENT_RESULT().getORDER_OBSERVATION(i).getOBR();
String fillerOrderNumber = StringUtils.defaultString(obr
.getObr3_FillerOrderNumber()
.getEi1_EntityIdentifier()
.getValue());
if(fillerOrderNumber.isEmpty())
{
if(matchValue.isEmpty())
conformsFiller = true;
else
conformsFiller = false;
}
else
{
conformsFiller =
this.checkFillerOrderNumberConforms(StringUtils.defaultString(fillerOrderNumber));
}
}
return (conformsFiller);
}
private boolean checkOrderMessage(AbstractMessage message) {
boolean conformsFiller = true;
ORM_O01 o01 = (ORM_O01) message;
int orderCount = o01.getORDERReps();
for (int i = 0; i < orderCount && conformsFiller ; i++)
{
OBR obr = o01.getORDER(i).getORDER_DETAIL().getOBR();
String fillerOrderNumber = StringUtils.defaultString(obr
.getObr3_FillerOrderNumber()
.getEi1_EntityIdentifier()
.getValue());
if(fillerOrderNumber.isEmpty())
{
if(matchValue.isEmpty())
conformsFiller = true;
else
conformsFiller = false;
}
else
{
conformsFiller =
this.checkFillerOrderNumberConforms(StringUtils.defaultString(fillerOrderNumber));
}
}
return (conformsFiller);
}
private boolean checkFillerOrderNumberConforms(String fillerOrderNumber)
{
return fillerOrderNumber.matches(matchValue);
}
public String getMessageType()
{
return this.messageType;
}
public void setMessageType(String messageType)
{
this.messageType = messageType;
}
public String getMatchValue()
{
return this.matchValue;
}
public void setMatchValue(String matchValue)
{
this.matchValue = matchValue;
}
public boolean getVerify()
{
return this.verify;
}
public void setVerify(boolean verify)
{
this.verify = verify;
}
}