/** * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations under * the License. * * The Original Code is OpenELIS code. * * Copyright (C) The Minnesota Department of Health. All Rights Reserved. * * Contributor(s): CIRG, University of Washington, Seattle WA. */ package us.mn.state.health.lims.result.action.util; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.validator.GenericValidator; import org.apache.struts.action.DynaActionForm; import us.mn.state.health.lims.analysis.dao.AnalysisDAO; import us.mn.state.health.lims.analysis.daoimpl.AnalysisDAOImpl; import us.mn.state.health.lims.analysis.valueholder.Analysis; import us.mn.state.health.lims.analyte.dao.AnalyteDAO; import us.mn.state.health.lims.analyte.daoimpl.AnalyteDAOImpl; import us.mn.state.health.lims.analyte.valueholder.Analyte; import us.mn.state.health.lims.common.exception.LIMSRuntimeException; import us.mn.state.health.lims.common.formfields.FormFields; import us.mn.state.health.lims.common.formfields.FormFields.Field; import us.mn.state.health.lims.common.services.*; import us.mn.state.health.lims.common.services.StatusService.AnalysisStatus; import us.mn.state.health.lims.common.services.StatusService.OrderStatus; import us.mn.state.health.lims.common.services.NoteService.NoteType; import us.mn.state.health.lims.common.services.QAService.QAObservationType; import us.mn.state.health.lims.common.util.*; import us.mn.state.health.lims.common.util.ConfigurationProperties.Property; import us.mn.state.health.lims.dictionary.dao.DictionaryDAO; import us.mn.state.health.lims.dictionary.daoimpl.DictionaryDAOImpl; import us.mn.state.health.lims.dictionary.valueholder.Dictionary; import us.mn.state.health.lims.inventory.action.InventoryUtility; import us.mn.state.health.lims.inventory.form.InventoryKitItem; import us.mn.state.health.lims.observationhistory.dao.ObservationHistoryDAO; import us.mn.state.health.lims.observationhistory.daoimpl.ObservationHistoryDAOImpl; import us.mn.state.health.lims.observationhistory.valueholder.ObservationHistory; import us.mn.state.health.lims.patient.util.PatientUtil; import us.mn.state.health.lims.patient.valueholder.Patient; import us.mn.state.health.lims.patientidentity.valueholder.PatientIdentity; import us.mn.state.health.lims.patientidentitytype.util.PatientIdentityTypeMap; import us.mn.state.health.lims.referral.dao.ReferralDAO; import us.mn.state.health.lims.referral.daoimpl.ReferralDAOImpl; import us.mn.state.health.lims.referral.valueholder.Referral; import us.mn.state.health.lims.result.dao.ResultDAO; import us.mn.state.health.lims.result.dao.ResultInventoryDAO; import us.mn.state.health.lims.result.dao.ResultSignatureDAO; import us.mn.state.health.lims.result.daoimpl.ResultInventoryDAOImpl; import us.mn.state.health.lims.result.daoimpl.ResultSignatureDAOImpl; import us.mn.state.health.lims.result.valueholder.Result; import us.mn.state.health.lims.result.valueholder.ResultInventory; import us.mn.state.health.lims.result.valueholder.ResultSignature; import us.mn.state.health.lims.resultlimits.valueholder.ResultLimit; import us.mn.state.health.lims.sample.valueholder.Sample; import us.mn.state.health.lims.samplehuman.dao.SampleHumanDAO; import us.mn.state.health.lims.samplehuman.daoimpl.SampleHumanDAOImpl; import us.mn.state.health.lims.sampleitem.dao.SampleItemDAO; import us.mn.state.health.lims.sampleitem.valueholder.SampleItem; import us.mn.state.health.lims.sampleqaevent.dao.SampleQaEventDAO; import us.mn.state.health.lims.sampleqaevent.daoimpl.SampleQaEventDAOImpl; import us.mn.state.health.lims.sampleqaevent.valueholder.SampleQaEvent; import us.mn.state.health.lims.statusofsample.util.StatusRules; import us.mn.state.health.lims.systemuser.dao.SystemUserDAO; import us.mn.state.health.lims.systemuser.daoimpl.SystemUserDAOImpl; import us.mn.state.health.lims.systemuser.valueholder.SystemUser; import us.mn.state.health.lims.test.beanItems.TestResultItem; import us.mn.state.health.lims.test.beanItems.TestResultItem.ResultDisplayType; import us.mn.state.health.lims.test.dao.TestDAO; import us.mn.state.health.lims.test.daoimpl.TestDAOImpl; import us.mn.state.health.lims.test.valueholder.Test; //import us.mn.state.health.lims.test.valueholder.TestSection; import us.mn.state.health.lims.testreflex.action.util.TestReflexUtil; import us.mn.state.health.lims.testreflex.valueholder.TestReflex; import us.mn.state.health.lims.testresult.valueholder.TestResult; import java.lang.reflect.InvocationTargetException; import java.util.*; public class ResultsLoadUtility { private static final boolean SORT_FORWARD = true; public static final String TESTKIT = "TestKit"; private static final String NO_PATIENT_NAME = " "; private static final String NO_PATIENT_INFO = " "; private List<Sample> samples; private String currentDate = ""; private PatientService patientService; private Sample currSample; private Set<Integer> excludedAnalysisStatus = new HashSet<Integer>(); private List<Integer> analysisStatusList = new ArrayList<Integer>(); private List<Integer> sampleStatusList = new ArrayList<Integer>(); private List<InventoryKitItem> activeKits; private final ResultDAO resultDAO = DAOImplFactory.getInstance().getResultDAOImpl(); private final DictionaryDAO dictionaryDAO = new DictionaryDAOImpl(); private final ResultSignatureDAO resultSignatureDAO = new ResultSignatureDAOImpl(); private final ResultInventoryDAO resultInventoryDAO = new ResultInventoryDAOImpl(); private final ObservationHistoryDAO observationHistoryDAO = new ObservationHistoryDAOImpl(); private AnalysisDAO analysisDAO = new AnalysisDAOImpl(); private final StatusRules statusRules = new StatusRules(); private boolean inventoryNeeded = false; private static String ANALYTE_CONCLUSION_ID; private static String ANALYTE_CD4_CNT_CONCLUSION_ID; private static final String NUMERIC_RESULT_TYPE = "N"; private static boolean depersonalize = FormFields.getInstance().useField(Field.DepersonalizedResults); private boolean useTechSignature = ConfigurationProperties.getInstance().isPropertyValueEqual(Property.resultTechnicianName, "true"); private static boolean supportReferrals = FormFields.getInstance().useField(Field.ResultsReferral); private static boolean useInitialSampleCondition = FormFields.getInstance().useField(Field.InitialSampleCondition); private boolean useCurrentUserAsTechDefault = ConfigurationProperties.getInstance().isPropertyValueEqual(Property.autoFillTechNameUser, "true"); private String currentUserName = ""; private ReferralDAO referralDAO = new ReferralDAOImpl(); private int reflexGroup = 1; private boolean lockCurrentResults = false; static { AnalyteDAO analyteDAO = new AnalyteDAOImpl(); Analyte analyte = new Analyte(); analyte.setAnalyteName("Conclusion"); analyte = analyteDAO.getAnalyteByName(analyte, false); ANALYTE_CONCLUSION_ID = analyte == null ? "" : analyte.getId(); analyte = new Analyte(); analyte.setAnalyteName("generated CD4 Count"); analyte = analyteDAO.getAnalyteByName(analyte, false); ANALYTE_CD4_CNT_CONCLUSION_ID = analyte == null ? "" : analyte.getId(); } public ResultsLoadUtility(String currentUserId) { if (useCurrentUserAsTechDefault) { SystemUserDAO systemUserDAO = new SystemUserDAOImpl(); SystemUser systemUser = new SystemUser(); systemUser.setId(currentUserId); systemUserDAO.getData(systemUser); if (systemUser.getId() != null) { currentUserName = systemUser.getFirstName() + " " + systemUser.getLastName(); } } } public ResultsLoadUtility( ){} /* * N.B. The patient info is used to determine the limits for the results, * not for including patient information */ public List<TestResultItem> getGroupedTestsForSample(Sample sample, Patient patient) { reflexGroup = 1; activeKits = null; samples = new ArrayList<Sample>(); if (sample != null) { samples.add(sample); } patientService = new PatientService( patient ); return getGroupedTestsForSamples(); } public List<TestResultItem> getGroupedTestsForPatient(Patient patient) { reflexGroup = 1; activeKits = null; inventoryNeeded = false; patientService = new PatientService( patient ); SampleHumanDAO sampleHumanDAO = new SampleHumanDAOImpl(); samples = sampleHumanDAO.getSamplesForPatient(patient.getId()); return getGroupedTestsForSamples( ); } /* * @deprecated -- unsafe to use outside of beans with firstName, lastName, * dob, gender, st, nationalId */ @Deprecated public void addIdentifingPatientInfo(Patient patient, DynaActionForm dynaForm) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { if( patient == null){ return; } PatientIdentityTypeMap identityMap = PatientIdentityTypeMap.getInstance(); List<PatientIdentity> identityList = PatientUtil.getIdentityListForPatient(patient); if (!depersonalize) { PropertyUtils.setProperty(dynaForm, "firstName", patient.getPerson().getFirstName()); PropertyUtils.setProperty(dynaForm, "lastName", patient.getPerson().getLastName()); PropertyUtils.setProperty(dynaForm, "dob", patient.getBirthDateForDisplay()); PropertyUtils.setProperty(dynaForm, "gender", patient.getGender()); } PropertyUtils.setProperty(dynaForm, "st", identityMap.getIdentityValue(identityList, "ST")); PropertyUtils.setProperty(dynaForm, "nationalId", GenericValidator.isBlankOrNull(patient.getNationalId()) ? patient.getExternalId() : patient.getNationalId()); } public List<TestResultItem> getUnfinishedTestResultItemsInTestSection(String testSectionId) { List<Analysis> analysisList = analysisDAO.getAllAnalysisByTestSectionAndStatus(testSectionId, analysisStatusList, sampleStatusList); return getGroupedTestsForAnalysisList(analysisList, SORT_FORWARD); } public List<TestResultItem> getGroupedTestsForAnalysisList(List<Analysis> filteredAnalysisList, boolean forwardSort) throws LIMSRuntimeException { activeKits = null; inventoryNeeded = false; reflexGroup = 1; List<TestResultItem> selectedTestList = new ArrayList<TestResultItem>(); for (Analysis analysis : filteredAnalysisList) { patientService = new PatientService( new SampleService( analysis.getSampleItem().getSample() ).getPatient() ); String patientName = ""; String patientInfo; String nationalId = patientService.getNationalId(); if (depersonalize) { patientInfo = GenericValidator.isBlankOrNull(nationalId) ? patientService.getExternalId() : nationalId; } else { patientName = patientService.getLastFirstName(); patientInfo = nationalId + ", " + patientService.getGender() + ", " + patientService.getBirthdayForDisplay(); } currSample = analysis.getSampleItem().getSample(); List<TestResultItem> testResultItemList = getTestResultItemFromAnalysis(analysis, patientName, patientInfo, nationalId); for (TestResultItem selectionItem : testResultItemList) { selectedTestList.add(selectionItem); } } if (forwardSort) { sortByAccessionAndSequence(selectedTestList); } else { reverseSortByAccessionAndSequence(selectedTestList); } setSampleGroupingNumbers(selectedTestList); addUserSelectionReflexes(selectedTestList); return selectedTestList; } private void reverseSortByAccessionAndSequence(List<? extends ResultItem> selectedTest) { Collections.sort(selectedTest, new Comparator<ResultItem>() { public int compare(ResultItem a, ResultItem b) { int accessionSort = b.getSequenceAccessionNumber().compareTo(a.getSequenceAccessionNumber()); if (accessionSort == 0) { //only the accession number sorting is reversed if (!GenericValidator.isBlankOrNull(a.getTestSortOrder()) && !GenericValidator.isBlankOrNull(b.getTestSortOrder())) { try { return Integer.parseInt(a.getTestSortOrder()) - Integer.parseInt(b.getTestSortOrder()); } catch (NumberFormatException e) { return a.getTestName().compareTo(b.getTestName()); } } else { return a.getTestName().compareTo(b.getTestName()); } } return accessionSort; } }); } public void sortByAccessionAndSequence(List<? extends ResultItem> selectedTest) { Collections.sort(selectedTest, new Comparator<ResultItem>() { public int compare(ResultItem a, ResultItem b) { int accessionSort = a.getSequenceAccessionNumber().compareTo(b.getSequenceAccessionNumber()); if (accessionSort == 0) { if( !GenericValidator.isBlankOrNull(a.getTestSortOrder()) && !GenericValidator.isBlankOrNull(b.getTestSortOrder())){ try { return Integer.parseInt(a.getTestSortOrder()) - Integer.parseInt(b.getTestSortOrder()); } catch (NumberFormatException e) { return a.getTestName().compareTo(b.getTestName()); } }else if( !GenericValidator.isBlankOrNull(a.getTestName()) && !GenericValidator.isBlankOrNull(b.getTestName())){ return a.getTestName().compareTo(b.getTestName()); } } return accessionSort; } }); } public void setSampleGroupingNumbers(List<? extends ResultItem> selectedTests) { int groupingNumber = 1; // the header is always going to be 0 String currentSequenceAccession = ""; for (ResultItem item : selectedTests) { if (!currentSequenceAccession.equals(item.getSequenceAccessionNumber()) || item.getIsGroupSeparator()) { groupingNumber++; currentSequenceAccession = item.getSequenceAccessionNumber(); item.setShowSampleDetails(true); } else { item.setShowSampleDetails(false); } item.setSampleGroupingNumber(groupingNumber); } } @SuppressWarnings("unchecked") public List<Test> getTestsInSection(String id) { TestDAO testDAO = new TestDAOImpl(); return testDAO.getTestsByTestSection(id); } private List<TestResultItem> getTestResultItemFromAnalysis(Analysis analysis, String patientName, String patientInfo, String nationalId) throws LIMSRuntimeException { List<TestResultItem> testResultList = new ArrayList<TestResultItem>(); SampleItem sampleItem = analysis.getSampleItem(); List<Result> resultList = resultDAO.getResultsByAnalysis(analysis); ResultInventory testKit = null; String techSignature = ""; String techSignatureId = ""; if (resultList == null) { return testResultList; } // For historical reasons we add a null member to the collection if it // is empty // this should be refactored. // The result list are results associated with the analysis, if there is // none we want // to present the user with a blank one if (resultList.isEmpty()) { resultList.add(null); } boolean multiSelectionResult = false; for (Result result : resultList) { // If the parentResult has a value then this result was handled with // the parent if (result != null && result.getParentResult() != null) { continue; } if (result != null) { if (useTechSignature) { List<ResultSignature> signatures = resultSignatureDAO.getResultSignaturesByResults(resultList); for (ResultSignature signature : signatures) { //we no longer use supervisor signature but there may be some in db if (!signature.getIsSupervisor()) { techSignature = signature.getNonUserName(); techSignatureId = signature.getId(); } } } testKit = getInventoryForResult(result); multiSelectionResult = TypeOfTestResultService.ResultType.isMultiSelectVariant( result.getResultType()); } String initialConditions = getInitialSampleConditionString(sampleItem); NoteType[] noteTypes = { NoteType.EXTERNAL, NoteType.INTERNAL, NoteType.REJECTION_REASON, NoteType.NON_CONFORMITY}; String notes = new NoteService( analysis ).getNotesAsString( true, true, "<br/>", noteTypes, false ); TestResultItem resultItem = createTestResultItem(new AnalysisService( analysis ), testKit, notes, sampleItem.getSortOrder(), result, sampleItem.getSample().getAccessionNumber(), patientName, patientInfo, techSignature, techSignatureId, initialConditions, TypeOfSampleService.getTypeOfSampleNameForId(sampleItem.getTypeOfSampleId())); resultItem.setNationalId(nationalId); testResultList.add(resultItem); if (multiSelectionResult) { break; } } return testResultList; } private String getInitialSampleConditionString(SampleItem sampleItem) { if (useInitialSampleCondition) { List<ObservationHistory> observationList = observationHistoryDAO.getObservationHistoriesBySampleItemId(sampleItem.getId()); StringBuilder conditions = new StringBuilder(); for (ObservationHistory observation : observationList) { Dictionary dictionary = dictionaryDAO.getDictionaryById(observation.getValue()); if (dictionary != null) { conditions.append(dictionary.getLocalizedName()); conditions.append(", "); } } if (conditions.length() > 2) { return conditions.substring(0, conditions.length() - 2); } } return null; } private ResultInventory getInventoryForResult(Result result) throws LIMSRuntimeException { List<ResultInventory> inventoryList = resultInventoryDAO.getResultInventorysByResult(result); return inventoryList.size() > 0 ? inventoryList.get(0) : null; } private List<TestResultItem> getGroupedTestsForSamples() { List<TestResultItem> testList = new ArrayList<TestResultItem>(); TestResultItem[] tests = getSortedTestsFromSamples(); String currentAccessionNumber = ""; for ( TestResultItem testItem : tests) { if (!currentAccessionNumber.equals(testItem.getAccessionNumber())) { TestResultItem separatorItem = new TestResultItem(); separatorItem.setIsGroupSeparator( true ); separatorItem.setAccessionNumber( testItem.getAccessionNumber() ); separatorItem.setReceivedDate( testItem.getReceivedDate() ); testList.add(separatorItem); currentAccessionNumber = testItem.getAccessionNumber(); reflexGroup++; } testList.add(testItem); } return testList; } private TestResultItem[] getSortedTestsFromSamples() { List<TestResultItem> testList = new ArrayList<TestResultItem>(); for (Sample sample : samples) { currSample = sample; List<SampleItem> sampleItems = getSampleItemsForSample(sample); for (SampleItem item : sampleItems) { List<Analysis> analysisList = getAnalysisForSampleItem(item); for (Analysis analysis : analysisList) { List<TestResultItem> selectedItemList = getTestResultItemFromAnalysis(analysis, NO_PATIENT_NAME, NO_PATIENT_INFO, ""); for (TestResultItem selectedItem : selectedItemList) { testList.add(selectedItem); } } } } reverseSortByAccessionAndSequence(testList); setSampleGroupingNumbers(testList); addUserSelectionReflexes(testList); TestResultItem[] testArray = new TestResultItem[testList.size()]; testList.toArray(testArray); return testArray; } private void addUserSelectionReflexes(List<TestResultItem> testList) { TestReflexUtil reflexUtil = new TestReflexUtil(); Map<String, TestResultItem> groupedSibReflexMapping = new HashMap<String, TestResultItem>(); for (TestResultItem resultItem : testList) { //N.B. showSampleDetails should be renamed. It means that it is the first result for that group of accession numbers if (resultItem.isShowSampleDetails()) { groupedSibReflexMapping = new HashMap<String, TestResultItem>(); reflexGroup++; } if (resultItem.isReflexGroup()) { resultItem.setReflexParentGroup(reflexGroup); } List<TestReflex> reflexList = reflexUtil.getPossibleUserChoiceTestReflexsForTest(resultItem.getTestId()); resultItem.setUserChoiceReflex(reflexList.size() > 0); boolean possibleSibs = !groupedSibReflexMapping.isEmpty(); for (TestReflex testReflex : reflexList) { if (!GenericValidator.isBlankOrNull(testReflex.getSiblingReflexId())) { if (possibleSibs) { TestResultItem sibTestResultItem = groupedSibReflexMapping.get(testReflex.getSiblingReflexId()); if (sibTestResultItem != null) { Random r = new Random(); String key1 = Long.toString(Math.abs(r.nextLong()), 36); String key2 = Long.toString(Math.abs(r.nextLong()), 36); sibTestResultItem.setThisReflexKey(key1); sibTestResultItem.setSiblingReflexKey(key2); resultItem.setThisReflexKey(key2); resultItem.setSiblingReflexKey(key1); break; } } groupedSibReflexMapping.put(testReflex.getId(), resultItem); } } } } private List<SampleItem> getSampleItemsForSample(Sample sample) { SampleItemDAO sampleItemDAO = DAOImplFactory.getInstance().getSampleItemDAOImpl(); return sampleItemDAO.getSampleItemsBySampleId(sample.getId()); } private List<Analysis> getAnalysisForSampleItem(SampleItem item) { return analysisDAO.getAnalysesBySampleItemsExcludingByStatusIds(item, excludedAnalysisStatus); } private TestResultItem createTestResultItem(AnalysisService analysisService, ResultInventory testKit, String notes, String sequenceNumber, Result result, String accessionNumber, String patientName, String patientInfo, String techSignature, String techSignatureId, String initialSampleConditions, String sampleType) { TestService testService = new TestService( analysisService.getTest() ); ResultLimit resultLimit = new ResultLimitService().getResultLimitForTestAndPatient(testService.getTest(), patientService.getPatient()); String receivedDate = currSample == null ? getCurrentDate() : currSample.getReceivedDateForDisplay(); String testMethodName = testService.getTestMethodName(); List<TestResult> testResults = testService.getPossibleTestResults(); String testKitId = null; String testKitInventoryId = null; Result testKitResult = new Result(); boolean testKitInactive = false; if (testKit != null) { testKitId = testKit.getId(); testKitInventoryId = testKit.getInventoryLocationId(); testKitResult.setId(testKit.getResultId()); resultDAO.getData(testKitResult); testKitInactive = kitNotInActiveKitList(testKitInventoryId); } String displayTestName = analysisService.getTestDisplayName( ); boolean isConclusion = false; boolean isCD4Conclusion = false; if (result != null && result.getAnalyte() != null) { isConclusion = result.getAnalyte().getId().equals(ANALYTE_CONCLUSION_ID); isCD4Conclusion = result.getAnalyte().getId().equals(ANALYTE_CD4_CNT_CONCLUSION_ID); if (isConclusion) { displayTestName = StringUtil.getMessageForKey("result.conclusion"); } else if (isCD4Conclusion) { displayTestName = StringUtil.getMessageForKey("result.conclusion.cd4"); } } String referralId = null; String referralReasonId = null; boolean referralCanceled = false; if (supportReferrals) { if (analysisService.getAnalysis() != null) { Referral referral = referralDAO.getReferralByAnalysisId(analysisService.getAnalysis().getId()); if (referral != null) { referralCanceled = referral.isCanceled(); referralId = referral.getId(); if (!referral.isCanceled()) { referralReasonId = referral.getReferralReasonId(); } } } } String uom = testService.getUOM( isCD4Conclusion ); String testDate = GenericValidator.isBlankOrNull(analysisService.getCompletedDateForDisplay()) ? getCurrentDate() : analysisService.getCompletedDateForDisplay(); ResultDisplayType resultDisplayType = testService.getDisplayTypeForTestMethod( ); if(resultDisplayType != ResultDisplayType.TEXT){ inventoryNeeded = true; } TestResultItem testItem = new TestResultItem(); testItem.setAccessionNumber(accessionNumber); testItem.setAnalysisId( analysisService.getAnalysis().getId() ); testItem.setSequenceNumber(sequenceNumber); testItem.setReceivedDate(receivedDate); testItem.setTestName(displayTestName); testItem.setTestId( testService.getTest().getId() ); setResultLimitDependencies(resultLimit, testItem, testResults); testItem.setPatientName(patientName); testItem.setPatientInfo(patientInfo ); testItem.setReportable(testService.isReportable()); testItem.setUnitsOfMeasure(uom); testItem.setTestDate(testDate); testItem.setResultDisplayType(resultDisplayType); testItem.setTestMethod(testMethodName); testItem.setAnalysisMethod(analysisService.getAnalysisType()); testItem.setResult(result); testItem.setResultValue( getFormattedResultValue( result )); testItem.setMultiSelectResultValues(analysisService.getJSONMultiSelectResults()); testItem.setAnalysisStatusId(analysisService.getStatusId()); //setDictionaryResults must come after setResultType, it may override it testItem.setResultType(testService.getResultType()); setDictionaryResults( testItem, isConclusion, result, testResults ); testItem.setTechnician(techSignature); testItem.setTechnicianSignatureId(techSignatureId); testItem.setTestKitId(testKitId); testItem.setTestKitInventoryId(testKitInventoryId); testItem.setTestKitInactive(testKitInactive); testItem.setReadOnly( isReadOnly(isConclusion, isCD4Conclusion) && result != null && result.getId() != null); testItem.setReferralId(referralId); testItem.setReferredOut(!GenericValidator.isBlankOrNull(referralId) && !referralCanceled); testItem.setShadowReferredOut( testItem.isReferredOut() ); testItem.setReferralReasonId(referralReasonId); testItem.setReferralCanceled(referralCanceled); testItem.setInitialSampleCondition(initialSampleConditions); testItem.setSampleType(sampleType); testItem.setTestSortOrder(testService.getSortOrder()); testItem.setFailedValidation(statusRules.hasFailedValidation(analysisService.getStatusId())); if (useCurrentUserAsTechDefault && GenericValidator.isBlankOrNull(testItem.getTechnician())) { testItem.setTechnician(currentUserName); } testItem.setReflexGroup(analysisService.getTriggeredReflex()); testItem.setChildReflex(analysisService.getTriggeredReflex() && analysisService.resultIsConclusion( result )); testItem.setPastNotes( notes ); testItem.setDisplayResultAsLog(hasLogValue(testService)); testItem.setNonconforming( analysisService.isParentNonConforming() || StatusService.getInstance().matches(analysisService.getStatusId(), AnalysisStatus.TechnicalRejected )); if(FormFields.getInstance().useField(Field.QaEventsBySection) ) testItem.setNonconforming(getQaEventByTestSection(analysisService.getAnalysis())); Result quantifiedResult = analysisService.getQuantifiedResult(); if( quantifiedResult != null){ testItem.setQualifiedResultId( quantifiedResult.getId() ); testItem.setQualifiedResultValue( quantifiedResult.getValue() ); testItem.setHasQualifiedResult( true ); } if( NUMERIC_RESULT_TYPE.equals( testResults.get( 0 ).getTestResultType() )){ testItem.setSignificantDigits( Integer.parseInt( testResults.get( 0 ).getSignificantDigits() )); } return testItem; } private boolean isReadOnly(boolean isConclusion, boolean isCD4Conclusion) { return isConclusion || isCD4Conclusion || isLockCurrentResults(); } private void setResultLimitDependencies(ResultLimit resultLimit, TestResultItem testItem, List<TestResult> testResults){ if( resultLimit != null){ testItem.setResultLimitId(resultLimit.getId()); testItem.setLowerNormalRange(resultLimit.getLowNormal() == Double.NEGATIVE_INFINITY ? 0 : resultLimit.getLowNormal()); testItem.setUpperNormalRange(resultLimit.getHighNormal() == Double.POSITIVE_INFINITY ? 0 : resultLimit.getHighNormal()); testItem.setLowerAbnormalRange(resultLimit.getLowValid() == Double.NEGATIVE_INFINITY ? 0 : resultLimit.getLowValid()); testItem.setUpperAbnormalRange(resultLimit.getHighValid() == Double.POSITIVE_INFINITY ? 0 : resultLimit.getHighValid()); testItem.setValid(getIsValid(testItem.getResultValue(), resultLimit)); testItem.setNormal(getIsNormal(testItem.getResultValue(), resultLimit)); testItem.setNormalRange( ResultLimitService.getDisplayReferenceRange( resultLimit, testResults.get( 0 ).getSignificantDigits(), " - " )); } } private void setDictionaryResults(TestResultItem testItem, boolean isConclusion, Result result, List<TestResult> testResults) { if (isConclusion) { testItem.setDictionaryResults(getAnyDictionaryValues( result )); } else { setDictionaryResults(testItem, testResults, result); } } private void setDictionaryResults(TestResultItem testItem, List<TestResult> testResults, Result result) { List<IdValuePair> values = null; Dictionary dictionary; if (testResults != null && !testResults.isEmpty() && TypeOfTestResultService.ResultType.isDictionaryVariant( testResults.get( 0 ).getTestResultType() )) { values = new ArrayList<IdValuePair>(); Collections.sort(testResults, new Comparator<TestResult>() { @Override public int compare(TestResult o1, TestResult o2) { if (GenericValidator.isBlankOrNull(o1.getSortOrder()) || GenericValidator.isBlankOrNull(o2.getSortOrder())) { return 1; } return Integer.parseInt(o1.getSortOrder()) - Integer.parseInt(o2.getSortOrder()); } }); String qualifiedDictionaryIds = ""; for (TestResult testResult : testResults) { if ( TypeOfTestResultService.ResultType.isDictionaryVariant( testResult.getTestResultType() )) { dictionary = new Dictionary(); dictionary.setId(testResult.getValue()); dictionaryDAO.getData(dictionary); String displayValue = dictionary.getLocalizedName(); if ("unknown".equals(displayValue)) { displayValue = GenericValidator.isBlankOrNull(dictionary.getLocalAbbreviation()) ? dictionary .getDictEntry() : dictionary.getLocalAbbreviation(); } values.add(new IdValuePair(testResult.getValue(), displayValue)); if (testResult.getIsQuantifiable()) { if( !GenericValidator.isBlankOrNull( qualifiedDictionaryIds )){ qualifiedDictionaryIds += ","; } qualifiedDictionaryIds += testResult.getValue(); setQualifiedValues( testItem, result ); } } } if( !GenericValidator.isBlankOrNull( qualifiedDictionaryIds )){ testItem.setQualifiedDictionaryId( "[" + qualifiedDictionaryIds + "]" ); } } if( !GenericValidator.isBlankOrNull(testItem.getQualifiedResultValue())){ testItem.setHasQualifiedResult( true ); } testItem.setDictionaryResults(values); } private void setQualifiedValues( TestResultItem testItem, Result result ) { if (result != null) { List<Result> results = resultDAO.getChildResults(result.getId()); if (!results.isEmpty()) { Result childResult = results.get(0); testItem.setQualifiedResultId(childResult.getId()); testItem.setQualifiedResultValue(childResult.getValue()); } } } private String getFormattedResultValue( Result result ) { return result != null ? new ResultService(result).getResultValue( false ) : ""; } private boolean hasLogValue(TestService testService){//Analysis analysis, String resultValue) { //TO-DO refactor //if ( ){ // if (GenericValidator.isBlankOrNull(resultValue)) { // return true; // } // try { // Double.parseDouble(resultValue); // return true; // } catch (NumberFormatException e) { // return false; // } // return true; //} //return false; return TestIdentityService.isTestNumericViralLoad( testService.getTest() ); } private List<IdValuePair> getAnyDictionaryValues(Result result) { List<IdValuePair> values = null; if (result != null && TypeOfTestResultService.ResultType.isDictionaryVariant( result.getResultType() )) { values = new ArrayList<IdValuePair>(); Dictionary dictionaryValue = new Dictionary(); dictionaryValue.setId(result.getValue()); dictionaryDAO.getData(dictionaryValue); List<Dictionary> dictionaryList = dictionaryDAO.getDictionaryEntriesByCategoryId(dictionaryValue.getDictionaryCategory() .getId()); for (Dictionary dictionary : dictionaryList) { String displayValue = dictionary.getLocalizedName(); if ("unknown".equals(displayValue)) { displayValue = GenericValidator.isBlankOrNull(dictionary.getLocalAbbreviation()) ? dictionary.getDictEntry() : dictionary.getLocalAbbreviation(); } values.add(new IdValuePair(dictionary.getId(), displayValue)); } } return values; } private boolean getIsValid(String resultValue, ResultLimit resultLimit) { boolean valid = true; if (!GenericValidator.isBlankOrNull(resultValue) && resultLimit != null) { try { double value = Double.valueOf(resultValue); valid = value >= resultLimit.getLowValid() && value <= resultLimit.getHighValid(); } catch (NumberFormatException nfe) { // no-op } } return valid; } private boolean getIsNormal(String resultValue, ResultLimit resultLimit) { boolean normal = true; if (!GenericValidator.isBlankOrNull(resultValue) && resultLimit != null) { try { double value = Double.valueOf(resultValue); normal = value >= resultLimit.getLowNormal() && value <= resultLimit.getHighNormal(); } catch (NumberFormatException nfe) { // no-op } } return normal; } private boolean kitNotInActiveKitList(String testKitId) { List<InventoryKitItem> activeKits = getActiveKits(); for (InventoryKitItem kit : activeKits) { // The locationID is the reference held in the DB if (testKitId.equals(kit.getInventoryLocationId())) { return false; } } return true; } private String getCurrentDate() { if (GenericValidator.isBlankOrNull(currentDate)) { currentDate = DateUtil.getCurrentDateAsText(); } return currentDate; } public boolean inventoryNeeded() { return inventoryNeeded; } public void addExcludedAnalysisStatus(AnalysisStatus status) { excludedAnalysisStatus.add(Integer.parseInt(StatusService.getInstance().getStatusID(status))); } public void addIncludedSampleStatus(OrderStatus status) { sampleStatusList.add(Integer.parseInt(StatusService.getInstance().getStatusID(status))); } public void addIncludedAnalysisStatus(AnalysisStatus status) { analysisStatusList.add(Integer.parseInt(StatusService.getInstance().getStatusID(status))); } private List<InventoryKitItem> getActiveKits() { if (activeKits == null) { InventoryUtility inventoryUtil = new InventoryUtility(); activeKits = inventoryUtil.getExistingActiveInventory(); } return activeKits; } public void setLockCurrentResults(boolean lockCurrentResults) { this.lockCurrentResults = lockCurrentResults; } public boolean isLockCurrentResults() { return lockCurrentResults; } private boolean getQaEventByTestSection(Analysis analysis){ if (analysis.getTestSection()!=null && analysis.getSampleItem().getSample()!=null) { Sample sample=analysis.getSampleItem().getSample(); List<SampleQaEvent> sampleQaEventsList=getSampleQaEvents(sample); for(SampleQaEvent event : sampleQaEventsList){ QAService qa = new QAService(event); if(!GenericValidator.isBlankOrNull(qa.getObservationValue( QAObservationType.SECTION )) && qa.getObservationValue( QAObservationType.SECTION ).equals(analysis.getTestSection().getNameKey())) return true; } } return false; } public List<SampleQaEvent> getSampleQaEvents(Sample sample){ SampleQaEventDAO sampleQaEventDAO = new SampleQaEventDAOImpl(); return sampleQaEventDAO.getSampleQaEventsBySample(sample); } }