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
}
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));
}
}
}
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;
}
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;
}
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;
}
Aggregations