/**
* 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.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.*;
import us.mn.state.health.lims.common.services.StatusService.AnalysisStatus;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.common.util.StringUtil;
import us.mn.state.health.lims.referral.valueholder.Referral;
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.util.AccessionNumberUtil;
import us.mn.state.health.lims.sampleitem.valueholder.SampleItem;
import us.mn.state.health.lims.test.valueholder.Test;
import java.util.*;
public class PatientClinicalReport extends PatientReport implements IReportCreator, IReportParameterSetter{
private AnalysisDAO analysisDAO = new AnalysisDAOImpl();
private static Set<Integer> analysisStatusIds;
private boolean isLNSP = false;
protected List<ClinicalPatientData> clinicalReportItems;
static{
analysisStatusIds = new HashSet<Integer>();
analysisStatusIds.add(Integer.parseInt(StatusService.getInstance().getStatusID(AnalysisStatus.BiologistRejected)));
analysisStatusIds.add(Integer.parseInt(StatusService.getInstance().getStatusID(AnalysisStatus.Finalized)));
analysisStatusIds.add(Integer.parseInt(StatusService.getInstance().getStatusID(AnalysisStatus.NonConforming_depricated)));
analysisStatusIds.add(Integer.parseInt(StatusService.getInstance().getStatusID(AnalysisStatus.NotStarted)));
analysisStatusIds.add(Integer.parseInt(StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalAcceptance)));
analysisStatusIds.add(Integer.parseInt(StatusService.getInstance().getStatusID(AnalysisStatus.Canceled)));
analysisStatusIds.add(Integer.parseInt( StatusService.getInstance().getStatusID( AnalysisStatus.TechnicalRejected ) ) );
}
public PatientClinicalReport(){
super();
}
public PatientClinicalReport( boolean isLNSP ){
super();
this.isLNSP = isLNSP;
}
@Override
protected String reportFileName(){
return "PatientClinicalReport";
}
@Override
protected void createReportItems(){
List<Analysis> analysisList = analysisDAO.getAnalysesBySampleIdAndStatusId(currentSampleService.getId(), analysisStatusIds);
currentConclusion = null;
Set<SampleItem> sampleSet = new HashSet<SampleItem>( );
List<ClinicalPatientData> currentSampleReportItems = new ArrayList<ClinicalPatientData>( analysisList.size() );
for(Analysis analysis : analysisList){
sampleSet.add( analysis.getSampleItem() );
boolean hasParentResult = analysis.getParentResult() != null;
if(analysis.getTest() != null ){
currentAnalysisService = new AnalysisService( analysis );
ClinicalPatientData resultsData = buildClinicalPatientData( hasParentResult );
if(currentAnalysisService.getAnalysis().isReferredOut()){
Referral referral = referralDao.getReferralByAnalysisId( currentAnalysisService.getAnalysis().getId() );
if(referral != null){
List<ClinicalPatientData> referredData = addReferredTests(referral, resultsData);
currentSampleReportItems.addAll( referredData );
}
}else{
currentSampleReportItems.add( resultsData );
}
}
}
reportItems.addAll( currentSampleReportItems );
setCollectionTime( sampleSet, currentSampleReportItems, false );
}
private List<ClinicalPatientData> addReferredTests(Referral referral, ClinicalPatientData parentData){
List<ClinicalPatientData> currentSampleReportItems = new ArrayList<ClinicalPatientData>( );
List<ReferralResult> referralResults = referralResultDAO.getReferralResultsForReferral(referral.getId());
String note = new NoteService( currentAnalysisService.getAnalysis() ).getNotesAsString( false, true, "<br/>", FILTER, true );
if( !referralResults.isEmpty()){
boolean referralTestAssigned = false;
for( ReferralResult referralResult : referralResults){
if( referralResult.getTestId() != null){
referralTestAssigned = true;
}
}
if( !referralTestAssigned){
currentSampleReportItems.add( parentData );
}
}else{
currentSampleReportItems.add( parentData );
}
for(int i = 0; i < referralResults.size(); i++){
if( referralResults.get(i).getResult() == null ){
sampleCompleteMap.put(currentSampleService.getAccessionNumber(), Boolean.FALSE);
}else{
i = reportReferralResultValue(referralResults, i);
ReferralResult referralResult = referralResults.get(i);
ClinicalPatientData data = new ClinicalPatientData();
copyParentData(data, parentData);
data.setResult(reportReferralResultValue);
data.setNote(note);
String testId = referralResult.getTestId();
if(!GenericValidator.isBlankOrNull(testId)){
Test test = new Test();
test.setId(testId);
testDAO.getData(test);
data.setTestName( TestService.getUserLocalizedReportingTestName( test ) );
String uom = getUnitOfMeasure( test);
if(reportReferralResultValue != null){
data.setReferralResult(addIfNotEmpty(reportReferralResultValue, uom));
}
data.setTestRefRange(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() );
}
if(GenericValidator.isBlankOrNull(reportReferralResultValue)){
sampleCompleteMap.put(currentSampleService.getAccessionNumber(), Boolean.FALSE);
data.setResult(StringUtil.getMessageForKey("report.test.status.inProgress"));
}else{
data.setResult( reportReferralResultValue );
}
data.setAlerts(getResultFlag(referralResult.getResult(), null));
data.setHasRangeAndUOM(referralResult.getResult() != null && "N".equals(referralResult.getResult().getResultType()));
currentSampleReportItems.add( data );
}
}
return currentSampleReportItems;
}
private void copyParentData(ClinicalPatientData data, ClinicalPatientData parentData){
data.setContactInfo(parentData.getContactInfo());
data.setSiteInfo(parentData.getSiteInfo());
data.setReceivedDate(parentData.getReceivedDate());
data.setDob(parentData.getDob());
data.setAge(parentData.getAge());
data.setGender(parentData.getGender());
data.setNationalId(parentData.getNationalId());
data.setPatientName(parentData.getPatientName());
data.setFirstName(parentData.getFirstName());
data.setLastName(parentData.getLastName());
data.setDept(parentData.getDept());
data.setCommune(parentData.getCommune());
data.setStNumber(parentData.getStNumber());
data.setAccessionNumber(parentData.getAccessionNumber());
}
@Override
protected void postSampleBuild(){
if(reportItems.isEmpty()){
ClinicalPatientData reportItem = buildClinicalPatientData( false );
reportItem.setTestSection(StringUtil.getMessageForKey("report.no.results"));
clinicalReportItems.add(reportItem);
}else{
buildReport();
}
}
private void buildReport(){
Collections.sort(reportItems, new Comparator<ClinicalPatientData>(){
@Override
public int compare(ClinicalPatientData o1, ClinicalPatientData o2){
String o1AccessionNumber = AccessionNumberUtil.getAccessionNumberFromSampleItemAccessionNumber(o1.getAccessionNumber());
String o2AccessionNumber = AccessionNumberUtil.getAccessionNumberFromSampleItemAccessionNumber(o2.getAccessionNumber());
int accessionSort = o1AccessionNumber.compareTo(o2AccessionNumber);
if(accessionSort != 0){
return accessionSort;
}
if(o1.getSectionSortOrder() > o2.getSectionSortOrder()){
return 1;
}else if(o1.getSectionSortOrder() < o2.getSectionSortOrder()){
return -1;
}
int o1Panel = Integer.MAX_VALUE;
int o2Panel = Integer.MAX_VALUE;
if(o1.getPanel() != null){
o1Panel = o1.getPanel().getSortOrderInt();
}
if(o2.getPanel() != null){
o2Panel = o2.getPanel().getSortOrderInt();
}
int panelSort = o1Panel - o2Panel;
if(panelSort != 0){
return panelSort;
}
if( o1.getParentResult() != null && o2.getParentResult() != null){
int parentSort = Integer.parseInt( o1.getParentResult().getId()) -
Integer.parseInt( o2.getParentResult().getId());
if( parentSort != 0){
return parentSort;
}
}
return o1.getTestSortOrder() - o2.getTestSortOrder();
}
});
ArrayList<ClinicalPatientData> augmentedList = new ArrayList<ClinicalPatientData>( reportItems.size() );
HashSet<String> parentResults = new HashSet<String>( );
for(ClinicalPatientData data : reportItems){
if( data.getParentResult() != null && !parentResults.contains( data.getParentResult().getId() )){
parentResults.add( data.getParentResult().getId() );
ClinicalPatientData marker = new ClinicalPatientData(data);
marker.setTestName( new ResultService(data.getParentResult()).getSimpleResultValue() );
marker.setResult( null );
marker.setTestRefRange( null );
marker.setParentMarker( true );
augmentedList.add( marker );
}
augmentedList.add( data );
}
reportItems = augmentedList;
String currentPanelId = null;
for(ClinicalPatientData reportItem : reportItems){
if(reportItem.getPanel() != null && !reportItem.getPanel().getId().equals(currentPanelId)){
currentPanelId = reportItem.getPanel().getId();
reportItem.setSeparator(true);
}else if(reportItem.getPanel() == null && currentPanelId != null){
currentPanelId = null;
reportItem.setSeparator(true);
}
reportItem.setAccessionNumber(reportItem.getAccessionNumber().split("-")[0]);
reportItem.setCompleteFlag(StringUtil.getMessageForKey(sampleCompleteMap.get(reportItem.getAccessionNumber()) ? "report.status.complete" : "report.status.partial"));
if( reportItem.isCorrectedResult()){
//The report is French only
if( reportItem.getNote() != null && reportItem.getNote().length() > 0 ){
reportItem.setNote( "Résultat corrigé<br/>" + reportItem.getNote() );
}else{
reportItem.setNote( "Résultat corrigé" );
}
}
reportItem.setCorrectedResult( sampleCorrectedMap.get(reportItem.getAccessionNumber().split( "_" )[0]) != null );
}
}
@Override
protected String getReportNameForParameterPage(){
return StringUtil.getMessageForKey("openreports.patientTestStatus");
}
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 initializeReportItems(){
super.initializeReportItems();
clinicalReportItems = new ArrayList<ClinicalPatientData>();
}
@Override
protected void setReferredResult(ClinicalPatientData data, Result result){
data.setResult(data.getResult() );
data.setAlerts(getResultFlag(result, null));
}
@Override
protected boolean appendUOMToRange(){
return false;
}
@Override
protected boolean augmentResultWithFlag(){
return false;
}
@Override
protected boolean useReportingDescription(){
return true;
}
@Override
protected String getHeaderName(){
return "GeneralHeader.jasper";
}
}