/**
* 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.reports.action.implementation;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
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.action.BaseActionForm;
import us.mn.state.health.lims.common.services.NoteService;
import us.mn.state.health.lims.common.services.TestService;
import us.mn.state.health.lims.common.services.TypeOfTestResultService;
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.common.util.StringUtil;
import us.mn.state.health.lims.dictionary.dao.DictionaryDAO;
import us.mn.state.health.lims.dictionary.daoimpl.DictionaryDAOImpl;
import us.mn.state.health.lims.organization.dao.OrganizationDAO;
import us.mn.state.health.lims.organization.daoimpl.OrganizationDAOImpl;
import us.mn.state.health.lims.person.dao.PersonDAO;
import us.mn.state.health.lims.person.daoimpl.PersonDAOImpl;
import us.mn.state.health.lims.person.valueholder.Person;
import us.mn.state.health.lims.referral.dao.ReferringTestResultDAO;
import us.mn.state.health.lims.referral.daoimpl.ReferringTestResultDAOImpl;
import us.mn.state.health.lims.referral.valueholder.ReferringTestResult;
import us.mn.state.health.lims.reports.action.implementation.reportBeans.ConfirmationData;
import us.mn.state.health.lims.reports.action.implementation.reportBeans.ErrorMessages;
import us.mn.state.health.lims.requester.dao.RequesterTypeDAO;
import us.mn.state.health.lims.requester.dao.SampleRequesterDAO;
import us.mn.state.health.lims.requester.daoimpl.RequesterTypeDAOImpl;
import us.mn.state.health.lims.requester.daoimpl.SampleRequesterDAOImpl;
import us.mn.state.health.lims.requester.valueholder.SampleRequester;
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.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.common.services.TypeOfSampleService;
import java.util.*;
public class ConfirmationReport extends IndicatorReport implements IReportCreator, IReportParameterSetter {
private List<ConfirmationData> reportItems;
private static AnalysisDAO analysisDAO = new AnalysisDAOImpl();
private static SampleItemDAO sampleItemDAO = new SampleItemDAOImpl();
private static SampleRequesterDAO requesterDAO = new SampleRequesterDAOImpl();
private static PersonDAO personDAO = new PersonDAOImpl();
private static ResultDAO resultDAO = new ResultDAOImpl();
private static DictionaryDAO dictionaryDAO = new DictionaryDAOImpl();
private static OrganizationDAO organizationDAO = new OrganizationDAOImpl();
private static ReferringTestResultDAO referringTestResultDAO = new ReferringTestResultDAOImpl();
private static SampleDAO sampleDAO = new SampleDAOImpl();
private static long PERSON_REQUESTER_TYPE_ID;
private static long ORG_REQUESTER_TYPE_ID;
static {
RequesterTypeDAO requesterTypeDAO = new RequesterTypeDAOImpl();
PERSON_REQUESTER_TYPE_ID = Long.parseLong(requesterTypeDAO.getRequesterTypeByName("provider").getId());
ORG_REQUESTER_TYPE_ID = Long.parseLong(requesterTypeDAO.getRequesterTypeByName("organization").getId());
}
@Override
protected String reportFileName() {
return "ConfirmationSummary";
}
public JRDataSource getReportDataSource() throws IllegalStateException {
return errorFound ? new JRBeanCollectionDataSource(errorMsgs) : new JRBeanCollectionDataSource(reportItems);
}
public void initializeReport(BaseActionForm dynaForm) {
super.initializeReport();
setDateRange(dynaForm);
createReportParameters();
setConfirmationData();
}
private void setConfirmationData() {
reportItems = new ArrayList<ConfirmationData>();
List<Sample> referredSamples = getReferredInSamples();
if (referredSamples.isEmpty()) {
errorFound = true;
ErrorMessages msgs = new ErrorMessages();
msgs.setMsgLine1(StringUtil.getMessageForKey("report.error.message.noPrintableItems"));
errorMsgs.add(msgs);
return;
}
for (Sample sample : referredSamples) {
reportItems.addAll(createConfirmationBeanFromSample(sample));
}
Collections.sort(reportItems, new Comparator<ConfirmationData>() {
@Override
public int compare(ConfirmationData o1, ConfirmationData o2) {
int orgCompare = o1.getOrganizationName().compareTo(o2.getOrganizationName());
if (orgCompare == 0) {
return o1.getLabAccession().compareTo(o2.getLabAccession());
} else {
return orgCompare;
}
}
});
}
private List<Sample> getReferredInSamples() {
return sampleDAO.getConfirmationSamplesReceivedInDateRange(lowDate, highDate);
}
private List<ConfirmationData> createConfirmationBeanFromSample(Sample sample) {
List<ConfirmationData> dataList = new ArrayList<ConfirmationData>();
String accessionNumber = sample.getAccessionNumber();
String orgName = getOrganizationNameForSample(sample);
Person requester = getRequesterForSample(sample);
String requestDate = DateUtil.convertSqlDateToStringDate(sample.getReceivedDate());
List<SampleItem> sampleItemList = sampleItemDAO.getSampleItemsBySampleId(sample.getId());
for (SampleItem sampleItem : sampleItemList) {
ConfirmationData data = new ConfirmationData();
data.setLabAccession(accessionNumber + "-" + sampleItem.getSortOrder());
data.setSampleType(TypeOfSampleService.getTypeOfSampleNameForId(sampleItem.getTypeOfSampleId()));
data.setOrganizationName(StringUtil.replaceNullWithEmptyString(orgName));
data.setRequesterAccession(sampleItem.getExternalId());
data.setNote(getNoteForSampleItem(sampleItem));
data.setRequesterEMail(StringUtil.replaceNullWithEmptyString(requester.getEmail()));
data.setRequesterFax(StringUtil.replaceNullWithEmptyString(requester.getFax()));
data.setRequesterName(StringUtil.replaceNullWithEmptyString(requester.getFirstName()) + " "
+ StringUtil.replaceNullWithEmptyString(requester.getLastName()));
data.setRequesterPhone(StringUtil.replaceNullWithEmptyString(requester.getWorkPhone()));
data.setReceptionDate(requestDate);
addResults(data, sampleItem);
dataList.add(data);
}
return dataList;
}
private Person getRequesterForSample(Sample sample) {
List<SampleRequester> requesters = requesterDAO.getRequestersForSampleId(sample.getId());
for (SampleRequester requester : requesters) {
if (PERSON_REQUESTER_TYPE_ID == requester.getRequesterTypeId()) {
return personDAO.getPersonById(String.valueOf(requester.getRequesterId()));
}
}
return new Person();
}
private String getOrganizationNameForSample(Sample sample) {
List<SampleRequester> requesters = requesterDAO.getRequestersForSampleId(sample.getId());
for (SampleRequester requester : requesters) {
if (ORG_REQUESTER_TYPE_ID == requester.getRequesterTypeId()) {
return organizationDAO.getOrganizationById(String.valueOf(requester.getRequesterId())).getOrganizationName();
}
}
return "";
}
private String getNoteForSampleItem(SampleItem sampleItem) {
String notes = new NoteService( sampleItem ).getNotesAsString( null, null );
return notes == null ? "" : notes;
}
private void addResults(ConfirmationData data, SampleItem sampleItem) {
List<Analysis> analysisList = analysisDAO.getAnalysesBySampleItem(sampleItem);
List<String> requestTestList = new ArrayList<String>();
List<String> requestResultList = new ArrayList<String>();
List<String> labTestList = new ArrayList<String>();
List<String> labResultList = new ArrayList<String>();
List<String> completionDate = new ArrayList<String>();
for (Analysis analysis : analysisList) {
labTestList.add(TestService.getUserLocalizedTestName( analysis.getTest() ));
labResultList.add(getResultsForAnalysis(analysis));
completionDate.add( getCompleationDate( analysis ) );
}
List<ReferringTestResult> referringTestResultList = referringTestResultDAO.getReferringTestResultsForSampleItem(sampleItem.getId());
if( referringTestResultList.isEmpty()){
requestTestList.add(StringUtil.getMessageForKey("test.name.notSpecified") );
requestResultList.add( "" );
}else {
for (ReferringTestResult result : referringTestResultList) {
String name = result.getTestName();
String resultValue = result.getResultValue();
requestTestList.add(GenericValidator.isBlankOrNull(name) ? StringUtil.getMessageForKey("test.name.notSpecified") : name );
requestResultList.add(resultValue == null ? "" : resultValue);
}
}
data.setLabResult(labResultList);
data.setLabTest(labTestList);
data.setRequesterTest(requestTestList);
data.setRequesterResult(requestResultList);
data.setCompleationDate(completionDate);
}
private String getResultsForAnalysis(Analysis analysis) {
List<Result> results = resultDAO.getResultsByAnalysis(analysis);
if (results != null && !results.isEmpty()) {
String type = results.get(0).getResultType();
if ( TypeOfTestResultService.ResultType.isDictionaryVariant( type )) {
StringBuilder builder = new StringBuilder();
boolean firstNumber = true;
for (Result result : results) {
if (!firstNumber) {
builder.append(", ");
}
firstNumber = false;
if (!(GenericValidator.isBlankOrNull(result.getValue()) || "0".equals(result.getValue()))) {
builder.append(dictionaryDAO.getDictionaryById(result.getValue()).getLocalizedName());
}
}
return builder.toString();
} else {
return getResultsWithUOM(results.get(0).getValue(), analysis);
}
}
return "";
}
private String getResultsWithUOM(String value, Analysis analysis) {
if (analysis.getTest().getUnitOfMeasure() != null) {
return value + " " + analysis.getTest().getUnitOfMeasure().getUnitOfMeasureName();
}
return value;
}
private String getCompleationDate(Analysis analysis) {
return DateUtil.convertSqlDateToStringDate(analysis.getCompletedDate());
}
@Override
protected String getNameForReportRequest() {
return StringUtil.getMessageForKey("report.confirmation.request");
}
@Override
protected String getNameForReport() {
return StringUtil.getContextualMessageForKey("report.confirmation.title");
}
@Override
protected String getLabNameLine1() {
return ConfigurationProperties.getInstance().getPropertyValue(Property.SiteName);
}
@Override
protected String getLabNameLine2() {
return "";
}
}