/*
* 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) ITECH, University of Washington, Seattle WA. All Rights Reserved.
*/
package us.mn.state.health.lims.common.services;
import org.apache.commons.validator.GenericValidator;
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.common.services.StatusService.AnalysisStatus;
import us.mn.state.health.lims.common.util.DateUtil;
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.panel.valueholder.Panel;
import us.mn.state.health.lims.patient.valueholder.Patient;
import us.mn.state.health.lims.referencetables.daoimpl.ReferenceTablesDAOImpl;
import us.mn.state.health.lims.result.dao.ResultDAO;
import us.mn.state.health.lims.result.daoimpl.ResultDAOImpl;
import us.mn.state.health.lims.result.valueholder.Result;
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.valueholder.SampleItem;
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.typeofsample.dao.TypeOfSampleDAO;
import us.mn.state.health.lims.typeofsample.daoimpl.TypeOfSampleDAOImpl;
import us.mn.state.health.lims.typeofsample.valueholder.TypeOfSample;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
/**
*/
public class AnalysisService{
private static final AnalysisDAO analysisDAO = new AnalysisDAOImpl();
private static final DictionaryDAO dictionaryDAO = new DictionaryDAOImpl();
private static final ResultDAO resultDAO = new ResultDAOImpl();
private static final TypeOfSampleDAO typeOfSampleDAO = new TypeOfSampleDAOImpl();
private final Analysis analysis;
public static final String TABLE_REFERENCE_ID;
private static final String DEFAULT_ANALYSIS_TYPE = "MANUAL";
static{
TABLE_REFERENCE_ID = new ReferenceTablesDAOImpl().getReferenceTableByName("ANALYSIS").getId();
}
public AnalysisService(Analysis analysis){
this.analysis = analysis;
}
public AnalysisService(String analysisId){
analysis = analysisDAO.getAnalysisById( analysisId );
}
public Analysis getAnalysis(){
return analysis;
}
public String getTestDisplayName( ){
if( analysis == null){return ""; }
Test test = getTest();
String name = TestService.getLocalizedTestNameWithType( test );
TypeOfSample typeOfSample = TypeOfSampleService.getTypeOfSampleForTest(test.getId());
if( typeOfSample != null && typeOfSample.getId().equals( TypeOfSampleService.getTypeOfSampleIdForLocalAbbreviation("Variable"))){
name += "(" + analysis.getSampleTypeName() + ")";
}
String parentResultType = analysis.getParentResult() != null ? analysis.getParentResult().getResultType() : "";
if( TypeOfTestResultService.ResultType.isMultiSelectVariant( parentResultType ) ){
Dictionary dictionary = dictionaryDAO.getDictionaryById( analysis.getParentResult().getValue() );
if( dictionary != null){
String parentResult = dictionary.getLocalAbbreviation();
if( GenericValidator.isBlankOrNull( parentResult )){
parentResult = dictionary.getDictEntry();
}
name = parentResult + " → " + name;
}
}
return name;
}
public String getCSVMultiselectResults(){
if( analysis == null){return ""; }
List<Result> existingResults = resultDAO.getResultsByAnalysis( analysis );
StringBuilder multiSelectBuffer = new StringBuilder();
for( Result existingResult : existingResults ){
if( TypeOfTestResultService.ResultType.isMultiSelectVariant( existingResult.getResultType() )){
multiSelectBuffer.append( existingResult.getValue() );
multiSelectBuffer.append( ',' );
}
}
// remove last ','
multiSelectBuffer.setLength( multiSelectBuffer.length() - 1 );
return multiSelectBuffer.toString();
}
public String getJSONMultiSelectResults(){
return analysis == null ? "" : ResultService.getJSONStringForMultiSelect(resultDAO.getResultsByAnalysis( analysis ));
}
public Result getQuantifiedResult(){
if( analysis == null){return null; }
List<Result> existingResults = resultDAO.getResultsByAnalysis( analysis );
List<String> quantifiableResultsIds = new ArrayList<String>( );
for( Result existingResult : existingResults ){
if( TypeOfTestResultService.ResultType.isDictionaryVariant( existingResult.getResultType() ) ){
quantifiableResultsIds.add( existingResult.getId() );
}
}
for( Result existingResult : existingResults ){
if( !TypeOfTestResultService.ResultType.isDictionaryVariant( existingResult.getResultType() ) &&
existingResult.getParentResult() != null &&
quantifiableResultsIds.contains( existingResult.getParentResult().getId()) &&
!GenericValidator.isBlankOrNull(existingResult.getValue())){
return existingResult;
}
}
return null;
}
public String getCompletedDateForDisplay(){
return analysis == null ? "" : analysis.getCompletedDateForDisplay();
}
public String getAnalysisType(){
return analysis == null ? "" :analysis.getAnalysisType();
}
public String getStatusId(){
return analysis == null ? "" :analysis.getStatusId();
}
public Boolean getTriggeredReflex(){
return analysis == null ? false :analysis.getTriggeredReflex();
}
public boolean resultIsConclusion(Result currentResult){
if( analysis == null || currentResult == null){return false; }
List<Result> results = resultDAO.getResultsByAnalysis(analysis);
if (results.size() == 1) {
return false;
}
Long testResultId = Long.parseLong(currentResult.getId());
// This based on the fact that the conclusion is always added
// after the shared result so if there is a result with a larger id
// then this is not a conclusion
for (Result result : results) {
if (Long.parseLong(result.getId()) > testResultId) {
return false;
}
}
return true;
}
public boolean isParentNonConforming(){
return analysis == null ? false :QAService.isAnalysisParentNonConforming(analysis);
}
public Test getTest(){
return analysis == null ? null :analysis.getTest();
}
public static List<Analysis> getAnalysisStartedOrCompletedInDateRange(Date lowDate, Date highDate){
return analysisDAO.getAnalysisStartedOrCompletedInDateRange(lowDate, highDate);
}
public List<Result> getResults(){
return analysis == null ? new ArrayList<Result>( ) : resultDAO.getResultsByAnalysis( analysis );
}
public boolean hasBeenCorrectedSinceLastPatientReport(){
return analysis == null ? false : analysis.isCorrectedSincePatientReport();
}
public boolean patientReportHasBeenDone(){
return analysis == null ? false : new ReportTrackingService().getLastReportForSample( analysis.getSampleItem().getSample(), ReportTrackingService.ReportType.PATIENT ) != null;
}
public String getNotesAsString( boolean prefixType, boolean prefixTimestamp, String noteSeparator, boolean excludeExternPrefix ){
return analysis == null ? "" : new NoteService( analysis ).getNotesAsString( prefixType, prefixTimestamp, noteSeparator, excludeExternPrefix );
}
public String getOrderAccessionNumber(){
return analysis == null ? "" : analysis.getSampleItem().getSample().getAccessionNumber();
}
public TypeOfSample getTypeOfSample(){
return analysis == null ? null : typeOfSampleDAO.getTypeOfSampleById( analysis.getSampleItem().getTypeOfSampleId() );
}
public Panel getPanel(){
return analysis == null ? null : analysis.getPanel();
}
public TestSection getTestSection(){
return analysis == null ? null : analysis.getTestSection();
}
public static Analysis buildAnalysis(Test test, SampleItem sampleItem){
Analysis analysis = new Analysis();
analysis.setTest(test);
analysis.setIsReportable(test.getIsReportable());
analysis.setAnalysisType(DEFAULT_ANALYSIS_TYPE);
analysis.setRevision("0");
analysis.setStartedDate(DateUtil.getNowAsSqlDate());
analysis.setStatusId(StatusService.getInstance().getStatusID(StatusService.AnalysisStatus.NotStarted));
analysis.setSampleItem(sampleItem);
analysis.setTestSection(test.getTestSection());
analysis.setSampleTypeName(sampleItem.getTypeOfSample().getLocalizedName());
return analysis;
}
}