Search in sources :

Example 26 with Patient

use of org.hl7.fhir.dstu3.model.Patient in project gpconnect-demonstrator by nhsconnect.

the class PatientResourceProvider method validateTelecomAndAddress.

private void validateTelecomAndAddress(Patient patient) {
    // 0..1 of phone - (not nec. temp),  0..1 of email
    HashSet<ContactPointUse> phoneUse = new HashSet<>();
    int emailCount = 0;
    for (ContactPoint telecom : patient.getTelecom()) {
        if (telecom.hasSystem()) {
            if (telecom.getSystem() != null) {
                switch(telecom.getSystem()) {
                    case PHONE:
                        if (telecom.hasUse()) {
                            switch(telecom.getUse()) {
                                case HOME:
                                case WORK:
                                case MOBILE:
                                case TEMP:
                                    if (!phoneUse.contains(telecom.getUse())) {
                                        phoneUse.add(telecom.getUse());
                                    } else {
                                        throwInvalidRequest400_BadRequestException("Only one Telecom of type phone with use type " + telecom.getUse().toString().toLowerCase() + " is allowed in a register patient request.");
                                    }
                                    break;
                                default:
                                    throwInvalidRequest400_BadRequestException("Invalid Telecom of type phone use type " + telecom.getUse().toString().toLowerCase() + " in a register patient request.");
                            }
                        } else {
                            throwInvalidRequest400_BadRequestException("Invalid Telecom - no Use type provided in a register patient request.");
                        }
                        break;
                    case EMAIL:
                        if (++emailCount > 1) {
                            throwInvalidRequest400_BadRequestException("Only one Telecom of type " + "email" + " is allowed in a register patient request.");
                        }
                        break;
                    default:
                        throwInvalidRequest400_BadRequestException("Telecom system is missing in a register patient request.");
                }
            }
        } else {
            throwInvalidRequest400_BadRequestException("Telecom system is missing in a register patient request.");
        }
    }
    // iterate telcom
    // count by useType - Only the first address is persisted at present
    HashSet<AddressUse> useTypeCount = new HashSet<>();
    for (Address address : patient.getAddress()) {
        AddressUse useType = address.getUse();
        // #189 address use types work and old are not allowed
        if (useType == WORK || useType == OLD) {
            throwUnprocessableEntity422_InvalidResourceException("Address use type " + useType + " cannot be sent in a register patient request.");
        }
        if (!useTypeCount.contains(useType)) {
            useTypeCount.add(useType);
        } else {
            // #174 Only a single address of each usetype may be sent
            throwUnprocessableEntity422_InvalidResourceException("Only a single address of each use type can be sent in a register patient request.");
        }
    }
// for address
}
Also used : ContactPointUse(org.hl7.fhir.dstu3.model.ContactPoint.ContactPointUse) AddressUse(org.hl7.fhir.dstu3.model.Address.AddressUse)

Example 27 with Patient

use of org.hl7.fhir.dstu3.model.Patient in project gpconnect-demonstrator by nhsconnect.

the class PatientResourceProvider method validateGender.

// validateTelecomAndAddress
private void validateGender(Patient patient) {
    AdministrativeGender gender = patient.getGender();
    if (gender != null) {
        EnumSet<AdministrativeGender> genderList = EnumSet.allOf(AdministrativeGender.class);
        Boolean valid = false;
        for (AdministrativeGender genderItem : genderList) {
            if (genderItem.toCode().equalsIgnoreCase(gender.toString())) {
                valid = true;
                break;
            }
        }
        if (!valid) {
            throwInvalidRequest400_BadRequestException(String.format("The supplied Patient gender %s is an unrecognised type.", gender));
        }
    }
}
Also used : AdministrativeGender(org.hl7.fhir.dstu3.model.Enumerations.AdministrativeGender)

Example 28 with Patient

use of org.hl7.fhir.dstu3.model.Patient in project gpconnect-demonstrator by nhsconnect.

the class StructuredAllergyIntoleranceBuilder method buildStructuredAllergyIntolerence.

public Bundle buildStructuredAllergyIntolerence(String NHS, Set<String> practitionerIds, Bundle bundle, Boolean includedResolved) {
    List<StructuredAllergyIntoleranceEntity> allergyData = structuredAllergySearch.getAllergyIntollerence(NHS);
    ListResource activeList = initiateListResource(NHS, ACTIVE_ALLERGIES_DISPLAY, allergyData);
    ListResource resolvedList = initiateListResource(NHS, RESOLVED_ALLERGIES_DISPLAY, allergyData);
    // This is patient 5 example 2 only
    if (allergyData.size() == 1 && allergyData.get(0).getClinicalStatus().equals(SystemConstants.NO_KNOWN)) {
        StructuredAllergyIntoleranceEntity noKnownAllergy = allergyData.get(0);
        // #214 had incorrect code and value for no known allergies
        CodeableConcept noKnownAllergies = createCoding(SystemURL.VS_LIST_EMPTY_REASON_CODE, NO_CONTENT_RECORDED, NO_CONTENT_RECORDED_DISPLAY);
        noKnownAllergies.setText("No Known Allergies");
        // activeList.setEmptyReason(noKnownAllergies);
        // see spec example 2 no known allergies positively asserted
        Reference patient = new Reference(SystemConstants.PATIENT_REFERENCE_URL + allergyData.get(0).getPatientRef());
        String noKnownAllergyId = noKnownAllergy.getGuid();
        Reference allergyIntolerance = new Reference("AllergyIntolerance/" + noKnownAllergyId);
        Resource noKnownAllergyResource = createNoKnownAllergy(noKnownAllergy);
        activeList.setSubject(patient);
        // reference to AllergyIntolerance item
        activeList.addEntry().setItem(allergyIntolerance);
        activeList.setOrderedBy(createCoding(SystemURL.CS_LIST_ORDER, "event-date", "Sorted by Event Date"));
        bundle.addEntry().setResource(activeList);
        bundle.addEntry().setResource(noKnownAllergyResource);
        if (includedResolved) {
            resolvedList.setSubject(patient);
            resolvedList.setEmptyReason(noKnownAllergies);
            bundle.addEntry().setResource(resolvedList);
        }
        return bundle;
    }
    for (StructuredAllergyIntoleranceEntity allergyIntoleranceEntity : allergyData) {
        AllergyIntolerance allergyIntolerance = new AllergyIntolerance();
        allergyIntolerance.setOnset(new DateTimeType(allergyIntoleranceEntity.getOnSetDateTime()));
        allergyIntolerance.setMeta(createMeta(SystemURL.SD_CC_ALLERGY_INTOLERANCE));
        allergyIntolerance.setId(allergyIntoleranceEntity.getId().toString());
        List<Identifier> identifiers = new ArrayList<>();
        Identifier identifier1 = new Identifier().setSystem("https://fhir.nhs.uk/Id/cross-care-setting-identifier").setValue(allergyIntoleranceEntity.getGuid());
        identifiers.add(identifier1);
        allergyIntolerance.setIdentifier(identifiers);
        if (allergyIntoleranceEntity.getClinicalStatus().equals(SystemConstants.ACTIVE)) {
            allergyIntolerance.setClinicalStatus(AllergyIntoleranceClinicalStatus.ACTIVE);
        } else {
            allergyIntolerance.setClinicalStatus(AllergyIntoleranceClinicalStatus.RESOLVED);
        }
        if (allergyIntoleranceEntity.getCategory().equals(SystemConstants.MEDICATION)) {
            allergyIntolerance.addCategory(AllergyIntoleranceCategory.MEDICATION);
        } else {
            allergyIntolerance.addCategory(AllergyIntoleranceCategory.ENVIRONMENT);
        }
        allergyIntolerance.setVerificationStatus(AllergyIntoleranceVerificationStatus.UNCONFIRMED);
        // CODE
        codeableConceptBuilder.addConceptCode(SystemConstants.SNOMED_URL, allergyIntoleranceEntity.getConceptCode(), allergyIntoleranceEntity.getConceptDisplay()).addDescription(allergyIntoleranceEntity.getDescCode(), allergyIntoleranceEntity.getDescDisplay()).addTranslation(allergyIntoleranceEntity.getCodeTranslationRef());
        allergyIntolerance.setCode(codeableConceptBuilder.build());
        codeableConceptBuilder.clear();
        allergyIntolerance.setAssertedDate(allergyIntoleranceEntity.getAssertedDate());
        Reference patient = new Reference(SystemConstants.PATIENT_REFERENCE_URL + allergyIntoleranceEntity.getPatientRef());
        allergyIntolerance.setPatient(patient);
        Annotation noteAnnotation = new Annotation(new StringType(allergyIntoleranceEntity.getNote()));
        allergyIntolerance.setNote(Collections.singletonList(noteAnnotation));
        AllergyIntoleranceReactionComponent reaction = new AllergyIntoleranceReactionComponent();
        // MANIFESTATION
        List<CodeableConcept> theManifestation = new ArrayList<>();
        codeableConceptBuilder.addConceptCode(SystemConstants.SNOMED_URL, allergyIntoleranceEntity.getManifestationCoding(), allergyIntoleranceEntity.getManifestationDisplay()).addDescription(allergyIntoleranceEntity.getManifestationDescCoding(), allergyIntoleranceEntity.getManifestationDescDisplay()).addTranslation(allergyIntoleranceEntity.getManTranslationRef());
        theManifestation.add(codeableConceptBuilder.build());
        codeableConceptBuilder.clear();
        reaction.setManifestation(theManifestation);
        reaction.setDescription(allergyIntoleranceEntity.getNote());
        // SEVERITY
        try {
            reaction.setSeverity(AllergyIntoleranceSeverity.fromCode(allergyIntoleranceEntity.getSeverity()));
        } catch (FHIRException e) {
            throw OperationOutcomeFactory.buildOperationOutcomeException(new UnprocessableEntityException("Unknown severity: " + allergyIntoleranceEntity.getSeverity()), SystemCode.INVALID_RESOURCE, IssueType.INVALID);
        }
        // EXPOSURE
        CodeableConcept exposureRoute = new CodeableConcept();
        reaction.setExposureRoute(exposureRoute);
        allergyIntolerance.addReaction(reaction);
        // RECORDER
        final Reference refValue = new Reference();
        final Identifier identifier = new Identifier();
        final String recorder = allergyIntoleranceEntity.getRecorder();
        // This is just an example to demonstrate using Reference element instead of Identifier element
        if (recorder.equals(patient2NhsNo.trim())) {
            Reference rec = new Reference(SystemConstants.PATIENT_REFERENCE_URL + allergyIntoleranceEntity.getPatientRef());
            allergyIntolerance.setRecorder(rec);
        } else if (patientRepository.findByNhsNumber(recorder) != null) {
            identifier.setSystem(SystemURL.ID_NHS_NUMBER);
            identifier.setValue(recorder);
            refValue.setIdentifier(identifier);
            allergyIntolerance.setRecorder(refValue);
        } else if (practitionerSearch.findPractitionerByUserId(recorder) != null) {
            refValue.setReference("Practitioner/" + recorder);
            allergyIntolerance.setRecorder(refValue);
            practitionerIds.add(recorder);
        }
        // CLINICAL STATUS
        List<Extension> extensions = new ArrayList<>();
        if (allergyIntolerance.getClinicalStatus().getDisplay().contains("Active")) {
            listResourceBuilder(activeList, allergyIntolerance, false);
            bundle.addEntry().setResource(allergyIntolerance);
        } else if (allergyIntolerance.getClinicalStatus().getDisplay().equals("Resolved") && includedResolved.equals(true)) {
            listResourceBuilder(resolvedList, allergyIntolerance, true);
            allergyIntolerance.setLastOccurrence(allergyIntoleranceEntity.getEndDate());
            final Extension allergyEndExtension = createAllergyEndExtension(allergyIntoleranceEntity);
            extensions.add(allergyEndExtension);
        }
        if (!extensions.isEmpty()) {
            allergyIntolerance.setExtension(extensions);
        }
        // ASSERTER
        Reference asserter = allergyIntolerance.getAsserter();
        if (asserter != null && asserter.getReference() != null && asserter.getReference().startsWith("Practitioner")) {
            String[] split = asserter.getReference().split("/");
            practitionerIds.add(split[1]);
        }
    }
    if (!activeList.hasEntry()) {
        addEmptyListNote(activeList);
        addEmptyReasonCode(activeList);
    }
    bundle.addEntry().setResource(activeList);
    if (includedResolved && !resolvedList.hasEntry()) {
        addEmptyListNote(resolvedList);
        addEmptyReasonCode(resolvedList);
    }
    if (includedResolved) {
        bundle.addEntry().setResource(resolvedList);
    }
    return bundle;
}
Also used : UnprocessableEntityException(ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException) StructuredAllergyIntoleranceEntity(uk.gov.hscic.patient.structuredAllergyIntolerance.StructuredAllergyIntoleranceEntity) FHIRException(org.hl7.fhir.exceptions.FHIRException) AllergyIntolerance(org.hl7.fhir.dstu3.model.AllergyIntolerance)

Example 29 with Patient

use of org.hl7.fhir.dstu3.model.Patient in project gpconnect-demonstrator by nhsconnect.

the class StructuredAllergyIntoleranceBuilder method createNoKnownAllergy.

/**
 * This relates to the positively asserted this patient has no know
 * allergies as opposed to the the negatively asserted no allergies recorded
 * patient 5 example 2 from the spec
 *
 * @param allergyIntoleranceEntity object from the db
 * @return the allergy intolerance resource
 */
private AllergyIntolerance createNoKnownAllergy(StructuredAllergyIntoleranceEntity allergyIntoleranceEntity) {
    AllergyIntolerance allergyIntolerance = new AllergyIntolerance();
    allergyIntolerance.setId(allergyIntoleranceEntity.getGuid());
    allergyIntolerance.setAssertedDate(allergyIntoleranceEntity.getAssertedDate());
    // db has clinical status of "no known" which is not a valid value
    allergyIntolerance.setClinicalStatus(AllergyIntoleranceClinicalStatus.ACTIVE);
    allergyIntolerance.setVerificationStatus(AllergyIntoleranceVerificationStatus.valueOf(allergyIntoleranceEntity.getVerificationStatus().toUpperCase()));
    allergyIntolerance.setType(AllergyIntoleranceType.ALLERGY);
    CodeableConcept codeableConcept = new CodeableConcept();
    Coding coding = new Coding();
    coding.setDisplay(allergyIntoleranceEntity.getConceptDisplay());
    // That's as in db under concept code 716186003
    coding.setCode(allergyIntoleranceEntity.getConceptCode());
    coding.setSystem(SystemConstants.SNOMED_URL);
    Extension extension = new Extension(SystemURL.SD_EXT_SCT_DESC_ID);
    // 3305010017
    extension.addExtension("descriptionId", new StringType(allergyIntoleranceEntity.getDescCode()));
    // NKA - No known allergy
    extension.addExtension("descriptionDisplay", new StringType(allergyIntoleranceEntity.getDescDisplay()));
    coding.addExtension(extension);
    codeableConcept.addCoding(coding);
    allergyIntolerance.setCode(codeableConcept);
    return allergyIntolerance;
}
Also used : AllergyIntolerance(org.hl7.fhir.dstu3.model.AllergyIntolerance)

Example 30 with Patient

use of org.hl7.fhir.dstu3.model.Patient in project gpconnect-demonstrator by nhsconnect.

the class MedicationRequestResourceProvider method getRequesterComponent.

// TODO - spec needs to clarify whether this should be populated or not
private MedicationRequestRequesterComponent getRequesterComponent(MedicationRequestDetail requestDetail) {
    MedicationRequestRequesterComponent requesterComponent = new MedicationRequestRequesterComponent();
    switch(requestDetail.getRequesterUrl()) {
        case (SystemURL.SD_GPC_PATIENT):
            requesterComponent.setAgent(new Reference(new IdType("Patient", requestDetail.getRequesterId())));
            break;
        case (SystemURL.SD_GPC_PRACTITIONER):
            requesterComponent.setAgent(new Reference(new IdType("Practitioner", requestDetail.getRequesterId())));
            break;
        case (SystemURL.SD_GPC_ORGANIZATION):
            requesterComponent.setAgent(new Reference(new IdType("Organization", requestDetail.getRequesterId())));
            break;
        default:
            break;
    }
    requesterComponent.setOnBehalfOf(new Reference(new IdType("Organization", requestDetail.getDispenseRequestOrganizationId())));
    return requesterComponent;
}
Also used : MedicationRequestRequesterComponent(org.hl7.fhir.dstu3.model.MedicationRequest.MedicationRequestRequesterComponent)

Aggregations

ArrayList (java.util.ArrayList)8 UnprocessableEntityException (ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException)7 Patient (org.hl7.fhir.dstu3.model.Patient)7 FHIRException (org.hl7.fhir.exceptions.FHIRException)7 Reference (org.hl7.fhir.dstu3.model.Reference)6 InvalidRequestException (ca.uhn.fhir.rest.server.exceptions.InvalidRequestException)5 CodeableConcept (org.hl7.fhir.dstu3.model.CodeableConcept)5 Extension (org.hl7.fhir.dstu3.model.Extension)5 IdDt (ca.uhn.fhir.model.primitive.IdDt)4 ResourceNotFoundException (ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException)4 Date (java.util.Date)4 Coding (org.hl7.fhir.dstu3.model.Coding)4 AdministrativeGender (org.hl7.fhir.dstu3.model.Enumerations.AdministrativeGender)4 DateTimeDt (ca.uhn.fhir.model.primitive.DateTimeDt)3 Search (ca.uhn.fhir.rest.annotation.Search)3 Calendar (java.util.Calendar)3 Collectors (java.util.stream.Collectors)3 IdType (org.hl7.fhir.dstu3.model.IdType)3 IBaseBundle (org.hl7.fhir.instance.model.api.IBaseBundle)3 PatientDetails (uk.gov.hscic.model.patient.PatientDetails)3