/** * 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 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.QAService; import us.mn.state.health.lims.common.services.QAService.QAObservationType; import us.mn.state.health.lims.common.util.DateUtil; import us.mn.state.health.lims.common.util.IdValuePair; import us.mn.state.health.lims.common.util.StringUtil; import us.mn.state.health.lims.organization.valueholder.Organization; 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.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 java.util.*; public class RetroCINonConformityNotification extends RetroCIReport implements IReportCreator, IReportParameterSetter { private static SampleQaEventDAO sampleQADAO = new SampleQaEventDAOImpl(); private static SampleOrganizationDAO sampleOrgDAO = new SampleOrganizationDAOImpl(); private static SampleDAO sampleDAO = new SampleDAOImpl(); private List<NonConformityReportData> reportItems; private String requestedAccessionNumber; private List<String> sampleQaEventIds; private Set<String> checkIdsForPriorPrintRecord; public RetroCINonConformityNotification() { super(); } @Override public void setRequestParameters(BaseActionForm dynaForm) { try { PropertyUtils.setProperty(dynaForm, "reportName", StringUtil.getMessageForKey("reports.nonConformity.notification.report")); PropertyUtils.setProperty(dynaForm, "selectList", new ReportSpecificationList( getSiteList(), StringUtil.getMessageForKey( "report.select.site" ))); PropertyUtils.setProperty(dynaForm, "useAccessionDirect", Boolean.TRUE); PropertyUtils.setProperty(dynaForm, "instructions", StringUtil.getMessageForKey("reports.nonConformity.notification.report.instructions")); } catch (Exception e) { e.printStackTrace(); } } private List<IdValuePair> getSiteList() { List<IdValuePair> sites = new ArrayList<IdValuePair>(); Set<String> orgIds = new HashSet<String>(); List<Organization> services = new ArrayList<Organization>(); List<SampleQaEvent> events = sampleQADAO.getAllUncompleatedEvents(); events = filterReportedEvents(events); for (SampleQaEvent event : events) { SampleOrganization sampleOrg = sampleOrgDAO.getDataBySample(event.getSample()); if (sampleOrg != null) { if (!orgIds.contains(sampleOrg.getOrganization().getId())) { orgIds.add(sampleOrg.getOrganization().getId()); services.add(sampleOrg.getOrganization()); } } } Collections.sort(services, new Comparator<Organization>() { @Override public int compare(Organization o1, Organization o2) { return o1.getOrganizationName().compareTo(o2.getOrganizationName()); } }); for (Organization org : services) { sites.add(new IdValuePair(org.getId(), org.getOrganizationName())); } return sites; } private List<SampleQaEvent> filterReportedEvents(List<SampleQaEvent> events) { List<SampleQaEvent> filteredList = new ArrayList<SampleQaEvent>(); for (SampleQaEvent event : events) { if (!ReportUtil.documentHasBeenPrinted(ReportUtil.DocumentTypes.NON_CONFORMITY_NOTIFCATION, event.getId())) { filteredList.add(event); } } return filteredList; } @Override public void initializeReport(BaseActionForm dynaForm) { super.initializeReport(); sampleQaEventIds = new ArrayList<String>(); checkIdsForPriorPrintRecord = new HashSet<String>(); errorFound = false; requestedAccessionNumber = dynaForm.getString("accessionDirect"); ReportSpecificationList specificationList = (ReportSpecificationList)dynaForm.get("selectList"); createReportParameters(); errorFound = !validateSubmitParameters(specificationList.getSelection()); if (errorFound) { return; } createReportItems(specificationList.getSelection()); if (this.reportItems.size() == 0) { add1LineErrorMessage("report.error.message.noPrintableItems"); } } private boolean validateSubmitParameters(String serviceId) { if (GenericValidator.isBlankOrNull(requestedAccessionNumber) && (GenericValidator.isBlankOrNull(serviceId) || "0".equals(serviceId))) { add1LineErrorMessage("report.error.message.noParameters"); return false; } if (!GenericValidator.isBlankOrNull(requestedAccessionNumber)) { Sample sample = sampleDAO.getSampleByAccessionNumber(requestedAccessionNumber); if (sample == null) { add1LineErrorMessage("report.error.message.accession.not.valid"); return false; } } return true; } private void createReportItems(String serviceId) { reportItems = new ArrayList<NonConformityReportData>(); List<Sample> samples = getNonConformingSamples(serviceId); samples = sortAndFilterSamples(samples); for (Sample sample : samples) { reportItems.addAll(createNonconformityItem(sample)); } } private List<Sample> getNonConformingSamples(String serviceId) { List<Sample> samples = new ArrayList<Sample>(); if (!GenericValidator.isBlankOrNull(requestedAccessionNumber)) { // we've already checked to make sure there is a sample for the accessionNumber samples.add(sampleDAO.getSampleByAccessionNumber(requestedAccessionNumber)); } if( !GenericValidator.isBlankOrNull(serviceId)){ List<Sample> sampleList = sampleDAO.getSamplesWithPendingQaEventsByService(serviceId); samples.addAll(sampleList); } return samples; } private List<Sample> sortAndFilterSamples(List<Sample> samples) { Collections.sort(samples, new Comparator<Sample>() { @Override public int compare(Sample o1, Sample o2) { return o1.getAccessionNumber().compareTo(o2.getAccessionNumber()); } }); List<Sample> filteredSamples = new ArrayList<Sample>(); String previousAccessionNumber = ""; for (Sample sample : samples) { if (!previousAccessionNumber.equals(sample.getAccessionNumber())) { filteredSamples.add(sample); previousAccessionNumber = sample.getAccessionNumber(); } } return filteredSamples; } private List<NonConformityReportData> createNonconformityItem(Sample sample) { List<NonConformityReportData> items = new ArrayList<NonConformityReportData>(); Patient patient = ReportUtil.findPatient(sample); Project project = ReportUtil.findProject(sample); String sampleAccessionNumber = sample.getAccessionNumber(); String receivedDate = sample.getReceivedDateForDisplay(); String receivedHour = sample.getReceivedTimeForDisplay( ); String doctor = ReportUtil.findDoctorForSample(sample); String orgName = ""; SampleOrganization sampleOrg = sampleOrgDAO.getDataBySample(sample); if( sampleOrg != null && sampleOrg.getOrganization() != null){ orgName = sampleOrg.getOrganization().getOrganizationName(); } List<SampleQaEvent> sampleQaEvents = sampleQADAO.getSampleQaEventsBySample(sample); for (SampleQaEvent event : sampleQaEvents) { if (eventPrintable(sampleAccessionNumber, event)) { NonConformityReportData item = new NonConformityReportData(); QAService qa = new QAService(event); item.setAccessionNumber(sampleAccessionNumber); item.setReceivedDate(receivedDate); item.setReceivedHour(receivedHour); item.setService(orgName); item.setBiologist(qa.getObservationForDisplay( QAObservationType.AUTHORIZER )); item.setNonConformityDate(DateUtil.convertTimestampToStringDate(qa.getLastupdated())); item.setSection(qa.getObservationForDisplay( QAObservationType.SECTION )); item.setSubjectNumber(patient.getNationalId()); item.setSiteSubjectNumber(patient.getExternalId()); item.setStudy((project != null) ? project.getLocalizedName() : ""); item.setSampleType(ReportUtil.getSampleType(event)); item.setQaNote(NonConformityAction.getNoteForSampleQaEvent(event)); item.setSampleNote(NonConformityAction.getNoteForSample(sample)); item.setNonConformityReason(qa.getQAEvent().getLocalizedName()); item.setDoctor(doctor); items.add(item); sampleQaEventIds.add(qa.getEventId()); if( sampleAccessionNumber.equals(requestedAccessionNumber)){ checkIdsForPriorPrintRecord.add(qa.getEventId()); } } } return items; } private boolean eventPrintable(String sampleAccessionNumber, SampleQaEvent event) { if( sampleAccessionNumber.equals(requestedAccessionNumber)){ return true; } return !ReportUtil.documentHasBeenPrinted(ReportUtil.DocumentTypes.NON_CONFORMITY_NOTIFCATION, event.getId()); } @Override public JRDataSource getReportDataSource() throws IllegalStateException { if (errorFound) { return new JRBeanCollectionDataSource(errorMsgs); } else { ReportUtil.markDocumentsAsPrinted(ReportUtil.DocumentTypes.NON_CONFORMITY_NOTIFCATION, sampleQaEventIds, "1", checkIdsForPriorPrintRecord); return new JRBeanCollectionDataSource(reportItems); } } @Override protected String reportFileName() { return "NonConformityNotification"; } }