/**
* 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.beanutils.PropertyUtils;
import org.apache.commons.validator.GenericValidator;
import us.mn.state.health.lims.common.action.BaseActionForm;
import us.mn.state.health.lims.common.services.AnalysisService;
import us.mn.state.health.lims.common.services.SampleService;
import us.mn.state.health.lims.common.services.TestService;
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.organization.dao.OrganizationDAO;
import us.mn.state.health.lims.organization.daoimpl.OrganizationDAOImpl;
import us.mn.state.health.lims.organization.valueholder.Organization;
import us.mn.state.health.lims.referral.valueholder.Referral;
import us.mn.state.health.lims.referral.valueholder.ReferralReason;
import us.mn.state.health.lims.referral.valueholder.ReferralResult;
import us.mn.state.health.lims.reports.action.implementation.reportBeans.ClinicalPatientData;
import us.mn.state.health.lims.result.valueholder.Result;
import us.mn.state.health.lims.sample.valueholder.Sample;
import us.mn.state.health.lims.test.valueholder.Test;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @author Paul A. Hill (pahill@uw.edu)
* @since Feb 18, 2011
*/
public class ReferredOutReport extends PatientReport implements IReportParameterSetter, IReportCreator {
private String lowDateStr;
private String highDateStr;
private String locationId;
private DateRange dateRange;
OrganizationDAO organizationDAO = new OrganizationDAOImpl();
private Organization reportLocation;
@Override
protected String reportFileName(){
return "ReferredOutBySite";
}
/**
* @see us.mn.state.health.lims.reports.action.implementation.IReportParameterSetter#setRequestParameters(us.mn.state.health.lims.common.action.BaseActionForm)
*/
@Override
public void setRequestParameters(BaseActionForm dynaForm) {
try {
List<Organization> list = organizationDAO.getOrganizationsByTypeName("organizationName", "referralLab");
PropertyUtils.setProperty(dynaForm, "reportName", getReportNameForParameterPage());
PropertyUtils.setProperty(dynaForm, "useLocationCode", true);
PropertyUtils.setProperty(dynaForm, "locationCodeList", list);
PropertyUtils.setProperty(dynaForm, "useLowerDateRange", true);
PropertyUtils.setProperty(dynaForm, "useUpperDateRange", true);
PropertyUtils.setProperty(dynaForm, "instructions", StringUtil.getMessageForKey("instructions.report.referral"));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @see us.mn.state.health.lims.reports.action.implementation.IReportCreator#initializeReport(us.mn.state.health.lims.common.action.BaseActionForm)
*/
@Override
public void initializeReport(BaseActionForm dynaForm) {
super.initializeReport();
lowDateStr = dynaForm.getString("lowerDateRange");
highDateStr = dynaForm.getString("upperDateRange");
locationId = dynaForm.getString("locationCode");
dateRange = new DateRange(lowDateStr, highDateStr);
reportLocation = getValidOrganization(locationId);
errorFound = !validateSubmitParameters();
createReportParameters();
if ( errorFound ) {
return;
}
initializeReportItems();
createReportItems();
if ( this.reportItems.size() == 0 ) {
add1LineErrorMessage("report.error.message.noPrintableItems");
}
Collections.sort(reportItems, new ReportItemsComparator() );
return;
}
static class ReportItemsComparator implements Comparator<ClinicalPatientData>{
/**
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
* left.get().compareTo(right.get());
*/
@Override
public int compare(ClinicalPatientData left, ClinicalPatientData right) {
int compare = left.getAccessionNumber().compareTo(right.getAccessionNumber());
if (compare != 0) return compare;
compare = left.getTestName().compareTo(right.getTestName());
if (compare != 0) return compare;
compare = left.getResult().compareTo(right.getResult());
if (compare != 0) return compare;
compare = left.getReferralTestName().compareTo(right.getReferralTestName());
if (compare != 0) return compare;
compare = left.getReferralResult().compareTo(right.getReferralResult());
return compare;
}
}
/**
* check everything
*/
private boolean validateSubmitParameters() {
return (dateRange.validateHighLowDate("report.error.message.date.received.missing") && reportLocation != null );
}
protected void createReportParameters() {
super.createReportParameters();
reportParameters.put("reportPeriod", StringUtil.getMessageForKey("reports.label.referral.title")
+ " " + lowDateStr + " - " + highDateStr);
reportParameters.put("reportTitle", reportLocation == null ? "" : StringUtil.getMessageForKey("report.test.status.referredOut") + ": " + reportLocation.getOrganizationName());
reportParameters.put("referralSiteName", reportLocation == null ? "" : reportLocation.getOrganizationName());
reportParameters.put("directorName", ConfigurationProperties.getInstance().getPropertyValue(Property.labDirectorName));
reportParameters.put("labName1", StringUtil.getContextualMessageForKey("report.labName.one"));
reportParameters.put("labName2", StringUtil.getContextualMessageForKey("report.labName.two"));
}
@Override
protected String getHeaderName(){
return "GeneralHeader.jasper";
}
@Override
protected void createReportItems() {
List<Referral> referrals = referralDao.getAllReferralsByOrganization(locationId,
dateRange.getLowDate(),
dateRange.getHighDateAtEndOfDay());
for (Referral referral : referrals) {
if( !referral.isCanceled()){
reportReferral(referral);
}
}
}
/**
* Report the local and the referralResults for the given referral.
*
* @param referral
*/
private void reportReferral(Referral referral) {
currentAnalysisService = new AnalysisService( referral.getAnalysis() );
Sample sample = referralDao.getReferralById(referral.getId()).getAnalysis().getSampleItem().getSample();
currentSampleService = new SampleService(sample);
findPatientFromSample();
String note = currentAnalysisService.getNotesAsString( false, true, "<br/>", false );
List<ReferralResult> referralResults = referralResultDAO.getReferralResultsForReferral(referral.getId());
for (int i = 0; i < referralResults.size(); i++) {
i = reportReferralResultValue(referralResults, i);
ReferralResult referralResult = referralResults.get(i);
ClinicalPatientData data = buildClinicalPatientData( false );
data.setReferralSentDate((referral != null && referral.getSentDate() != null) ? DateUtil.formatDateAsText(referral.getSentDate()) : "");
data.setReferralResult(reportReferralResultValue);
data.setReferralNote(note);
String testId = referralResult.getTestId();
if (!GenericValidator.isBlankOrNull(testId)) {
Test test = new Test();
test.setId(testId);
testDAO.getData(test);
data.setReferralTestName( TestService.getUserLocalizedReportingTestName( test ) );
String uom = getUnitOfMeasure( test);
if (reportReferralResultValue != null) {
data.setReferralResult(addIfNotEmpty(reportReferralResultValue, uom));
}
data.setReferralRefRange(addIfNotEmpty(getRange(referralResult.getResult()), uom));
data.setTestSortOrder(GenericValidator.isBlankOrNull(test.getSortOrder()) ? Integer.MAX_VALUE : Integer.parseInt(test.getSortOrder()));
data.setSectionSortOrder( currentAnalysisService.getTestSection().getSortOrderInt() );
data.setTestSection( currentAnalysisService.getTestSection().getLocalizedName() );
}
Timestamp referralReportDate = referralResult.getReferralReportDate();
data.setReferralResultReportDate((referralReportDate == null) ? null : DateUtil.formatDateAsText(referralReportDate));
ReferralReason reason = new ReferralReason();
reason.setId(referral.getReferralReasonId());
referralReasonDAO.getData(reason);
data.setReferralReason(reason.getLocalizedName());
reportItems.add(data);
}
}
/**
* @see PatientReport#getReportNameForParameterPage()
*/
@Override
protected String getReportNameForParameterPage() {
return StringUtil.getMessageForKey("openreports.referredOutHaitiReport");
}
public JRDataSource getReportDataSource() throws IllegalStateException {
if (!initialized) {
throw new IllegalStateException("initializeReport not called first");
}
return errorFound ? new JRBeanCollectionDataSource(errorMsgs) : new JRBeanCollectionDataSource(reportItems);
}
@Override
protected void postSampleBuild() {
// TODO Auto-generated method stub
}
@Override
protected void setReferredResult(ClinicalPatientData data, Result result) {
data.setResult(data.getResult() );
}
}