Search in sources :

Example 1 with ParamPrefixEnum

use of ca.uhn.fhir.rest.param.ParamPrefixEnum 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;
}
Also used : PRPAMT201306UV02MothersMaidenName(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02MothersMaidenName) PRPAMT201306UV02PatientStatusCode(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02PatientStatusCode) ParamPrefixEnum(ca.uhn.fhir.rest.param.ParamPrefixEnum) DateOrListParam(ca.uhn.fhir.rest.param.DateOrListParam) IVLTS(net.ihe.gazelle.hl7v3.datatypes.IVLTS) PRPAMT201306UV02QueryByParameter(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02QueryByParameter) PRPAMT201306UV02PatientTelecom(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02PatientTelecom) TemporalPrecisionEnum(ca.uhn.fhir.model.api.TemporalPrecisionEnum) EnFamily(net.ihe.gazelle.hl7v3.datatypes.EnFamily) PRPAMT201306UV02ParameterList(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02ParameterList) PRPAMT201306UV02LivingSubjectBirthTime(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02LivingSubjectBirthTime) InvalidRequestException(ca.uhn.fhir.rest.server.exceptions.InvalidRequestException) PRPAIN201305UV02Type(net.ihe.gazelle.hl7v3.prpain201305UV02.PRPAIN201305UV02Type) StringParam(ca.uhn.fhir.rest.param.StringParam) MCCIMT000100UV01Device(net.ihe.gazelle.hl7v3.mccimt000100UV01.MCCIMT000100UV01Device) TokenAndListParam(ca.uhn.fhir.rest.param.TokenAndListParam) PRPAIN201305UV02QUQIMT021001UV01ControlActProcess(net.ihe.gazelle.hl7v3.prpain201305UV02.PRPAIN201305UV02QUQIMT021001UV01ControlActProcess) DateParam(ca.uhn.fhir.rest.param.DateParam) II(net.ihe.gazelle.hl7v3.datatypes.II) CD(net.ihe.gazelle.hl7v3.datatypes.CD) PRPAMT201306UV02PatientAddress(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02PatientAddress) CE(net.ihe.gazelle.hl7v3.datatypes.CE) AD(net.ihe.gazelle.hl7v3.datatypes.AD) DateAndListParam(ca.uhn.fhir.rest.param.DateAndListParam) StringAndListParam(ca.uhn.fhir.rest.param.StringAndListParam) Calendar(java.util.Calendar) EN(net.ihe.gazelle.hl7v3.datatypes.EN) EnGiven(net.ihe.gazelle.hl7v3.datatypes.EnGiven) PRPAMT201306UV02OtherIDsScopingOrganization(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02OtherIDsScopingOrganization) ByteArrayOutputStream(java.io.ByteArrayOutputStream) MCCIMT000100UV01Sender(net.ihe.gazelle.hl7v3.mccimt000100UV01.MCCIMT000100UV01Sender) PRPAMT201306UV02LivingSubjectName(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02LivingSubjectName) Date(java.util.Date) PRPAMT201306UV02LivingSubjectAdministrativeGender(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02LivingSubjectAdministrativeGender) CS(net.ihe.gazelle.hl7v3.datatypes.CS) TokenOrListParam(ca.uhn.fhir.rest.param.TokenOrListParam) TokenParam(ca.uhn.fhir.rest.param.TokenParam) PRPAMT201306UV02LivingSubjectId(net.ihe.gazelle.hl7v3.prpamt201306UV02.PRPAMT201306UV02LivingSubjectId) MCCIMT000100UV01Receiver(net.ihe.gazelle.hl7v3.mccimt000100UV01.MCCIMT000100UV01Receiver) TEL(net.ihe.gazelle.hl7v3.datatypes.TEL) PN(net.ihe.gazelle.hl7v3.datatypes.PN) IVXBTS(net.ihe.gazelle.hl7v3.datatypes.IVXBTS) IVLTS(net.ihe.gazelle.hl7v3.datatypes.IVLTS) TS(net.ihe.gazelle.hl7v3.datatypes.TS)

Example 2 with ParamPrefixEnum

use of ca.uhn.fhir.rest.param.ParamPrefixEnum in project openmrs-module-fhir2 by openmrs.

the class BaseDao method handleAgeByDateProperty.

protected Optional<Criterion> handleAgeByDateProperty(@Nonnull String datePropertyName, @Nonnull QuantityParam age) {
    BigDecimal value = age.getValue();
    if (value == null) {
        throw new IllegalArgumentException("Age value should be provided in " + age);
    }
    String unit = age.getUnits();
    if (unit == null) {
        throw new IllegalArgumentException("Age unit should be provided in " + age);
    }
    LocalDateTime localDateTime = localDateTimeFactory.now();
    TemporalAmount temporalAmount;
    TemporalUnit temporalUnit;
    // listed but was seen in FHIR examples: http://www.hl7.org/fhir/datatypes-examples.html#Quantity
    switch(unit) {
        case "s":
            temporalUnit = ChronoUnit.SECONDS;
            temporalAmount = Duration.ofSeconds(value.longValue());
            break;
        case "min":
            temporalUnit = ChronoUnit.MINUTES;
            temporalAmount = Duration.ofMinutes(value.longValue());
            break;
        case "h":
            temporalUnit = ChronoUnit.HOURS;
            temporalAmount = Duration.ofHours(value.longValue());
            break;
        case "d":
            temporalUnit = ChronoUnit.DAYS;
            temporalAmount = Period.ofDays(value.intValue());
            break;
        case "wk":
            temporalUnit = ChronoUnit.WEEKS;
            temporalAmount = Period.ofWeeks(value.intValue());
            break;
        case "mo":
            temporalUnit = ChronoUnit.MONTHS;
            temporalAmount = Period.ofMonths(value.intValue());
            break;
        case "a":
            temporalUnit = ChronoUnit.YEARS;
            temporalAmount = Period.ofYears(value.intValue());
            break;
        default:
            throw new IllegalArgumentException("Invalid unit " + unit + " in age " + age + " should be one of 'min', 'h', 'd', 'wk', 'mo', 'a'");
    }
    localDateTime = localDateTime.minus(temporalAmount);
    ParamPrefixEnum prefix = age.getPrefix();
    if (prefix == null) {
        prefix = ParamPrefixEnum.EQUAL;
    }
    if (prefix == ParamPrefixEnum.EQUAL || prefix == ParamPrefixEnum.NOT_EQUAL) {
        // Create a range for the targeted unit; the interval length is determined by the unit and
        // its center is `offsetSeconds` in the past.
        final long offset;
        // Duration only supports hours as a chunk of seconds
        if (temporalUnit == ChronoUnit.HOURS) {
            offset = temporalAmount.get(ChronoUnit.SECONDS) / (2 * 3600);
        } else {
            offset = temporalAmount.get(temporalUnit) / 2;
        }
        LocalDateTime lowerBoundDateTime = LocalDateTime.from(localDateTime).minus(Duration.of(offset, temporalUnit));
        Date lowerBound = Date.from(lowerBoundDateTime.atZone(ZoneId.systemDefault()).toInstant());
        LocalDateTime upperBoundDateTime = LocalDateTime.from(localDateTime).plus(offset, temporalUnit);
        Date upperBound = Date.from(upperBoundDateTime.atZone(ZoneId.systemDefault()).toInstant());
        if (prefix == ParamPrefixEnum.EQUAL) {
            return Optional.of(and(ge(datePropertyName, lowerBound), le(datePropertyName, upperBound)));
        } else {
            return Optional.of(not(and(ge(datePropertyName, lowerBound), le(datePropertyName, upperBound))));
        }
    }
    switch(prefix) {
        case LESSTHAN_OR_EQUALS:
        case LESSTHAN:
        case STARTS_AFTER:
            return Optional.of(ge(datePropertyName, Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())));
        case GREATERTHAN_OR_EQUALS:
        case GREATERTHAN:
            return Optional.of(le(datePropertyName, Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())));
    }
    return Optional.empty();
}
Also used : LocalDateTime(java.time.LocalDateTime) TemporalUnit(java.time.temporal.TemporalUnit) TemporalAmount(java.time.temporal.TemporalAmount) ParamPrefixEnum(ca.uhn.fhir.rest.param.ParamPrefixEnum) BigDecimal(java.math.BigDecimal) Date(java.util.Date)

Aggregations

ParamPrefixEnum (ca.uhn.fhir.rest.param.ParamPrefixEnum)2 Date (java.util.Date)2 TemporalPrecisionEnum (ca.uhn.fhir.model.api.TemporalPrecisionEnum)1 DateAndListParam (ca.uhn.fhir.rest.param.DateAndListParam)1 DateOrListParam (ca.uhn.fhir.rest.param.DateOrListParam)1 DateParam (ca.uhn.fhir.rest.param.DateParam)1 StringAndListParam (ca.uhn.fhir.rest.param.StringAndListParam)1 StringParam (ca.uhn.fhir.rest.param.StringParam)1 TokenAndListParam (ca.uhn.fhir.rest.param.TokenAndListParam)1 TokenOrListParam (ca.uhn.fhir.rest.param.TokenOrListParam)1 TokenParam (ca.uhn.fhir.rest.param.TokenParam)1 InvalidRequestException (ca.uhn.fhir.rest.server.exceptions.InvalidRequestException)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 BigDecimal (java.math.BigDecimal)1 LocalDateTime (java.time.LocalDateTime)1 TemporalAmount (java.time.temporal.TemporalAmount)1 TemporalUnit (java.time.temporal.TemporalUnit)1 Calendar (java.util.Calendar)1 AD (net.ihe.gazelle.hl7v3.datatypes.AD)1 CD (net.ihe.gazelle.hl7v3.datatypes.CD)1