use of net.ihe.gazelle.hl7v3.prpain201305UV02.PRPAIN201305UV02Type in project MobileAccessGateway by i4mi.
the class Iti78RequestConverter method iti78ToIti47Converter.
public String iti78ToIti47Converter(@Header("FhirRequestParameters") Iti78SearchParameters parameters) throws JAXBException {
PRPAIN201305UV02Type resultMsg = new PRPAIN201305UV02Type();
resultMsg.setITSVersion("XML_1.0");
resultMsg.setId(new II(config.getPixQueryOid(), uniqueId()));
// Now
resultMsg.setCreationTime(new TS(Timestamp.now().toHL7()));
resultMsg.setProcessingCode(new CS("T", null, null));
resultMsg.setProcessingModeCode(new CS("T", null, null));
resultMsg.setInteractionId(new II("2.16.840.1.113883.1.6", "PRPA_IN201305UV02"));
resultMsg.setAcceptAckCode(new CS("AL", null, null));
MCCIMT000100UV01Receiver receiver = new MCCIMT000100UV01Receiver();
resultMsg.addReceiver(receiver);
receiver.setTypeCode(CommunicationFunctionType.RCV);
MCCIMT000100UV01Device receiverDevice = new MCCIMT000100UV01Device();
receiver.setDevice(receiverDevice);
receiverDevice.setClassCode(EntityClassDevice.DEV);
receiverDevice.setDeterminerCode(EntityDeterminer.INSTANCE);
receiverDevice.setId(Collections.singletonList(new II(config.getPixReceiverOid(), null)));
MCCIMT000100UV01Sender sender = new MCCIMT000100UV01Sender();
resultMsg.setSender(sender);
sender.setTypeCode(CommunicationFunctionType.SND);
MCCIMT000100UV01Device senderDevice = new MCCIMT000100UV01Device();
sender.setDevice(senderDevice);
senderDevice.setClassCode(EntityClassDevice.DEV);
senderDevice.setDeterminerCode(EntityDeterminer.INSTANCE);
senderDevice.setId(Collections.singletonList(new II(config.getPixMySenderOid(), null)));
PRPAIN201305UV02QUQIMT021001UV01ControlActProcess controlActProcess = new PRPAIN201305UV02QUQIMT021001UV01ControlActProcess();
resultMsg.setControlActProcess(controlActProcess);
controlActProcess.setClassCode(ActClassControlAct.CACT);
controlActProcess.setMoodCode(XActMoodIntentEvent.EVN);
controlActProcess.setCode(new CD("PRPA_TE201305UV02", "2.16.840.1.113883.1.6", null));
PRPAMT201306UV02QueryByParameter queryByParameter = new PRPAMT201306UV02QueryByParameter();
controlActProcess.setQueryByParameter(queryByParameter);
queryByParameter.setQueryId(new II(config.getPixQueryOid(), uniqueId()));
queryByParameter.setStatusCode(new CS("new", null, null));
queryByParameter.setResponsePriorityCode(new CS("I", null, null));
queryByParameter.setResponseModalityCode(new CS("R", null, null));
PRPAMT201306UV02ParameterList parameterList = new PRPAMT201306UV02ParameterList();
queryByParameter.setParameterList(parameterList);
TokenParam id = parameters.get_id();
if (id != null) {
String v = id.getValue();
int idx = v.indexOf("-");
if (idx > 0) {
PRPAMT201306UV02LivingSubjectId livingSubjectId = new PRPAMT201306UV02LivingSubjectId();
livingSubjectId.addValue(new II(v.substring(0, idx), v.substring(idx + 1)));
livingSubjectId.setSemanticsText(ST("LivingSubject.id"));
parameterList.addLivingSubjectId(livingSubjectId);
}
}
// active -> patientStatusCode
TokenParam active = parameters.getActive();
if (active != null) {
String activeCode = "active";
PRPAMT201306UV02PatientStatusCode patientStatusCode = new PRPAMT201306UV02PatientStatusCode();
patientStatusCode.setValue(new CS(activeCode, null, null));
parameterList.addPatientStatusCode(patientStatusCode);
}
// patientAddress
StringParam postalCode = parameters.getPostalCode();
StringParam state = parameters.getState();
StringParam city = parameters.getCity();
StringParam country = parameters.getCountry();
StringParam address = parameters.getAddress();
if (postalCode != null || state != null || city != null || country != null || address != null) {
PRPAMT201306UV02PatientAddress patientAddress = new PRPAMT201306UV02PatientAddress();
AD ad = new AD();
if (postalCode != null)
ad.addPostalCode(element(AdxpPostalCode.class, postalCode.getValue()));
if (state != null)
ad.addState(element(AdxpState.class, state.getValue()));
if (city != null)
ad.addCity(element(AdxpCity.class, city.getValue()));
if (country != null)
ad.addCountry(element(AdxpCountry.class, country.getValue()));
// TODO How to support address filter?
patientAddress.addValue(ad);
patientAddress.setSemanticsText(ST("Patient.addr"));
parameterList.addPatientAddress(patientAddress);
}
// livingSubjectBirthTime
DateAndListParam birthdate = parameters.getBirthDate();
if (birthdate != null) {
IVLTS ivlts = new IVLTS();
for (DateOrListParam birthdateOr : birthdate.getValuesAsQueryTokens()) {
for (DateParam birthdateParam : birthdateOr.getValuesAsQueryTokens()) {
Date lDate = null;
Date hDate = null;
TemporalPrecisionEnum precision = birthdateParam.getPrecision();
ParamPrefixEnum prefix = birthdateParam.getPrefix();
if (prefix == null)
prefix = ParamPrefixEnum.EQUAL;
Calendar cal = Calendar.getInstance();
cal.setTime(birthdateParam.getValue());
switch(precision) {
case SECOND:
cal.set(Calendar.MILLISECOND, 0);
lDate = cal.getTime();
cal.set(Calendar.MILLISECOND, 1000);
hDate = cal.getTime();
break;
case MINUTE:
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.SECOND, 0);
lDate = cal.getTime();
cal.add(Calendar.MINUTE, 1);
hDate = cal.getTime();
break;
case DAY:
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.HOUR_OF_DAY, 0);
lDate = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, 1);
hDate = cal.getTime();
break;
case MONTH:
int month = cal.get(Calendar.MONTH);
int year = cal.get(Calendar.YEAR);
cal.set(year, month, 1, 0, 0, 0);
lDate = cal.getTime();
cal.add(Calendar.MONTH, 1);
hDate = cal.getTime();
break;
case YEAR:
year = cal.get(Calendar.YEAR);
cal.set(year, 0, 1, 0, 0, 0);
lDate = cal.getTime();
cal.add(Calendar.YEAR, 1);
hDate = cal.getTime();
break;
case MILLI:
default:
lDate = cal.getTime();
cal.add(Calendar.MILLISECOND, 1);
hDate = cal.getTime();
break;
}
switch(prefix) {
case GREATERTHAN:
ivlts.setLow(transform(hDate));
break;
case LESSTHAN:
ivlts.setHigh(transform(lDate));
break;
case GREATERTHAN_OR_EQUALS:
ivlts.setLow(transform(lDate));
break;
case LESSTHAN_OR_EQUALS:
ivlts.setHigh(transform(hDate));
break;
case STARTS_AFTER:
ivlts.setLow(transform(hDate));
break;
case ENDS_BEFORE:
ivlts.setHigh(transform(lDate));
break;
case EQUAL:
case APPROXIMATE:
ivlts.setLow(transform(lDate));
ivlts.setHigh(transform(hDate));
break;
//
default:
throw new InvalidRequestException("Date operation not supported.");
}
}
}
PRPAMT201306UV02LivingSubjectBirthTime livingSubjectBirthTime = new PRPAMT201306UV02LivingSubjectBirthTime();
livingSubjectBirthTime.addValue(ivlts);
livingSubjectBirthTime.setSemanticsText(ST("LivingSubject.birthTime"));
parameterList.addLivingSubjectBirthTime(livingSubjectBirthTime);
}
// given, family -> livingSubjectName
StringAndListParam given = parameters.getGiven();
StringAndListParam family = parameters.getFamily();
StringParam givenElem = given != null ? given.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().get(0) : null;
StringParam familyElem = family != null ? family.getValuesAsQueryTokens().get(0).getValuesAsQueryTokens().get(0) : null;
if (givenElem != null || familyElem != null) {
PRPAMT201306UV02LivingSubjectName livingSubjectName = new PRPAMT201306UV02LivingSubjectName();
livingSubjectName.setSemanticsText(ST("Patient.name"));
EN name = new EN();
if (familyElem != null) {
name.addFamily(element(EnFamily.class, familyElem.getValue()));
if (!familyElem.isExact())
name.setUse("SRCH");
}
if (givenElem != null) {
name.addGiven(element(EnGiven.class, givenElem.getValue()));
if (!givenElem.isExact())
name.setUse("SRCH");
}
livingSubjectName.addValue(name);
livingSubjectName.setSemanticsText(ST("LivingSubject.name"));
parameterList.addLivingSubjectName(livingSubjectName);
}
// gender -> livingSubjectAdministrativeGender
TokenParam gender = parameters.getGender();
if (gender != null) {
PRPAMT201306UV02LivingSubjectAdministrativeGender livingSubjectAdministrativeGender = new PRPAMT201306UV02LivingSubjectAdministrativeGender();
switch(gender.getValue().toUpperCase()) {
case "MALE":
livingSubjectAdministrativeGender.addValue(new CE("M", "Male", "2.16.840.1.113883.12.1"));
break;
case "FEMALE":
livingSubjectAdministrativeGender.addValue(new CE("F", "Female", "2.16.840.1.113883.12.1"));
break;
case "OTHER":
livingSubjectAdministrativeGender.addValue(new CE("A", "Ambiguous", "2.16.840.1.113883.12.1"));
break;
case "UNKNOWN":
livingSubjectAdministrativeGender.addValue(new CE("U", "Unknown", "2.16.840.1.113883.12.1"));
break;
default:
throw new InvalidRequestException("Unknown gender query parameter value");
}
livingSubjectAdministrativeGender.setSemanticsText(ST("LivingSubject.administrativeGender"));
parameterList.addLivingSubjectAdministrativeGender(livingSubjectAdministrativeGender);
}
// identifiers -> livingSubjectId or otherIDsScopingOrganization
TokenAndListParam identifiers = parameters.getIdentifiers();
if (identifiers != null) {
for (TokenOrListParam idOr : identifiers.getValuesAsQueryTokens()) {
for (TokenParam identifier : idOr.getValuesAsQueryTokens()) {
if (identifier.getValue() == null || identifier.getValue().length() == 0) {
PRPAMT201306UV02OtherIDsScopingOrganization otherIDsScopingOrganization = new PRPAMT201306UV02OtherIDsScopingOrganization();
otherIDsScopingOrganization.addValue(new II(getScheme(identifier.getSystem()), null));
otherIDsScopingOrganization.setSemanticsText(ST("OtherIDs.scopingOrganization.id"));
parameterList.addOtherIDsScopingOrganization(otherIDsScopingOrganization);
} else {
PRPAMT201306UV02LivingSubjectId livingSubjectId = new PRPAMT201306UV02LivingSubjectId();
livingSubjectId.addValue(new II(getScheme(identifier.getSystem()), identifier.getValue()));
livingSubjectId.setSemanticsText(ST("LivingSubject.id"));
parameterList.addLivingSubjectId(livingSubjectId);
}
}
}
}
// mothersMaidenName -> mothersMaidenName
StringParam mmn = parameters.getMothersMaidenName();
if (mmn != null) {
PRPAMT201306UV02MothersMaidenName mothersMaidenName = new PRPAMT201306UV02MothersMaidenName();
PN mothersMaidenNamePN = new PN();
mothersMaidenNamePN.addGiven(element(EnGiven.class, mmn.getValue()));
mothersMaidenName.addValue(mothersMaidenNamePN);
mothersMaidenName.setSemanticsText(ST("Person.MothersMaidenName"));
parameterList.addMothersMaidenName(mothersMaidenName);
}
// telecom -> patientTelecom
StringParam telecom = parameters.getTelecom();
if (telecom != null) {
PRPAMT201306UV02PatientTelecom patientTelecom = new PRPAMT201306UV02PatientTelecom();
TEL tel = new TEL();
tel.setValue(telecom.getValue());
patientTelecom.addValue(tel);
parameterList.addPatientTelecom(patientTelecom);
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
HL7V3Transformer.marshallMessage(PRPAIN201305UV02Type.class, out, resultMsg);
String outArray = new String(out.toByteArray());
return outArray;
}
Aggregations