use of org.openmrs.ConceptName 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;
}
use of org.openmrs.ConceptName in project openmrs-core by openmrs.
the class ORUR01Handler method getConceptName.
/**
* Utility method to retrieve the openmrs ConceptName specified in an hl7 message observation
* segment. This method assumes that the check for 99NAM has been done already and is being
* given an openmrs conceptNameId
*
* @param hl7ConceptNameId internal ConceptNameId to look up
* @return ConceptName from the database
* @throws HL7Exception
*/
private ConceptName getConceptName(String hl7ConceptNameId) throws HL7Exception {
ConceptName specifiedConceptName = null;
if (hl7ConceptNameId != null) {
// get the exact concept name specified by the id
try {
Integer conceptNameId = Integer.valueOf(hl7ConceptNameId);
specifiedConceptName = new ConceptName();
specifiedConceptName.setConceptNameId(conceptNameId);
} catch (NumberFormatException e) {
// if it is not a valid number, more than likely it is a bad hl7 message
log.debug("Invalid concept name ID '" + hl7ConceptNameId + "'", e);
}
}
return specifiedConceptName;
}
use of org.openmrs.ConceptName in project openmrs-core by openmrs.
the class ORUR01HandlerTest method processMessage_shouldCreateObsValueCodedName.
/**
* @see ORUR01Handler#processMessage(Message)
*/
@Test
public void processMessage_shouldCreateObsValueCodedName() throws Exception {
ObsService obsService = Context.getObsService();
// the patient that is the focus of
Patient patient = new Patient(3);
// this hl7 message
// the question concept for
Concept concept = new Concept(21);
// "Food assistance for entire family?"
// sanity check to make sure this obs doesn't exist already
Assert.assertEquals(0, obsService.getObservationsByPersonAndConcept(patient, concept).size());
String hl7String = "MSH|^~\\&|FORMENTRY|AMRS.ELD|HL7LISTENER|AMRS.ELD|20090728170332||ORU^R01|gu99yBh4loLX2mh9cHaV|P|2.5|1||||||||4^AMRS.ELD.FORMID\r" + "PID|||3^^^^||Beren^John^Bondo||\r" + "PV1||O|1^Unknown||||1^Super User (admin)|||||||||||||||||||||||||||||||||||||20090714|||||||V\r" + "ORC|RE||||||||20090728165937|1^Super User\r" + "OBR|1|||1238^MEDICAL RECORD OBSERVATIONS^99DCT\r" + "OBX|2|NM|5497^CD4 COUNT^99DCT||123|||||||||20090714\r" + "OBR|3|||23^FOOD CONSTRUCT^99DCT\r" + "OBX|1|CWE|21^FOOD ASSISTANCE FOR ENTIRE FAMILY^99DCT||22^UNKNOWN^99DCT^2471^UNKNOWN^99NAM|||||||||20090714";
Message hl7message = parser.parse(hl7String);
router.processMessage(hl7message);
List<Obs> obss = obsService.getObservationsByPersonAndConcept(patient, concept);
ConceptName name = obss.get(0).getValueCodedName();
Assert.assertNotNull(name);
Assert.assertEquals("The valueCodedName should be 2471", 2471, name.getId().intValue());
}
use of org.openmrs.ConceptName in project openmrs-core by openmrs.
the class HibernateConditionDAOTest method shouldSaveCondition.
@Test
public void shouldSaveCondition() {
CodedOrFreeText codedOrFreeText = new CodedOrFreeText(new Concept(4), new ConceptName(5089), "non coded");
ConditionClinicalStatus clinicalStatus = ConditionClinicalStatus.ACTIVE;
ConditionVerificationStatus verificationStatus = ConditionVerificationStatus.CONFIRMED;
Patient patient = new Patient(2);
Date onsetDate = new Date();
Date endDate = new Date();
Condition previousVersion = dao.getConditionByUuid("2cc6880e-2c46-15e4-9038-a6c5e4d22fb7");
String additionalDetail = "additionalDetail";
int conditionId = 20;
Condition condition = new Condition();
condition.setConditionId(conditionId);
condition.setCondition(codedOrFreeText);
condition.setClinicalStatus(clinicalStatus);
condition.setVerificationStatus(verificationStatus);
condition.setPreviousVersion(previousVersion);
condition.setAdditionalDetail(additionalDetail);
condition.setOnsetDate(onsetDate);
condition.setEndDate(endDate);
condition.setPatient(patient);
dao.saveCondition(condition);
Condition savedCondition = dao.getCondition(conditionId);
assertEquals(additionalDetail, savedCondition.getAdditionalDetail());
assertEquals(conditionId, (int) savedCondition.getConditionId());
assertEquals(onsetDate, savedCondition.getOnsetDate());
assertEquals(endDate, savedCondition.getEndDate());
assertEquals(clinicalStatus, savedCondition.getClinicalStatus());
assertEquals(verificationStatus, savedCondition.getVerificationStatus());
assertEquals(previousVersion, savedCondition.getPreviousVersion());
assertEquals(patient, savedCondition.getPatient());
}
use of org.openmrs.ConceptName in project openmrs-module-coreapps by openmrs.
the class EncounterDiagnosesFragmentControllerTest method testController_createdProperPriorDiagnoses.
@Test
public void testController_createdProperPriorDiagnoses() throws Exception {
EncounterDiagnosesFragmentController controller = new EncounterDiagnosesFragmentController();
ConceptName specificName = new ConceptName("Specific Name", Context.getLocale());
specificName.setId(1);
specificName.setLocalePreferred(true);
Concept conceptForSpecificName = new Concept();
conceptForSpecificName.setId(2);
conceptForSpecificName.addName(specificName);
Concept nonSpecificConcept = new Concept();
nonSpecificConcept.setId(3);
ConceptName nonSpecificConceptName = new ConceptName("Non-specific concept", Context.getLocale());
nonSpecificConceptName.setId(4);
nonSpecificConceptName.setLocalePreferred(true);
nonSpecificConcept.addName(nonSpecificConceptName);
List<Diagnosis> diagnoses = new ArrayList<Diagnosis>();
diagnoses.add(new Diagnosis(new CodedOrFreeTextAnswer(specificName), Diagnosis.Order.PRIMARY));
diagnoses.add(new Diagnosis(new CodedOrFreeTextAnswer(nonSpecificConcept), Diagnosis.Order.SECONDARY));
diagnoses.add(new Diagnosis(new CodedOrFreeTextAnswer("Unknown Disease"), Diagnosis.Order.SECONDARY));
for (Diagnosis d : diagnoses) {
d.setExistingObs(new Obs());
}
FragmentModel model = new FragmentModel();
controller.controller(new TestUiUtils(), null, diagnoses, model);
assertThat(((List<String>) model.getAttribute("jsForExisting")).size(), is(0));
List<String> jsForPrior = (List<String>) model.getAttribute("jsForPrior");
assertThat(jsForPrior.get(0), is("{ diagnosis: diagnoses.CodedOrFreeTextConceptAnswer({\"word\":null,\"conceptName\":{\"id\":1,\"uuid\":\"" + specificName.getUuid() + "\",\"conceptNameType\":\"FULLY_SPECIFIED\",\"name\":\"Specific Name\"},\"concept\":{\"id\":2,\"uuid\":\"" + conceptForSpecificName.getUuid() + "\",\"conceptMappings\":[],\"preferredName\":\"Specific Name\"}}), confirmed: false, primary: true, existingObs: null }"));
assertThat(jsForPrior.get(1), is("{ diagnosis: diagnoses.CodedOrFreeTextConceptAnswer({\"word\":null,\"conceptName\":null,\"concept\":{\"id\":3,\"uuid\":\"" + nonSpecificConcept.getUuid() + "\",\"conceptMappings\":[],\"preferredName\":\"Non-specific concept\"}}), confirmed: false, primary: false, existingObs: null }"));
assertThat(jsForPrior.get(2), is("{ diagnosis: diagnoses.CodedOrFreeTextConceptAnswer('Unknown Disease'), confirmed: false, primary: false, existingObs: null }"));
}
Aggregations