use of org.hl7.fhir.dstu3.model.Type in project gpconnect-demonstrator by nhsconnect.
the class ScheduleResourceProvider method scheduleDetailToScheduleResourceConverter.
private Schedule scheduleDetailToScheduleResourceConverter(ScheduleDetail scheduleDetail) {
Schedule schedule = new Schedule();
String resourceId = String.valueOf(scheduleDetail.getId());
String versionId = String.valueOf(scheduleDetail.getLastUpdated().getTime());
String resourceType = schedule.getResourceType().toString();
IdType id = new IdType(resourceType, resourceId, versionId);
schedule.setId(id);
schedule.getMeta().setVersionId(versionId);
schedule.getMeta().setLastUpdated(scheduleDetail.getLastUpdated());
if (scheduleDetail.getPractitionerId() != null) {
schedule.addActor(new Reference("Practitioner/" + scheduleDetail.getPractitionerId()));
}
if (scheduleDetail.getPractitionerRoleCode() != null) {
Coding roleCoding = new Coding(SystemURL.VS_GPC_PRACTITIONER_ROLE, scheduleDetail.getPractitionerRoleCode(), scheduleDetail.getPractitionerRoleDisplay());
Extension practitionerRoleExtension = new Extension(SystemURL.SD_EXTENSION_GPC_PRACTITIONER_ROLE, new CodeableConcept().addCoding(roleCoding));
schedule.addExtension(practitionerRoleExtension);
}
// # 194
// Identifier identifier = new Identifier();
// identifier.setSystem(SystemURL.ID_GPC_SCHEDULE_IDENTIFIER);
// identifier.setValue(scheduleDetail.getIdentifier());
// schedule.addIdentifier(identifier);
Coding coding = new Coding().setSystem(SystemURL.HL7_VS_C80_PRACTICE_CODES).setCode(scheduleDetail.getTypeCode()).setDisplay(scheduleDetail.getTypeDescription());
CodeableConcept codableConcept = new CodeableConcept().addCoding(coding);
codableConcept.setText(scheduleDetail.getTypeDescription());
schedule.addActor(new Reference("Location/" + scheduleDetail.getLocationId()));
Period period = new Period();
period.setStart(scheduleDetail.getStartDateTime());
period.setEnd(scheduleDetail.getEndDateTime());
schedule.setPlanningHorizon(period);
// 1.2.7 remove comment
// schedule.setComment(scheduleDetail.getComment());
// 1.2.7 add schedule type description as service category
schedule.setServiceCategory(new CodeableConcept().setText(scheduleDetail.getTypeDescription()));
return schedule;
}
use of org.hl7.fhir.dstu3.model.Type in project gpconnect-demonstrator by nhsconnect.
the class SlotResourceProvider method getSlotsForScheduleIdNoOrganizationTypeOrODS.
/**
* returns any slots not having org type or org id assigned
*
* @param scheduleId
* @param startDateTime
* @param endDateTime
* @return
*/
public List<Slot> getSlotsForScheduleIdNoOrganizationTypeOrODS(String scheduleId, Date startDateTime, Date endDateTime) {
ArrayList<Slot> slots = new ArrayList<>();
List<SlotDetail> slotDetails = slotSearch.findSlotsForScheduleIdNoOrganizationTypeOrODS(Long.valueOf(scheduleId), startDateTime, endDateTime);
if (slotDetails != null && !slotDetails.isEmpty()) {
for (SlotDetail slotDetail : slotDetails) {
slots.add(slotDetailToSlotResourceConverter(slotDetail));
}
}
return slots;
}
use of org.hl7.fhir.dstu3.model.Type in project gpconnect-demonstrator by nhsconnect.
the class SlotResourceProvider method slotDetailToSlotResourceConverter.
private Slot slotDetailToSlotResourceConverter(SlotDetail slotDetail) {
Slot slot = new Slot();
Date lastUpdated = slotDetail.getLastUpdated() == null ? new Date() : slotDetail.getLastUpdated();
String resourceId = String.valueOf(slotDetail.getId());
String versionId = String.valueOf(lastUpdated.getTime());
IdType id = new IdType(resourceId);
slot.setId(id);
slot.getMeta().setVersionId(versionId);
slot.getMeta().addProfile(SystemURL.SD_GPC_SLOT);
slot.setSchedule(new Reference("Schedule/" + slotDetail.getScheduleReference()));
slot.setStart(slotDetail.getStartDateTime());
slot.setEnd(slotDetail.getEndDateTime());
// #218 Date time formats
slot.getStartElement().setPrecision(TemporalPrecisionEnum.SECOND);
slot.getEndElement().setPrecision(TemporalPrecisionEnum.SECOND);
switch(slotDetail.getFreeBusyType().toLowerCase(Locale.UK)) {
case "free":
slot.setStatus(SlotStatus.FREE);
break;
default:
slot.setStatus(SlotStatus.BUSY);
break;
}
String deliveryChannelCode = slotDetail.getDeliveryChannelCode();
ArrayList<Extension> al = new ArrayList<>();
if (deliveryChannelCode != null && !deliveryChannelCode.trim().isEmpty()) {
Extension deliveryChannelExtension = new Extension(SystemURL.SD_EXTENSION_GPC_DELIVERY_CHANNEL, new CodeType(deliveryChannelCode));
al.add(deliveryChannelExtension);
}
slot.setExtension(al);
// 1.2.7 add slot type description as service type
slot.addServiceType(new CodeableConcept().setText(slotDetail.getTypeDisply()));
return slot;
}
use of org.hl7.fhir.dstu3.model.Type in project gpconnect-demonstrator by nhsconnect.
the class AppointmentValidation method validateParticipantType.
/**
* This method is effectively disabled since we dont check against value sets
* This was experimental code that never worked correctly.
* @param participantType
* @return
*/
public Boolean validateParticipantType(CodeableConcept participantType) {
Boolean hasCode = !participantType.isEmpty();
Coding code = participantType.getCodingFirstRep();
Boolean isValid = !hasCode;
if (hasCode) {
// isValid = valueSetValidator.validateCode(code);
isValid = true;
if (!isValid) {
throwUnprocessableEntity422_InvalidResourceException(MessageFormat.format("Invalid Participant Type Code. Code: {0} [Display: {1}, System:{2}]", code.getCode(), code.getDisplay(), code.getSystem()));
}
}
return isValid;
}
use of org.hl7.fhir.dstu3.model.Type in project openmrs-core by openmrs.
the class ORUR01Handler method parseObs.
/**
* Creates the Obs pojo from the OBX message
*
* @param encounter The Encounter object this Obs is a member of
* @param obx The hl7 obx message
* @param obr The parent hl7 or message
* @param uid unique string for this message for any error reporting purposes
* @return Obs pojo with all values filled in
* @throws HL7Exception if there is a parsing exception
* @throws ProposingConceptException if the answer to this obs is a proposed concept
* @should add comments to an observation from NTE segments
* @should add multiple comments for an observation as one comment
* @should add comments to an observation group
*/
private Obs parseObs(Encounter encounter, OBX obx, OBR obr, String uid) throws HL7Exception, ProposingConceptException {
if (log.isDebugEnabled()) {
log.debug("parsing observation: " + obx);
}
Varies[] values = obx.getObservationValue();
// bail out if no values were found
if (values == null || values.length < 1) {
return null;
}
String hl7Datatype = values[0].getName();
if (log.isDebugEnabled()) {
log.debug(" datatype = " + hl7Datatype);
}
Concept concept = getConcept(obx.getObservationIdentifier(), uid);
if (log.isDebugEnabled()) {
log.debug(" concept = " + concept.getConceptId());
}
ConceptName conceptName = getConceptName(obx.getObservationIdentifier());
if (log.isDebugEnabled()) {
log.debug(" concept-name = " + conceptName);
}
Date datetime = getDatetime(obx);
if (log.isDebugEnabled()) {
log.debug(" timestamp = " + datetime);
}
if (datetime == null) {
datetime = encounter.getEncounterDatetime();
}
Obs obs = new Obs();
obs.setPerson(encounter.getPatient());
obs.setConcept(concept);
obs.setEncounter(encounter);
obs.setObsDatetime(datetime);
obs.setLocation(encounter.getLocation());
obs.setCreator(encounter.getCreator());
obs.setDateCreated(encounter.getDateCreated());
// set comments if there are any
StringBuilder comments = new StringBuilder();
ORU_R01_OBSERVATION parent = (ORU_R01_OBSERVATION) obx.getParent();
// iterate over all OBX NTEs
for (int i = 0; i < parent.getNTEReps(); i++) {
for (FT obxComment : parent.getNTE(i).getComment()) {
if (comments.length() > 0) {
comments.append(" ");
}
comments = comments.append(obxComment.getValue());
}
}
// only set comments if there are any
if (StringUtils.hasText(comments.toString())) {
obs.setComment(comments.toString());
}
Type obx5 = values[0].getData();
if ("NM".equals(hl7Datatype)) {
String value = ((NM) obx5).getValue();
if (value == null || value.length() == 0) {
log.warn("Not creating null valued obs for concept " + concept);
return null;
} else if ("0".equals(value) || "1".equals(value)) {
concept = concept.hydrate(concept.getConceptId().toString());
obs.setConcept(concept);
if (concept.getDatatype().isBoolean()) {
obs.setValueBoolean("1".equals(value));
} else if (concept.getDatatype().isNumeric()) {
try {
obs.setValueNumeric(Double.valueOf(value));
} catch (NumberFormatException e) {
throw new HL7Exception(Context.getMessageSourceService().getMessage("ORUR01.error.notnumericConcept", new Object[] { value, concept.getConceptId(), conceptName.getName(), uid }, null), e);
}
} else if (concept.getDatatype().isCoded()) {
Concept answer = "1".equals(value) ? Context.getConceptService().getTrueConcept() : Context.getConceptService().getFalseConcept();
boolean isValidAnswer = false;
Collection<ConceptAnswer> conceptAnswers = concept.getAnswers();
if (conceptAnswers != null && !conceptAnswers.isEmpty()) {
for (ConceptAnswer conceptAnswer : conceptAnswers) {
if (conceptAnswer.getAnswerConcept().getId().equals(answer.getId())) {
obs.setValueCoded(answer);
isValidAnswer = true;
break;
}
}
}
// answer the boolean answer concept was't found
if (!isValidAnswer) {
throw new HL7Exception(Context.getMessageSourceService().getMessage("ORUR01.error.invalidAnswer", new Object[] { answer.toString(), uid }, null));
}
} else {
// throw this exception to make sure that the handler doesn't silently ignore bad hl7 message
throw new HL7Exception(Context.getMessageSourceService().getMessage("ORUR01.error.CannotSetBoolean", new Object[] { obs.getConcept().getConceptId() }, null));
}
} else {
try {
obs.setValueNumeric(Double.valueOf(value));
} catch (NumberFormatException e) {
throw new HL7Exception(Context.getMessageSourceService().getMessage("ORUR01.error.notnumericConcept", new Object[] { value, concept.getConceptId(), conceptName.getName(), uid }, null), e);
}
}
} else if ("CWE".equals(hl7Datatype)) {
log.debug(" CWE observation");
CWE value = (CWE) obx5;
String valueIdentifier = value.getIdentifier().getValue();
log.debug(" value id = " + valueIdentifier);
String valueName = value.getText().getValue();
log.debug(" value name = " + valueName);
if (isConceptProposal(valueIdentifier)) {
if (log.isDebugEnabled()) {
log.debug("Proposing concept");
}
throw new ProposingConceptException(concept, valueName);
} else {
log.debug(" not proposal");
try {
Concept valueConcept = getConcept(value, uid);
obs.setValueCoded(valueConcept);
if (HL7Constants.HL7_LOCAL_DRUG.equals(value.getNameOfAlternateCodingSystem().getValue())) {
Drug valueDrug = new Drug();
valueDrug.setDrugId(Integer.valueOf(value.getAlternateIdentifier().getValue()));
obs.setValueDrug(valueDrug);
} else {
ConceptName valueConceptName = getConceptName(value);
if (valueConceptName != null) {
if (log.isDebugEnabled()) {
log.debug(" value concept-name-id = " + valueConceptName.getConceptNameId());
log.debug(" value concept-name = " + valueConceptName.getName());
}
obs.setValueCodedName(valueConceptName);
}
}
} catch (NumberFormatException e) {
throw new HL7Exception(Context.getMessageSourceService().getMessage("ORUR01.error.InvalidConceptId", new Object[] { valueIdentifier, valueName }, null));
}
}
if (log.isDebugEnabled()) {
log.debug(" Done with CWE");
}
} else if ("CE".equals(hl7Datatype)) {
CE value = (CE) obx5;
String valueIdentifier = value.getIdentifier().getValue();
String valueName = value.getText().getValue();
if (isConceptProposal(valueIdentifier)) {
throw new ProposingConceptException(concept, valueName);
} else {
try {
obs.setValueCoded(getConcept(value, uid));
obs.setValueCodedName(getConceptName(value));
} catch (NumberFormatException e) {
throw new HL7Exception(Context.getMessageSourceService().getMessage("ORUR01.error.InvalidConceptId", new Object[] { valueIdentifier, valueName }, null));
}
}
} else if ("DT".equals(hl7Datatype)) {
DT value = (DT) obx5;
if (value != null) {
Date valueDate = getDate(value.getYear(), value.getMonth(), value.getDay(), 0, 0, 0);
obs.setValueDatetime(valueDate);
} else {
log.warn("Not creating null valued obs for concept " + concept);
return null;
}
} else if ("TS".equals(hl7Datatype)) {
DTM value = ((TS) obx5).getTime();
if (value != null) {
Date valueDate = getDate(value.getYear(), value.getMonth(), value.getDay(), value.getHour(), value.getMinute(), value.getSecond());
obs.setValueDatetime(valueDate);
} else {
log.warn("Not creating null valued obs for concept " + concept);
return null;
}
} else if ("TM".equals(hl7Datatype)) {
TM value = (TM) obx5;
if (value != null) {
Date valueTime = getDate(0, 0, 0, value.getHour(), value.getMinute(), value.getSecond());
obs.setValueDatetime(valueTime);
} else {
log.warn("Not creating null valued obs for concept " + concept);
return null;
}
} else if ("ST".equals(hl7Datatype)) {
ST value = (ST) obx5;
if (value == null || value.getValue() == null || value.getValue().trim().length() == 0) {
log.warn("Not creating null valued obs for concept " + concept);
return null;
}
obs.setValueText(value.getValue());
} else if ("ED".equals(hl7Datatype)) {
ED value = (ED) obx5;
if (value == null || value.getData() == null || !StringUtils.hasText(value.getData().getValue())) {
log.warn("Not creating null valued obs for concept " + concept);
return null;
}
// we need to hydrate the concept so that the EncounterSaveHandler
// doesn't fail since it needs to check if it is a concept numeric
Concept c = Context.getConceptService().getConcept(obs.getConcept().getConceptId());
obs.setConcept(c);
String title = null;
if (obs.getValueCodedName() != null) {
title = obs.getValueCodedName().getName();
}
if (!StringUtils.hasText(title)) {
title = c.getName().getName();
}
obs.setComplexData(new ComplexData(title, value.getData().getValue()));
} else {
// do we need to support BIT just in case it slips thru?
throw new HL7Exception(Context.getMessageSourceService().getMessage("ORUR01.error.UpsupportedObsType", new Object[] { hl7Datatype }, null));
}
return obs;
}
Aggregations