package uk.nhs.kch.rassyeyanie.rules.pims.symphony.translations.a13;
import org.apache.camel.Body;
import org.apache.camel.Header;
import uk.nhs.kch.rassyeyanie.framework.HL7AdditionalConstants;
import uk.nhs.kch.rassyeyanie.framework.HapiUtil;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.DataTypeException;
import ca.uhn.hl7v2.model.Segment;
import ca.uhn.hl7v2.model.Varies;
import ca.uhn.hl7v2.model.v24.datatype.CE;
import ca.uhn.hl7v2.model.v24.datatype.XCN;
import ca.uhn.hl7v2.model.v24.group.ADT_A01_PROCEDURE;
import ca.uhn.hl7v2.model.v24.message.ADT_A01;
import ca.uhn.hl7v2.model.v24.segment.PID;
import ca.uhn.hl7v2.model.v24.segment.PV1;
import ca.uhn.hl7v2.util.DeepCopy;
/* Cancel discharge from CDU to ward. Patient transfer back to CDU. */
public class SymA13PimsA12
{
public
void
dispatchProcessFixture(@Header(HL7AdditionalConstants.HL7_SOURCE_MESSAGE) ADT_A01 from,
@Body ADT_A01 to)
throws HL7Exception
{
this.changeMessageEventType(to, "A12");
this.tranformPid(to.getPID());
Segment zrf = this.promoteZrfSegment(from);
this.transformZrf(zrf, to.getPV1());
this.transform(to.getPV1(), zrf);
to.addNonstandardSegment("ZRF");
Segment toZrf = (Segment) to.insertRepetition("ZRF", 0);
DeepCopy.copy(zrf, toZrf);
}
private Segment promoteZrfSegment(ADT_A01 message)
throws HL7Exception
{
int countPr1 = message.getPROCEDUREReps();
if (countPr1 > 0)
{
ADT_A01_PROCEDURE lastProcedure =
message.getPROCEDURE(countPr1 - 1);
lastProcedure.addNonstandardSegment("ZRF");
Segment zrf = (Segment) lastProcedure.get("ZRF");
return zrf;
}
else
{
return (Segment) message.get("ZRF");
}
}
private void changeMessageEventType(ADT_A01 message, String eventType)
throws DataTypeException, HL7Exception
{
message.getMSH().getMessageType().getTriggerEvent().setValue(eventType);
message.getEVN().getEventTypeCode().setValue(eventType);
}
private void tranformPid(PID pid)
throws HL7Exception
{
HapiUtil.clearFieldsToEnd(pid, 23);
}
private void transform(PV1 pv1, Segment zrf)
throws HL7Exception
{
pv1.getPv12_PatientClass().setValue("I");
pv1.getPv13_AssignedPatientLocation().clear();
pv1
.getPv13_AssignedPatientLocation()
.getPl1_PointOfCare()
.setValue(
pv1
.getPv137_DischargedToLocation()
.getDld1_DischargeLocation()
.getValue());
pv1
.getPv13_AssignedPatientLocation()
.getPl4_Facility()
.getHd1_NamespaceID()
.setValue("KCH");
pv1.getPv15_PreadmitNumber().clear();
pv1
.getPv16_PriorPatientLocation()
.getPl1_PointOfCare()
.setValue(pv1.getPv14_AdmissionType().getValue());
pv1
.getPv16_PriorPatientLocation()
.getPl4_Facility()
.getHd1_NamespaceID()
.setValue("KCH");
pv1.getPv14_AdmissionType().setValue("21");
pv1.getPv114_AdmitSource().setValue("19");
HapiUtil.clearField(pv1, 7);
HapiUtil.clearField(pv1, 8);
DeepCopy.copy(
pv1.getPv19_ConsultingDoctor(0),
pv1.getPv18_ReferringDoctor(0));
/*
* TODO: Is it important? as it's never work in Data-gate
* pv1.getPv19_ConsultingDoctor(0).getXcn1_IDNumber()
* .setValue(((Varies) zrf.getField(8, 0)).encode());
*/
HapiUtil.clearField(pv1, 9);
pv1.getPv110_HospitalService().setValue("AE");
HapiUtil.clearField(pv1, 12);
HapiUtil.clearField(pv1, 13);
HapiUtil.clearFields(pv1, 20, 43);
pv1.getPv122_CourtesyCode().setValue("NSP");
pv1.getPv128_InterestCode().setValue("NSP");
pv1.getPv140_BedStatus().setValue("NSP");
HapiUtil.clearFieldsToEnd(pv1, 45);
}
private void transformZrf(Segment zrf, PV1 pv1)
throws HL7Exception
{
zrf.getField(1, 0).parse("EMERG^^DGATE");
zrf.getField(2, 0).parse(
pv1.getPv144_AdmitDateTime().getTimeOfAnEvent().getValue());
((Varies) zrf.getField(5, 0)).setData(new XCN(zrf.getMessage()));
zrf.getField(5, 0).parse("^^DGATE");
zrf.getField(6, 0).clear();
zrf.getField(6, 0).parse("EDCDU^^DGATE");
((Varies) zrf.getField(7, 0)).setData(new XCN(zrf.getMessage()));
zrf.getField(7, 0).parse("^^DGATE");
((Varies) zrf.getField(8, 0)).setData(new CE(zrf.getMessage()));
zrf.getField(8, 0).parse("^^DGATE");
((Varies) zrf.getField(9, 0)).setData(new CE(zrf.getMessage()));
zrf.getField(9, 0).parse("^^DGATE");
((Varies) zrf.getField(10, 0)).setData(new XCN(zrf.getMessage()));
((Varies) zrf.getField(11, 0)).setData(new XCN(zrf.getMessage()));
((Varies) zrf.getField(12, 0)).setData(new XCN(zrf.getMessage()));
zrf.getField(10, 0).parse("");
zrf.getField(11, 0).parse("");
zrf.getField(12, 0).parse("");
}
}