From 5cd4dd0b3925ec3b54ef1e02ec30b19f4a394eb2 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Thu, 18 Jul 2024 15:29:07 +0530 Subject: [PATCH] BAH-4029 | Logging better logs in cases of outside range values or invalid values for coded answers --- .../laborder/mapper/LabOrderResultMapper.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/mapper/LabOrderResultMapper.java b/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/mapper/LabOrderResultMapper.java index 9113a523a2..8f3dd5cfbf 100644 --- a/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/mapper/LabOrderResultMapper.java +++ b/bahmni-emr-api/src/main/java/org/openmrs/module/bahmniemrapi/laborder/mapper/LabOrderResultMapper.java @@ -4,6 +4,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.Concept; +import org.openmrs.ConceptNumeric; import org.openmrs.Obs; import org.openmrs.Order; import org.openmrs.api.APIException; @@ -14,6 +15,7 @@ import java.text.ParseException; import java.util.Date; +import java.util.Optional; import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.apache.commons.lang3.StringUtils.isNotBlank; @@ -21,6 +23,7 @@ @Component public class LabOrderResultMapper { private static final Log log = LogFactory.getLog(LabOrderResultMapper.class); + private static final String EMPTY_STRING = ""; public static final String LAB_RESULT = "LAB_RESULT"; public static final String LAB_ABNORMAL = "LAB_ABNORMAL"; public static final String LAB_MINNORMAL = "LAB_MINNORMAL"; @@ -72,13 +75,14 @@ private Obs newResultObs(Order testOrder, Date obsDate, Concept concept, LabOrde obs.setConcept(concept); obs.setOrder(testOrder); obs.setObsDatetime(obsDate); + String accessionUuid = Optional.ofNullable(labOrderResult.getAccessionUuid()).orElseGet(() -> Optional.ofNullable(obs.getOrder()).map(Order::getAccessionNumber).orElse(EMPTY_STRING)); if (concept.getDatatype().getHl7Abbreviation().equals("CWE")) { String resultUuid = labOrderResult.getResultUuid(); Concept conceptAnswer = isEmpty(resultUuid) ? null : conceptService.getConceptByUuid(resultUuid); obs.setValueCoded(conceptAnswer); if (conceptAnswer == null) { - log.warn(String.format("Concept is not available in OpenMRS for ConceptUuid : [%s] , In Accession : [%s]" - , resultUuid,labOrderResult.getAccessionUuid())); + log.error(String.format("Concept [%s] does not not have coded answer with ConceptUuid [%s] in OpenMRS, In Accession [%s]", + obs.getConcept().getName(), resultUuid, accessionUuid)); return null; } return obs; @@ -88,9 +92,28 @@ private Obs newResultObs(Order testOrder, Date obsDate, Concept concept, LabOrde return null; } obs.setValueAsString(labOrderResult.getResult()); + checkResultRangesForAbsolutes(obs, accessionUuid); return obs; } + /** + * This method just logs error if the results are out of absolute ranges. This will be errored out (ValidationException) + * by openmrs by the {@link org.openmrs.validator.ObsValidator} during save + */ + private void checkResultRangesForAbsolutes(Obs obs, String accessionUuid) { + if (obs.getConcept().isNumeric()) { + if (obs.getValueNumeric() != null) { + ConceptNumeric cn = (ConceptNumeric) obs.getConcept(); + if (cn.getHiAbsolute() != null && cn.getHiAbsolute() < obs.getValueNumeric()) { + log.error(String.format("Test results for [%s] is beyond the absolute high range, in Accession [%s]", cn.getName(), accessionUuid)); + } + if (cn.getLowAbsolute() != null && cn.getLowAbsolute() > obs.getValueNumeric()) { + log.error(String.format("Test results for [%s] is beyond the absolute low range, in Accession [%s]", cn.getName(), accessionUuid)); + } + } + } + } + private Concept getConceptByName(String conceptName) { return conceptService.getConceptByName(conceptName); }