/** * 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.services.ReportTrackingService; import us.mn.state.health.lims.common.services.StatusService; import us.mn.state.health.lims.common.services.StatusService.AnalysisStatus; import us.mn.state.health.lims.common.services.TestService; 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.dictionary.valueholder.Dictionary; import us.mn.state.health.lims.reports.action.implementation.reportBeans.ARVReportData; 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.sampleorganization.dao.SampleOrganizationDAO; import us.mn.state.health.lims.sampleorganization.daoimpl.SampleOrganizationDAOImpl; import us.mn.state.health.lims.sampleorganization.valueholder.SampleOrganization; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; public abstract class PatientARVReport extends RetroCIPatientReport{ private List<ARVReportData> reportItems; private String invalidValue = StringUtil.getMessageForKey("report.test.status.inProgress"); protected void initializeReportItems(){ reportItems = new ArrayList<ARVReportData>(); } protected void setPatientInfo(ARVReportData data){ SampleOrganizationDAO orgDAO = new SampleOrganizationDAOImpl(); String subjectNumber = reportPatient.getNationalId(); if(GenericValidator.isBlankOrNull(subjectNumber)){ subjectNumber = reportPatient.getExternalId(); } data.setSubjectNumber(subjectNumber); data.setBirth_date(reportPatient.getBirthDateForDisplay()); data.setAge(DateUtil.getCurrentAgeForDate(reportPatient.getBirthDate(), reportSample.getCollectionDate())); data.setGender(reportPatient.getGender()); data.setCollectiondate(reportSample.getCollectionDateForDisplay() + " " + reportSample.getCollectionTimeForDisplay()); data.setReceptiondate(DateUtil.convertTimestampToStringDate(reportSample.getReceivedTimestamp())); SampleOrganization sampleOrg = new SampleOrganization(); sampleOrg.setSample(reportSample); orgDAO.getDataBySample(sampleOrg); data.setOrgname(sampleOrg.getId() == null ? "" : sampleOrg.getOrganization().getOrganizationName()); data.setDoctor(getObservationValues(OBSERVATION_DOCTOR_ID)); data.setLabNo(reportSample.getAccessionNumber()); data.getSampleQaEventItems(reportSample); } public JRDataSource getReportDataSource() throws IllegalStateException{ if(!initialized){ throw new IllegalStateException("initializeReport not called first"); } return errorFound ? new JRBeanCollectionDataSource(errorMsgs) : new JRBeanCollectionDataSource(reportItems); } protected void createReportItems(){ ARVReportData data = new ARVReportData(); setPatientInfo(data); setTestInfo(data); reportItems.add(data); } protected void setTestInfo(ARVReportData data){ boolean atLeastOneAnalysisNotValidated = false; AnalysisDAO analysisDAO = new AnalysisDAOImpl(); List<Analysis> analysisList = analysisDAO.getAnalysesBySampleId(reportSample.getId()); DictionaryDAO dictionaryDAO = new DictionaryDAOImpl(); Timestamp lastReport = new ReportTrackingService().getTimeOfLastNamedReport(reportSample, ReportTrackingService.ReportType.PATIENT, requestedReport); Boolean mayBeDuplicate = lastReport != null; ResultDAO resultDAO = new ResultDAOImpl(); for(Analysis analysis : analysisList){ if(!analysis.getStatusId().equals(StatusService.getInstance().getStatusID(AnalysisStatus.Canceled))){ String testName = TestService.getUserLocalizedTestName( analysis.getTest() ); List<Result> resultList = resultDAO.getResultsByAnalysis(analysis); String resultValue = null; boolean valid = ANALYSIS_FINALIZED_STATUS_ID.equals(analysis.getStatusId()); if(!valid){ atLeastOneAnalysisNotValidated = true; } // there may be more than one result for an analysis if one of // them // is a conclusion if(resultList.size() > 1){ for(Result result : resultList){ if(result.getAnalyte() != null && result.getAnalyte().getId().equals(CONCLUSION_ID)){ Dictionary dictionary = new Dictionary(); dictionary.setId(result.getValue()); dictionaryDAO.getData(dictionary); data.setVih(valid ? dictionary.getDictEntry() : invalidValue); data.setShowSerologie(Boolean.TRUE); }else if(result.getAnalyte() != null && result.getAnalyte().getId().equals(CD4_CNT_CONCLUSION)){ data.setCd4(valid ? result.getValue() : invalidValue); }else{ resultValue = result.getValue(); } } } if(resultList.size() > 0){ if(resultValue == null){ resultValue = resultList.get(resultList.size() - 1).getValue(); } } if(resultValue != null || !valid){ assignResultsToAVRReportData(data, testName, valid ? resultValue : invalidValue); } } if( mayBeDuplicate && StatusService.getInstance().matches( analysis.getStatusId(), AnalysisStatus.Finalized) && lastReport.before(analysis.getLastupdated())){ mayBeDuplicate = false; } } data.setDuplicateReport(mayBeDuplicate); data.setStatus(atLeastOneAnalysisNotValidated ? StringUtil.getMessageForKey("report.status.partial") : StringUtil .getMessageForKey("report.status.complete")); } private void assignResultsToAVRReportData(ARVReportData data, String testName, String resultValue){ if(testName.equals("Glycémie")){ data.setGlyc(resultValue); }else if(testName.equals("Créatininémie")){ data.setCreatininemie(resultValue); }else if(testName.equals("Transaminases ALTL")){ data.setSgpt(resultValue); }else if(testName.equals("Transaminases ASTL")){ data.setSgot(resultValue); }else if(testName.equals("GB")){ data.setGb(resultValue); }else if(testName.equals("GR")){ data.setGr(resultValue); }else if(testName.equals("Hb")){ data.setHb(resultValue); }else if(testName.equals("HCT")){ data.setHct(resultValue); }else if(testName.equals("VGM")){ data.setVgm(resultValue); }else if(testName.equals("PLQ")){ data.setPlq(resultValue); }else if(testName.equals("Neut %")){ data.setNper(resultValue); }else if(testName.equals("Lymph %")){ data.setLper(resultValue); }else if(testName.equals("Mono %")){ data.setMper(resultValue); }else if(testName.equals("Eo %")){ data.setEoper(resultValue); }else if(testName.equals("Baso %")){ data.setBper(resultValue); }else if(testName.equals("CD4 absolute count")){ data.setCd4(resultValue); }else if(testName.equals("CD4 percentage count")){ data.setCd4per(resultValue); }else if(testName.equals("TCMH")){ data.setTcmh(resultValue); }else if(testName.equals("CCMH")){ data.setCcmh(resultValue); }else if(testName.equals("DNA PCR")){ data.setPcr(resultValue); }else if(testName.equals("Viral Load")){ data.setShowVirologie(Boolean.TRUE); // Results entered via analyzer have log value, results entered // manually may not String baseValue = resultValue; if(!GenericValidator.isBlankOrNull(resultValue) && resultValue.contains("(")){ String[] splitValue = resultValue.split("\\("); data.setAmpli2(splitValue[0]); baseValue = splitValue[0]; }else{ data.setAmpli2(resultValue); } if(!GenericValidator.isBlankOrNull(baseValue) && !"0".equals(baseValue)){ try{ double viralLoad = Double.parseDouble(baseValue); data.setAmpli2lo(String.format("%.3g%n", Math.log10(viralLoad))); }catch(NumberFormatException nfe){ data.setAmpli2lo(""); } } }else if(testName.equals("Murex") || testName.equals("Intgral")){ //Serology must have one of these but not necessarily both data.setShowSerologie(Boolean.TRUE); if(GenericValidator.isBlankOrNull(data.getVih())){ data.setVih(invalidValue); } } } }