us.mn.state.health.lims.referral.action.ReferredOutAction.java Source code

Java tutorial

Introduction

Here is the source code for us.mn.state.health.lims.referral.action.ReferredOutAction.java

Source

/**
 * 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) CIRG, University of Washington, Seattle WA.  All Rights Reserved.
 *
 */
package us.mn.state.health.lims.referral.action;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.validator.GenericValidator;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import us.mn.state.health.lims.common.action.BaseAction;
import us.mn.state.health.lims.common.action.IActionConstants;
import us.mn.state.health.lims.common.services.AnalysisService;
import us.mn.state.health.lims.common.services.DisplayListService;
import us.mn.state.health.lims.common.services.ResultService;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.common.util.IdValuePair;
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.referral.action.beanitems.IReferralResultTest;
import us.mn.state.health.lims.referral.action.beanitems.ReferralItem;
import us.mn.state.health.lims.referral.action.beanitems.ReferredTest;
import us.mn.state.health.lims.referral.dao.ReferralDAO;
import us.mn.state.health.lims.referral.dao.ReferralResultDAO;
import us.mn.state.health.lims.referral.daoimpl.ReferralDAOImpl;
import us.mn.state.health.lims.referral.daoimpl.ReferralResultDAOImpl;
import us.mn.state.health.lims.referral.valueholder.Referral;
import us.mn.state.health.lims.referral.valueholder.ReferralResult;
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.test.valueholder.Test;
import us.mn.state.health.lims.testresult.dao.TestResultDAO;
import us.mn.state.health.lims.testresult.daoimpl.TestResultDAOImpl;
import us.mn.state.health.lims.testresult.valueholder.TestResult;
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.util.TypeOfSampleUtil;
import us.mn.state.health.lims.typeofsample.valueholder.TypeOfSample;
import us.mn.state.health.lims.typeoftestresult.valueholder.TypeOfTestResult.ResultType;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;

public class ReferredOutAction extends BaseAction {

    private static ReferralResultDAO referralResultDAO = new ReferralResultDAOImpl();
    private static TypeOfSampleDAO typeOfSampleDAO = new TypeOfSampleDAOImpl();
    private static ResultDAO resultDAO = new ResultDAOImpl();
    private static DictionaryDAO dictionaryDAO = new DictionaryDAOImpl();
    private List<NonNumericTests> nonNumericTests;

    @Override
    protected String getPageSubtitleKey() {
        return "referral.out.manage";
    }

    @Override
    protected String getPageTitleKey() {
        return "referral.out.manage";
    }

    @Override
    protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        DynaActionForm dynaForm = (DynaActionForm) form;

        request.getSession().setAttribute(SAVE_DISABLED, TRUE);

        List<ReferralItem> referralItems = getReferralItems();
        PropertyUtils.setProperty(dynaForm, "referralItems", referralItems);
        PropertyUtils.setProperty(dynaForm, "referralReasons",
                DisplayListService.getList(DisplayListService.ListType.REFERRAL_REASONS));
        PropertyUtils.setProperty(dynaForm, "referralOrganizations",
                DisplayListService.getListWithLeadingBlank(DisplayListService.ListType.REFERRAL_ORGANIZATIONS));

        //remove at some point
        nonNumericTests = getNonNumericTests(referralItems);

        fillInDictionaryValuesForReferralItems(referralItems);

        return mapping.findForward(IActionConstants.FWD_SUCCESS);
    }

    private void fillInDictionaryValuesForReferralItems(List<ReferralItem> referralItems) {
        for (ReferralItem referralItem : referralItems) {
            String referredResultType = referralItem.getReferredResultType();
            if (ResultType.isDictionaryVariant(referredResultType)) {
                referralItem.setDictionaryResults(getDictionaryValuesForTest(referralItem.getReferredTestId()));
            }

            if (referralItem.getAdditionalTests() != null) {
                for (ReferredTest test : referralItem.getAdditionalTests()) {
                    if (ResultType.isDictionaryVariant(test.getReferredResultType())) {
                        test.setDictionaryResults(getDictionaryValuesForTest(test.getReferredTestId()));
                    }
                }
            }
        }

    }

    private List<ReferralItem> getReferralItems() {
        List<ReferralItem> referralItems = new ArrayList<ReferralItem>();
        ReferralDAO referralDAO = new ReferralDAOImpl();

        List<Referral> referralList = referralDAO.getAllUncanceledOpenReferrals();

        for (Referral referral : referralList) {
            ReferralItem referralItem = getReferralItem(referral);
            if (referralItem != null) {
                referralItems.add(referralItem);
            }
        }

        Collections.sort(referralItems, new ReferralComparator());

        return referralItems;
    }

    private final static class ReferralComparator implements Comparator<ReferralItem> {
        @Override
        public int compare(ReferralItem left, ReferralItem right) {
            int result = left.getAccessionNumber().compareTo(right.getAccessionNumber());
            if (result != 0) {
                return result;
            }
            result = left.getSampleType().compareTo(right.getSampleType());
            if (result != 0) {
                return result;
            }
            return left.getReferringTestName().compareTo(right.getReferringTestName());
        }
    }

    private ReferralItem getReferralItem(Referral referral) {
        boolean allReferralResultsHaveResults = true;
        List<ReferralResult> referralResults = referralResultDAO.getReferralResultsForReferral(referral.getId());
        for (ReferralResult referralResult : referralResults) {
            if (referralResult.getResult() == null
                    || GenericValidator.isBlankOrNull(referralResult.getResult().getValue())) {
                allReferralResultsHaveResults = false;
                break;
            }
        }

        if (allReferralResultsHaveResults) {
            return null;
        }

        ReferralItem referralItem = new ReferralItem();

        AnalysisService analysisService = new AnalysisService(referral.getAnalysis());

        referralItem.setCanceled(false);
        referralItem.setReferredResultType("N");
        referralItem.setAccessionNumber(analysisService.getOrderAccessionNumber());

        TypeOfSample typeOfSample = analysisService.getTypeOfSample();
        referralItem.setSampleType(typeOfSample.getLocalizedName());

        referralItem.setReferringTestName(analysisService.getAnalysis().getTest().getLocalizedName());
        List<Result> resultList = analysisService.getResults();
        String resultString = "";

        if (!resultList.isEmpty()) {
            Result result = resultList.get(0);
            resultString = getAppropriateResultValue(resultList);
            referralItem.setInLabResultId(result.getId());
        }

        referralItem.setReferralId(referral.getId());
        if (!referralResults.isEmpty()) {
            referralResults = setReferralItemForNextTest(referralItem, referralResults);
            if (!referralResults.isEmpty()) {
                referralItem.setAdditionalTests(getAdditionalReferralTests(referralResults));
            }
        }
        referralItem.setReferralResults(resultString);
        referralItem.setReferralDate(DateUtil.convertTimestampToStringDate(referral.getRequestDate()));
        referralItem.setReferredSendDate(getSendDateOrDefault(referral));
        referralItem.setReferrer(referral.getRequesterName());
        referralItem.setReferralReasonId(referral.getReferralReasonId());
        referralItem.setTestSelectionList(getTestsForTypeOfSample(typeOfSample));
        referralItem.setReferralId(referral.getId());
        if (referral.getOrganization() != null) {
            referralItem.setReferredInstituteId(referral.getOrganization().getId());
        }
        String notes = analysisService.getNotesAsString(true, true, "<br/>", false);
        if (notes != null) {
            referralItem.setPastNotes(notes);
        }

        return referralItem;
    }

    private String getSendDateOrDefault(Referral referral) {
        if (referral.getSentDate() == null) {
            return DateUtil.getCurrentDateAsText();
        } else {
            return DateUtil.convertTimestampToStringDate(referral.getSentDate());
        }
    }

    private List<ReferredTest> getAdditionalReferralTests(List<ReferralResult> referralResults) {
        List<ReferredTest> additionalTestList = new ArrayList<ReferredTest>();

        while (!referralResults.isEmpty()) {
            ReferralResult referralResult = referralResults.get(0); // use the top one to load various bits of information. 
            ReferredTest referralTest = new ReferredTest();
            referralTest.setReferralId(referralResult.getReferralId());
            referralResults = setReferralItemForNextTest(referralTest, referralResults); // remove one or more referralResults from the list as needed (for multiResults).
            referralTest.setReferredReportDate(
                    DateUtil.convertTimestampToStringDate(referralResult.getReferralReportDate()));
            referralTest.setReferralResultId(referralResult.getId());
            additionalTestList.add(referralTest);
        }
        return additionalTestList;
    }

    /**
     * Move everything appropriate to the referralItem including one or more of the referralResults from the given list.
     * Note: This method removes an item from the referralResults list.
     * @param referralItem The source item
     * @param referralResults The created list
     */
    private List<ReferralResult> setReferralItemForNextTest(IReferralResultTest referralItem,
            List<ReferralResult> referralResults) {

        ReferralResult nextTestFirstResult = referralResults.remove(0);
        List<ReferralResult> resultsForOtherTests = new ArrayList<ReferralResult>(referralResults);

        referralItem.setReferredTestId(nextTestFirstResult.getTestId());
        referralItem.setReferredTestIdShadow(referralItem.getReferredTestId());
        referralItem.setReferredReportDate(
                DateUtil.convertTimestampToStringDate(nextTestFirstResult.getReferralReportDate()));
        //We can not use ResultService because that assumes the result is for an analysis, not a referral
        Result result = nextTestFirstResult.getResult();

        String resultType = (result != null) ? result.getResultType() : "N";
        referralItem.setReferredResultType(resultType);
        if (!ResultType.isMultiSelectVariant(resultType)) {
            if (result != null) {
                String resultValue = GenericValidator.isBlankOrNull(result.getValue()) ? "" : result.getValue();
                referralItem.setReferredResult(resultValue);
                referralItem.setReferredDictionaryResult(resultValue);
            }
        } else {
            ArrayList<Result> resultList = new ArrayList<Result>();
            resultList.add(nextTestFirstResult.getResult());

            for (ReferralResult referralResult : referralResults) {
                if (nextTestFirstResult.getTestId().equals(referralResult.getTestId())
                        && !GenericValidator.isBlankOrNull(referralResult.getResult().getValue())) {
                    resultList.add(referralResult.getResult());
                    resultsForOtherTests.remove(referralResult);
                }
            }

            referralItem.setMultiSelectResultValues(ResultService.getJSONStringForMultiSelect(resultList));
        }

        return resultsForOtherTests;
    }

    private List<IdValuePair> getDictionaryValuesForTest(String testId) {
        if (!GenericValidator.isBlankOrNull(testId)) {
            for (NonNumericTests test : nonNumericTests) {
                if (testId.equals(test.testId)) {
                    return test.dictionaryValues;
                }
            }
        }
        return new ArrayList<IdValuePair>();
    }

    private String getAppropriateResultValue(List<Result> results) {
        Result result = results.get(0);
        if (ResultType.DICTIONARY.matches(result.getResultType())) {
            Dictionary dictionary = dictionaryDAO.getDictionaryById(result.getValue());
            if (dictionary != null) {
                return dictionary.getLocalizedName();
            }
        } else if (ResultType.isMultiSelectVariant(result.getResultType())) {
            Dictionary dictionary = new Dictionary();
            StringBuilder multiResult = new StringBuilder();

            for (Result subResult : results) {
                dictionary.setId(subResult.getValue());
                dictionaryDAO.getData(dictionary);

                if (dictionary.getId() != null) {
                    multiResult.append(dictionary.getLocalizedName());
                    multiResult.append(", ");
                }
            }

            if (multiResult.length() > 0) {
                multiResult.setLength(multiResult.length() - 2); //remove last ", "
            }

            return multiResult.toString();
        } else {
            String resultValue = GenericValidator.isBlankOrNull(result.getValue()) ? "" : result.getValue();

            if (!GenericValidator.isBlankOrNull(resultValue)
                    && result.getAnalysis().getTest().getUnitOfMeasure() != null) {
                resultValue += " " + result.getAnalysis().getTest().getUnitOfMeasure().getName();
            }

            return resultValue;
        }

        return "";
    }

    private List<IdValuePair> getTestsForTypeOfSample(TypeOfSample typeOfSample) {
        List<Test> testList = TypeOfSampleUtil.getTestListBySampleTypeId(typeOfSample.getId(), null, false);

        List<IdValuePair> valueList = new ArrayList<IdValuePair>();

        for (Test test : testList) {
            if (test.getOrderable()) {
                valueList.add(new IdValuePair(test.getId(), test.getLocalizedName()));
            }
        }

        return valueList;
    }

    private List<NonNumericTests> getNonNumericTests(List<ReferralItem> referralItems) {
        DictionaryDAO dictionaryDAO = new DictionaryDAOImpl();
        Set<String> testIdSet = new HashSet<String>();

        for (ReferralItem item : referralItems) {
            for (IdValuePair pair : item.getTestSelectionList()) {
                testIdSet.add(pair.getId());
            }
        }

        List<NonNumericTests> nonNumericTestList = new ArrayList<NonNumericTests>();
        TestResultDAO testResultDAO = new TestResultDAOImpl();
        for (String testId : testIdSet) {
            List<TestResult> testResultList = testResultDAO.getActiveTestResultsByTest(testId);

            if (!(testResultList == null || testResultList.isEmpty())) {
                NonNumericTests nonNumericTests = new NonNumericTests();

                nonNumericTests.testId = testId;
                nonNumericTests.testType = testResultList.get(0).getTestResultType();
                boolean isSelectList = ResultType.isDictionaryVariant(nonNumericTests.testType);

                if (isSelectList) {
                    List<IdValuePair> dictionaryValues = new ArrayList<IdValuePair>();
                    for (TestResult testResult : testResultList) {
                        if (ResultType.isDictionaryVariant(testResult.getTestResultType())) {
                            String resultName = dictionaryDAO.getDictionaryById(testResult.getValue())
                                    .getLocalizedName();
                            dictionaryValues.add(new IdValuePair(testResult.getValue(), resultName));
                        }
                    }

                    nonNumericTests.dictionaryValues = dictionaryValues;
                }

                if (nonNumericTests.testType != null) {
                    nonNumericTestList.add(nonNumericTests);
                }
            }

        }

        return nonNumericTestList;
    }

    public class NonNumericTests {
        public String testId;
        public String testType;
        public List<IdValuePair> dictionaryValues;
    }
}