/**
* 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;
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.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.action.BaseAction;
import us.mn.state.health.lims.common.services.DisplayListService;
import us.mn.state.health.lims.common.services.StatusService;
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.util.ConfigurationProperties;
import us.mn.state.health.lims.common.util.ConfigurationProperties.Property;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.inventory.action.InventoryUtility;
import us.mn.state.health.lims.inventory.form.InventoryKitItem;
import us.mn.state.health.lims.result.action.util.ResultsLoadUtility;
import us.mn.state.health.lims.result.action.util.ResultsPaging;
import us.mn.state.health.lims.sample.dao.SampleDAO;
import us.mn.state.health.lims.sample.daoimpl.SampleDAOImpl;
import us.mn.state.health.lims.sample.valueholder.Sample;
import us.mn.state.health.lims.sampleitem.dao.SampleItemDAO;
import us.mn.state.health.lims.sampleitem.daoimpl.SampleItemDAOImpl;
import us.mn.state.health.lims.sampleitem.valueholder.SampleItem;
import us.mn.state.health.lims.test.beanItems.TestResultItem;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class StatusResultsAction extends BaseAction implements Serializable {
private static final long serialVersionUID = 1L;
private static final boolean REVERSE_SORT_ORDER = false;
private final AnalysisDAO analysisDAO = new AnalysisDAOImpl();
private final SampleDAO sampleDAO = new SampleDAOImpl();
private ResultsLoadUtility resultsUtility;
private final InventoryUtility inventoryUtility = new InventoryUtility();
private static final ConfigurationProperties configProperties = ConfigurationProperties.getInstance();
private static Set<Integer> excludedStatusIds;
static {
// currently this is the only one being excluded for Haiti_LNSP. If it
// gets more complicate use the status sets
excludedStatusIds = new HashSet<Integer>();
excludedStatusIds.add(Integer.parseInt(StatusService.getInstance().getStatusID(AnalysisStatus.Canceled)));
}
@Override
protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
resultsUtility = new ResultsLoadUtility(currentUserId);
String forward = FWD_SUCCESS;
request.getSession().setAttribute(SAVE_DISABLED, TRUE);
String newRequest = request.getParameter("blank");
DynaActionForm dynaForm = (DynaActionForm) form;
PropertyUtils.setProperty(dynaForm, "referralReasons", DisplayListService.getList( DisplayListService.ListType.REFERRAL_REASONS));
PropertyUtils.setProperty( dynaForm, "rejectReasons", DisplayListService.getNumberedListWithLeadingBlank( DisplayListService.ListType.REJECTION_REASONS ) );
ResultsPaging paging = new ResultsPaging();
String newPage = request.getParameter("page");
if (GenericValidator.isBlankOrNull(newPage)) {
List<TestResultItem> tests;
if (GenericValidator.isBlankOrNull(newRequest) || newRequest.equals("false")) {
tests = setSearchResults(dynaForm);
if (configProperties.isPropertyValueEqual(Property.PATIENT_DATA_ON_RESULTS_BY_ROLE, "true")
&& !userHasPermissionForModule(request, "PatientResults")) {
for (TestResultItem resultItem : tests) {
resultItem.setPatientInfo("---");
}
}
paging.setDatabaseResults(request, dynaForm, tests);
} else {
setEmptyResults(dynaForm);
}
setSelectionLists(dynaForm);
} else {
paging.page(request, dynaForm, newPage);
}
return mapping.findForward(forward);
}
private List<TestResultItem> setSearchResults(DynaActionForm dynaForm) throws IllegalAccessException, InvocationTargetException,
NoSuchMethodException {
List<TestResultItem> tests = getSelectedTests(dynaForm);
PropertyUtils.setProperty(dynaForm, "searchFinished", Boolean.TRUE);
if (resultsUtility.inventoryNeeded()) {
addInventory(dynaForm);
PropertyUtils.setProperty(dynaForm, "displayTestKit", true);
} else {
addEmptyInventoryList(dynaForm);
PropertyUtils.setProperty(dynaForm, "displayTestKit", false);
}
return tests;
}
private void setEmptyResults(DynaActionForm dynaForm) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
PropertyUtils.setProperty(dynaForm, "testResult", new ArrayList<TestResultItem>());
PropertyUtils.setProperty(dynaForm, "displayTestKit", false);
PropertyUtils.setProperty(dynaForm, "collectionDate", "");
PropertyUtils.setProperty(dynaForm, "recievedDate", "");
PropertyUtils.setProperty(dynaForm, "selectedAnalysisStatus", "");
PropertyUtils.setProperty(dynaForm, "selectedTest", "");
PropertyUtils.setProperty(dynaForm, "searchFinished", Boolean.FALSE);
}
private void addInventory(DynaActionForm dynaForm) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
List<InventoryKitItem> list = inventoryUtility.getExistingActiveInventory();
PropertyUtils.setProperty(dynaForm, "inventoryItems", list);
}
private void addEmptyInventoryList(DynaActionForm dynaForm) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
PropertyUtils.setProperty(dynaForm, "inventoryItems", new ArrayList<InventoryKitItem>());
}
private void setSelectionLists(DynaActionForm dynaForm) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
List<DropPair> analysisStatusList = getAnalysisStatusTypes();
PropertyUtils.setProperty(dynaForm, "analysisStatusSelections", analysisStatusList);
PropertyUtils.setProperty(dynaForm, "testSelections", DisplayListService.getListWithLeadingBlank( DisplayListService.ListType.ALL_TESTS ));
List<DropPair> sampleStatusList = getSampleStatusTypes();
PropertyUtils.setProperty(dynaForm, "sampleStatusSelections", sampleStatusList);
}
private List<TestResultItem> getSelectedTests(DynaActionForm dynaForm) {
String collectionDate = dynaForm.getString("collectionDate");
String receivedDate = dynaForm.getString("recievedDate");
String analysisStatus = dynaForm.getString("selectedAnalysisStatus");
String sampleStatus = dynaForm.getString("selectedSampleStatus");
String test = dynaForm.getString("selectedTest");
List<Analysis> analysisList = new ArrayList<Analysis>();
if (!GenericValidator.isBlankOrNull(collectionDate)) {
analysisList = getAnalysisForCollectionDate(collectionDate);
if( analysisList.isEmpty()){
return new ArrayList<TestResultItem>();
}
}
if (!GenericValidator.isBlankOrNull(receivedDate)) {
analysisList = blendLists(analysisList, getAnalysisForRecievedDate(receivedDate));
if (analysisList.isEmpty()) {
return new ArrayList<TestResultItem>();
}
}
if (!(GenericValidator.isBlankOrNull(analysisStatus) || analysisStatus.equals("0"))) {
analysisList = blendLists(analysisList, getAnalysisForAnalysisStatus(analysisStatus));
if( analysisList.isEmpty()){
return new ArrayList<TestResultItem>();
}
}
if (!(GenericValidator.isBlankOrNull(sampleStatus) || sampleStatus.equals("0"))) {
analysisList = blendLists(analysisList, getAnalysisForSampleStatus(sampleStatus));
if( analysisList.isEmpty()){
return new ArrayList<TestResultItem>();
}
}
if (!(GenericValidator.isBlankOrNull(test) || test.equals("0"))) {
analysisList = blendLists(analysisList, getAnalysisForTest(test));
if( analysisList.isEmpty()){
return new ArrayList<TestResultItem>();
}
}
return buildTestItems(analysisList);
}
private List<Analysis> blendLists(List<Analysis> masterList, List<Analysis> newList){
if( masterList.isEmpty() ){
return newList;
}else{
List<Analysis> blendedList = new ArrayList<Analysis>();
for(Analysis master : masterList){
for( Analysis newAnalysis : newList){
if( master.getId().equals(newAnalysis.getId())){
blendedList.add(master);
}
}
}
return blendedList;
}
}
private List<Analysis> getAnalysisForCollectionDate(String collectionDate) {
Date date = DateUtil.convertStringDateToSqlDate(collectionDate);
return analysisDAO.getAnalysisCollectedOnExcludedByStatusId(date, excludedStatusIds);
}
private List<Analysis> getAnalysisForRecievedDate(String recievedDate) {
List<Sample> sampleList = sampleDAO.getSamplesReceivedOn(recievedDate);
return getAnalysisListForSampleItems(sampleList);
}
private List<Analysis> getAnalysisListForSampleItems(List<Sample> sampleList) {
List<Analysis> analysisList = new ArrayList<Analysis>();
SampleItemDAO sampleItemDAO = new SampleItemDAOImpl();
for (Sample sample : sampleList) {
List<SampleItem> sampleItemList = sampleItemDAO.getSampleItemsBySampleId(sample.getId());
for (SampleItem sampleItem : sampleItemList) {
List<Analysis> analysisListForItem = analysisDAO.getAnalysesBySampleItemsExcludingByStatusIds(sampleItem, excludedStatusIds);
analysisList.addAll(analysisListForItem);
}
}
return analysisList;
}
private List<Analysis> getAnalysisForAnalysisStatus(String status) {
return analysisDAO.getAnalysesForStatusId(status);
}
private List<Analysis> getAnalysisForSampleStatus(String sampleStatus) {
return analysisDAO.getAnalysesBySampleStatusIdExcludingByStatusId(sampleStatus, excludedStatusIds);
}
@SuppressWarnings("unchecked")
private List<Analysis> getAnalysisForTest(String testId) {
List<Integer> excludedStatusIntList = new ArrayList<Integer>();
excludedStatusIntList.addAll(excludedStatusIds);
return analysisDAO.getAllAnalysisByTestAndExcludedStatus(testId, excludedStatusIntList);
}
private List<TestResultItem> buildTestItems(List<Analysis> analysisList) {
if( analysisList.isEmpty()){
return new ArrayList<TestResultItem>();
}
return resultsUtility.getGroupedTestsForAnalysisList(analysisList, REVERSE_SORT_ORDER);
}
private List<DropPair> getAnalysisStatusTypes() {
List<DropPair> list = new ArrayList<DropPair>();
list.add(new DropPair("0", ""));
list.add(new DropPair(StatusService.getInstance().getStatusID(AnalysisStatus.NotStarted), StatusService.getInstance().getStatusName(AnalysisStatus.NotStarted)));
list.add(new DropPair(StatusService.getInstance().getStatusID(AnalysisStatus.Canceled), StatusService.getInstance().getStatusName(AnalysisStatus.Canceled)));
list.add(new DropPair(StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalAcceptance), StatusService.getInstance()
.getStatusName(AnalysisStatus.TechnicalAcceptance)));
list.add(new DropPair(StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalRejected), StatusService.getInstance()
.getStatusName(AnalysisStatus.TechnicalRejected)));
list.add(new DropPair(StatusService.getInstance().getStatusID(AnalysisStatus.BiologistRejected), StatusService.getInstance()
.getStatusName(AnalysisStatus.BiologistRejected)));
return list;
}
private List<DropPair> getSampleStatusTypes() {
List<DropPair> list = new ArrayList<DropPair>();
list.add(new DropPair("0", ""));
list.add(new DropPair(StatusService.getInstance().getStatusID(OrderStatus.Entered), StatusService.getInstance().getStatusName(OrderStatus.Entered)));
list.add(new DropPair(StatusService.getInstance().getStatusID(OrderStatus.Started), StatusService.getInstance().getStatusName(OrderStatus.Started)));
return list;
}
@Override
protected String getPageTitleKey() {
return "banner.menu.results";
}
@Override
protected String getPageSubtitleKey() {
return "banner.menu.results";
}
public class DropPair implements Serializable {
private static final long serialVersionUID = 1L;
public String getId() {
return id;
}
public String getDescription() {
return description;
}
private final String id;
private final String description;
public DropPair(String id, String description) {
this.id = id;
this.description = description;
}
}
}