/**
* 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.reports.action.implementation;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import us.mn.state.health.lims.common.action.BaseActionForm;
import us.mn.state.health.lims.common.services.QAService;
import us.mn.state.health.lims.common.services.QAService.QAObservationType;
import us.mn.state.health.lims.common.services.TableIdService;
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.observationhistory.dao.ObservationHistoryDAO;
import us.mn.state.health.lims.observationhistory.daoimpl.ObservationHistoryDAOImpl;
import us.mn.state.health.lims.observationhistory.valueholder.ObservationHistory;
import us.mn.state.health.lims.patient.valueholder.Patient;
import us.mn.state.health.lims.project.valueholder.Project;
import us.mn.state.health.lims.qaevent.action.retroCI.NonConformityAction;
import us.mn.state.health.lims.qaevent.valueholder.QaEvent;
import us.mn.state.health.lims.reports.action.implementation.reportBeans.NonConformityReportData;
import us.mn.state.health.lims.reports.action.util.ReportUtil;
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.sampleqaevent.dao.SampleQaEventDAO;
import us.mn.state.health.lims.sampleqaevent.daoimpl.SampleQaEventDAOImpl;
import us.mn.state.health.lims.sampleqaevent.valueholder.SampleQaEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public abstract class NonConformityByDate extends Report implements IReportCreator {
private String lowDateStr;
private String highDateStr;
private DateRange dateRange;
private ArrayList<NonConformityReportData> reportItems;
private ObservationHistoryDAO observationDAO = new ObservationHistoryDAOImpl();
private SampleDAO sampleDAO = new SampleDAOImpl();
private SampleQaEventDAO sampleQaEventDAO = new SampleQaEventDAOImpl();
private Sample sample;
private Project project;
private String service;
private Patient patient;
private QaEvent qaEvent;
private List<SampleQaEvent> sampleQaEvents;
@Override
protected void createReportParameters() throws IllegalStateException {
super.createReportParameters();
String nonConformity = StringUtil.getContextualMessageForKey("banner.menu.nonconformity");
reportParameters.put("status", nonConformity);
reportParameters.put("reportTitle", nonConformity);
reportParameters.put("reportPeriod", StringUtil.getContextualMessageForKey("banner.menu.nonconformity") + " " + dateRange.toString());
reportParameters.put("supervisorSignature", ConfigurationProperties.getInstance().isPropertyValueEqual(Property.SIGNATURES_ON_NONCONFORMITY_REPORTS, "true"));
if( ConfigurationProperties.getInstance().isPropertyValueEqual(Property.configurationName, "CI LNSP")){
reportParameters.put("headerName", "CILNSPHeader.jasper");
} else {
reportParameters.put("headerName", getHeaderName());
}
}
@Override
public void initializeReport(BaseActionForm dynaForm) {
super.initializeReport();
lowDateStr = dynaForm.getString("lowerDateRange");
highDateStr = dynaForm.getString("upperDateRange");
dateRange = new DateRange(lowDateStr, highDateStr);
createReportParameters();
errorFound = !validateSubmitParameters();
if ( errorFound ) {
return;
}
reportItems = new ArrayList<NonConformityReportData>();
createReportItems();
if ( this.reportItems.size() == 0 ) {
add1LineErrorMessage("report.error.message.noPrintableItems");
}
Collections.sort(reportItems, new ReportItemsComparator() );
}
/**
*
*/
private void createReportItems() {
List<Sample> samples = sampleDAO.getSamplesReceivedInDateRange(lowDateStr, highDateStr);
for (Sample sample : samples) {
this.sample = sample;
patient = ReportUtil.findPatient( sample );
project = ReportUtil.findProject(sample);
service = findService();
sampleQaEvents = findSampleQaEvents();
for (SampleQaEvent sampleQaEvent : sampleQaEvents) {
QAService qa = new QAService( sampleQaEvent);
this.qaEvent = qa.getQAEvent();
String sampleType = ReportUtil.getSampleType(sampleQaEvent);
String noteForSampleQaEvent = NonConformityAction.getNoteForSampleQaEvent(sampleQaEvent);
String noteForSample = NonConformityAction.getNoteForSample(sample);
NonConformityReportData data = new NonConformityReportData();
data.setAccessionNumber(sample.getAccessionNumber());
data.setSubjectNumber(patient.getNationalId());
data.setSiteSubjectNumber(patient.getExternalId());
data.setStudy((project != null)?project.getLocalizedName():"");
data.setService(service);
data.setReceivedDate(sample.getReceivedDateForDisplay() + " " + sample.getReceivedTimeForDisplay( ));
data.setNonConformityDate(DateUtil.convertTimestampToStringDate( qa.getLastupdated()));
data.setSection(qa.getObservationForDisplay( QAObservationType.SECTION ));
data.setNonConformityReason( qaEvent.getLocalizedName() );
data.setSampleType( sampleType );
data.setBiologist( qa.getObservationForDisplay( QAObservationType.AUTHORIZER ) );
data.setQaNote(noteForSampleQaEvent);
data.setSampleNote(noteForSample);
reportItems.add(data);
}
}
}
/**
* @return a displayable string describing the service.
*/
private String findService() {
String service = "";
List<ObservationHistory> oh = observationDAO.getAll(null, sample, TableIdService.SERVICE_OBSERVATION_TYPE_ID);
if (oh.size() > 0) {
service = oh.get(0).getValue();
}
return service;
}
/**
* @return
*/
private List<SampleQaEvent> findSampleQaEvents() {
SampleQaEvent sampleQaEvent = new SampleQaEvent();
sampleQaEvent.setSample(sample);
return sampleQaEventDAO.getSampleQaEventsBySample(sample);
}
@Override
public JRDataSource getReportDataSource() throws IllegalStateException {
return errorFound ? new JRBeanCollectionDataSource(errorMsgs) : new JRBeanCollectionDataSource(reportItems);
}
/**
* check everything
*/
private boolean validateSubmitParameters() {
return (dateRange.validateHighLowDate("report.error.message.date.received.missing") );
}
static class ReportItemsComparator implements Comparator<NonConformityReportData>{
/**
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
* left.get().compareTo(right.get());
*/
@Override
public int compare(NonConformityReportData left, NonConformityReportData right) {
int compare = left.getAccessionNumber().compareTo(right.getAccessionNumber());
if (compare != 0) return compare;
compare = StringUtil.compareWithNulls(left.getSubjectNumber(), right.getSubjectNumber());
if (compare != 0) return compare;
compare = StringUtil.compareWithNulls(left.getSiteSubjectNumber(), right.getSubjectNumber());
if (compare != 0) return compare;
compare = StringUtil.compareWithNulls(left.getSampleType(),right.getSampleType());
return compare;
}
}
@Override
protected String reportFileName(){
return "NonConformityByReceivedDate";
}
protected abstract String getHeaderName();
}