/**
* 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.ARVReportData;
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.sampleorganization.dao.SampleOrganizationDAO;
import us.mn.state.health.lims.sampleorganization.daoimpl.SampleOrganizationDAOImpl;
import us.mn.state.health.lims.sampleorganization.valueholder.SampleOrganization;
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 us.mn.state.health.lims.reports.action.implementation.reportBeans.ARVReportData;
import us.mn.state.health.lims.observationhistorytype.dao.ObservationHistoryTypeDAO;
import us.mn.state.health.lims.observationhistorytype.daoImpl.ObservationHistoryTypeDAOImpl;
import us.mn.state.health.lims.observationhistorytype.valueholder.ObservationHistoryType;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.commons.validator.GenericValidator;
public abstract class NonConformityByLabno extends Report implements IReportCreator {
ObservationHistoryTypeDAO observationTypeDAO = new ObservationHistoryTypeDAOImpl();
ObservationHistoryType observationType = observationTypeDAO.getByName("nameOfDoctor");
private String OBSERVATION_DOCTOR_ID = observationType.getId();
private String lowDateStr;
private String highDateStr;
private String lowerNumber;
private String upperNumber;
private DateRange dateRange;
private ArrayList<ARVReportData> 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_GENERAL")){
reportParameters.put("headerName", "CILNSPHeader.jasper");
} else {
// reportParameters.put("headerName", getHeaderName());
}
}
@Override
public void initializeReport(BaseActionForm dynaForm) {
super.initializeReport();
lowerNumber = dynaForm.getString( "accessionDirect" );
upperNumber = dynaForm.getString( "highAccessionDirect" );
dateRange = new DateRange(lowDateStr, highDateStr);
createReportParameters();
errorFound = !validateAccessionNumbers();
if ( errorFound ) {
return;
}
reportItems = new ArrayList<ARVReportData>();
createReportItems();
if ( this.reportItems.size() == 0 ) {
add1LineErrorMessage("report.error.message.noPrintableItems");
}
Collections.sort(reportItems, new ReportItemsComparator() );
}
/**
*
*/
private void createReportItems() {
List<Sample> samples = sampleDAO.getSamplesByAccessionRange(lowerNumber, upperNumber);
for (Sample sample : samples) {
this.sample = sample;
patient = ReportUtil.findPatient( sample );
project = ReportUtil.findProject(sample);
service = findService();
sampleQaEvents = findSampleQaEvents();
ARVReportData data = new ARVReportData();
SampleOrganizationDAO orgDAO = new SampleOrganizationDAOImpl();
String subjectNumber = patient.getNationalId();
if(GenericValidator.isBlankOrNull(subjectNumber)){
subjectNumber = patient.getExternalId();
}
data.setLabNo(sample.getAccessionNumber());
data.setSubjectNumber(subjectNumber);
data.setBirth_date(patient.getBirthDateForDisplay());
data.setAge(DateUtil.getCurrentAgeForDate(patient.getBirthDate(), sample.getCollectionDate()));
data.setGender(patient.getGender());
data.setCollectiondate(sample.getCollectionDateForDisplay() + " " + sample.getCollectionTimeForDisplay());
data.setReceptiondate(DateUtil.convertTimestampToStringDate(sample.getReceivedTimestamp()));
SampleOrganization sampleOrg = new SampleOrganization();
sampleOrg.setSample(sample);
orgDAO.getDataBySample(sampleOrg);
data.setOrgname(sampleOrg.getId() == null ? "" : sampleOrg.getOrganization().getOrganizationName());
data.setDoctor(getObservationValues(OBSERVATION_DOCTOR_ID));
data.getSampleQaEventItems(sample);
reportItems.add(data);
/* 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);
ARVReportData data = new ARVReportData();
data.setLabNo(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);
data.getSampleQaEventItems(sample);
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);
}
static class ReportItemsComparator implements Comparator<ARVReportData>{
/**
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
* left.get().compareTo(right.get());
*/
@Override
public int compare(ARVReportData left, ARVReportData right) {
int compare = left.getLabNo().compareTo(right.getLabNo());
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 "retroCINonConformityByLabno";
}
protected abstract String getHeaderName();
protected String getObservationValues(String observationTypeId) {
List<ObservationHistory> observationList = observationDAO.getAll(patient, sample, observationTypeId);
return observationList.size() > 0 ? observationList.get(0).getValue() : "";
}
private boolean validateAccessionNumbers() {
if (GenericValidator.isBlankOrNull(lowerNumber) && GenericValidator.isBlankOrNull(upperNumber)) {
add1LineErrorMessage("report.error.message.noParameters");
return false;
}
if (GenericValidator.isBlankOrNull(lowerNumber)) {
lowerNumber = upperNumber;
} else if (GenericValidator.isBlankOrNull(upperNumber)) {
upperNumber = lowerNumber;
}
int lowIndex = findFirstNumber(lowerNumber);
int highIndex = findFirstNumber(upperNumber);
if (lowIndex == lowerNumber.length() || highIndex == upperNumber.length()) {
add1LineErrorMessage("report.error.message.noParameters");
return false;
}
String lowPrefix = (String) lowerNumber.subSequence(0, lowIndex);
String highPrefix = (String) upperNumber.subSequence(0, highIndex);
if (!lowPrefix.equals(highPrefix)) {
add1LineErrorMessage("report.error.message.samePrefix");
return false;
}
int lowBounds = Integer.parseInt(lowerNumber.substring(lowIndex));
int highBounds = Integer.parseInt(upperNumber.substring(highIndex));
if (highBounds < lowBounds) {
String temp = upperNumber;
upperNumber = lowerNumber;
lowerNumber = temp;
}
return true;
}
private int findFirstNumber(String number) {
for (int i = 0; i < number.length(); i++) {
if (Character.isDigit(number.charAt(i))) {
return i;
}
}
return number.length();
}
}