/* * 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.test.action; import org.apache.commons.beanutils.PropertyUtils; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.validator.DynaValidatorForm; import org.hibernate.Transaction; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; 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.action.BaseAction; import us.mn.state.health.lims.common.exception.LIMSRuntimeException; import us.mn.state.health.lims.common.services.AnalysisService; import us.mn.state.health.lims.common.services.DisplayListService; import us.mn.state.health.lims.common.services.StatusService; import us.mn.state.health.lims.common.services.TestService; import us.mn.state.health.lims.common.util.StringUtil; import us.mn.state.health.lims.hibernate.HibernateUtil; import us.mn.state.health.lims.test.valueholder.Test; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; public class BatchTestReassignmentUpdateAction extends BaseAction { private AnalysisDAO analysisDAO = new AnalysisDAOImpl(); @Override protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String currentUserId = getSysUserId(request); DynaValidatorForm dynaForm = (DynaValidatorForm)form; String jsonString = dynaForm.getString("jsonWad"); // System.out.println(jsonString); List<Analysis> newAnalysis = new ArrayList<Analysis>(); List<Analysis> cancelAnalysis = new ArrayList<Analysis>(); List<BatchTestStatusChangeBean> changeBeans = new ArrayList<BatchTestStatusChangeBean>(); StatusChangedMetaInfo changedMetaInfo = new StatusChangedMetaInfo(); manageAnalysis(jsonString, cancelAnalysis, newAnalysis, changeBeans, changedMetaInfo); String cancelStatus = StatusService.getInstance().getStatusID(StatusService.AnalysisStatus.Canceled); Transaction tx = HibernateUtil.getSession().beginTransaction(); try{ for( Analysis analysis : cancelAnalysis){ analysis.setStatusId(cancelStatus); analysis.setSysUserId(currentUserId); analysisDAO.updateData(analysis); } for( Analysis analysis: newAnalysis){ analysis.setSysUserId(currentUserId); analysisDAO.insertData(analysis, false); } tx.commit(); }catch (LIMSRuntimeException e){ tx.rollback(); } if( changeBeans.isEmpty()) { return mapping.findForward("success"); }else{ dynaForm.initialize(mapping); PropertyUtils.setProperty(dynaForm, "sampleList", DisplayListService.getList(DisplayListService.ListType.SAMPLE_TYPE_ACTIVE)); PropertyUtils.setProperty(dynaForm, "statusChangedList", changeBeans); PropertyUtils.setProperty(dynaForm, "statusChangedSampleType", changedMetaInfo.sampleTypeName); PropertyUtils.setProperty(dynaForm, "statusChangedCurrentTest", changedMetaInfo.currentTest); PropertyUtils.setProperty(dynaForm, "statusChangedNextTest", changedMetaInfo.nextTest); return mapping.findForward("resubmit"); } } private void manageAnalysis(String jsonString, List<Analysis> cancelAnalysis, List<Analysis> newAnalysis, List<BatchTestStatusChangeBean> changeBeans, StatusChangedMetaInfo changedMetaInfo) { JSONParser parser=new JSONParser(); try { JSONObject obj = (JSONObject)parser.parse(jsonString); List<Test> newTests = getNewTestsFromJson(obj, parser); List<Analysis> changedNotStarted = getAnalysisFromJson((String)obj.get("changeNotStarted"), parser); List<Analysis> noChangedNotStarted = getAnalysisFromJson((String)obj.get("noChangeNotStarted"), parser); List<Analysis> changeTechReject = getAnalysisFromJson((String)obj.get("changeTechReject"), parser); List<Analysis> noChangeTechReject = getAnalysisFromJson((String)obj.get("noChangeTechReject"), parser); List<Analysis> changeBioReject = getAnalysisFromJson((String)obj.get("changeBioReject"), parser); List<Analysis> noChangeBioReject = getAnalysisFromJson((String)obj.get("noChangeBioReject"), parser); List<Analysis> changeNotValidated = getAnalysisFromJson((String)obj.get("changeNotValidated"), parser); List<Analysis> noChangeNotValidated = getAnalysisFromJson((String)obj.get("noChangeNotValidated"), parser); verifyStatusNotChanged(changedNotStarted, noChangedNotStarted, StatusService.AnalysisStatus.NotStarted, changeBeans); verifyStatusNotChanged(changeNotValidated, noChangeNotValidated, StatusService.AnalysisStatus.TechnicalAcceptance, changeBeans); verifyStatusNotChanged(changeTechReject, noChangeTechReject, StatusService.AnalysisStatus.TechnicalRejected, changeBeans); verifyStatusNotChanged(changeBioReject, noChangeBioReject, StatusService.AnalysisStatus.BiologistRejected, changeBeans); cancelAnalysis.addAll(changedNotStarted); cancelAnalysis.addAll(changeBioReject); cancelAnalysis.addAll(changeNotValidated); cancelAnalysis.addAll(changeTechReject); if( !newTests.isEmpty()){ newAnalysis.addAll(createNewAnalysis( newTests, changedNotStarted)); newAnalysis.addAll(createNewAnalysis( newTests, changeBioReject)); newAnalysis.addAll(createNewAnalysis( newTests, changeNotValidated)); newAnalysis.addAll(createNewAnalysis( newTests, changeTechReject)); } if( !changeBeans.isEmpty()){ String newTestsString; if( newTests.isEmpty()){ newTestsString = StringUtil.getMessageForKey("status.test.canceled"); }else{ newTestsString = StringUtil.getMessageForKey("label.test.batch.reassignment") + ": " + TestService.getUserLocalizedTestName(newTests.get(0)); for( int i = 1; i < newTests.size(); i++){ newTestsString += ", " + TestService.getUserLocalizedTestName(newTests.get(i)); } } changedMetaInfo.nextTest = newTestsString; changedMetaInfo.currentTest = (String)obj.get("current"); changedMetaInfo.sampleTypeName = (String)obj.get("sampleType"); } } catch (ParseException e) { e.printStackTrace(); } } private List<Analysis> createNewAnalysis(List<Test> newTests, List<Analysis> changeAnalysis) { List<Analysis> newAnalysis = new ArrayList<Analysis>(); for( Test test:newTests){ for(Analysis analysis: changeAnalysis){ newAnalysis.add(AnalysisService.buildAnalysis(test, analysis.getSampleItem())); } } return newAnalysis; } private void verifyStatusNotChanged(List<Analysis> changed, List<Analysis> noChanged, StatusService.AnalysisStatus status, List<BatchTestStatusChangeBean> changeBeans) { String statusId = StatusService.getInstance().getStatusID(status); List<Analysis> changedAnalysis = new ArrayList<Analysis>(); for(Analysis analysis: changed){ if( !statusId.equals(analysis.getStatusId())){ changedAnalysis.add(analysis); } } if(!changedAnalysis.isEmpty()){ changed.removeAll(changedAnalysis); } for(Analysis analysis: noChanged){ if( !statusId.equals(analysis.getStatusId())){ changedAnalysis.add(analysis); } } if(!changedAnalysis.isEmpty()){ String oldStatus = getStatusName(status); for( Analysis analysis: changedAnalysis){ BatchTestStatusChangeBean bean = new BatchTestStatusChangeBean(); bean.setLabNo(analysis.getSampleItem().getSample().getAccessionNumber()); bean.setOldStatus(oldStatus); bean.setNewStatus(getStatusName(analysis.getStatusId())); changeBeans.add(bean); } } } private String getStatusName(String statusId) { StatusService.AnalysisStatus status = StatusService.getInstance().getAnalysisStatusForID(statusId); String name = getStatusName(status); return name == null ? StatusService.getInstance().getStatusName(status) : name; } private String getStatusName(StatusService.AnalysisStatus status) { switch( status) { case NotStarted: return StringUtil.getMessageForKey("label.analysisNotStarted"); case TechnicalRejected: return StringUtil.getMessageForKey("label.rejectedByTechnician"); case TechnicalAcceptance: return StringUtil.getMessageForKey("label.notValidated"); case BiologistRejected: return StringUtil.getMessageForKey("label.rejectedByBiologist"); default: return null; } } private List<Test> getNewTestsFromJson(JSONObject obj, JSONParser parser) { List<Test> replacementTestList = new ArrayList<Test>(); String replacementTests = (String)obj.get("replace"); if( replacementTests == null){ return replacementTestList; } JSONArray replacementTestArray; try { replacementTestArray = (JSONArray) parser.parse(replacementTests); } catch (ParseException e) { e.printStackTrace(); return replacementTestList; } for(Object testIdObject : replacementTestArray){ replacementTestList.add(new TestService((String)testIdObject).getTest()); } return replacementTestList; } private List<Analysis> getAnalysisFromJson(String sampleIdList, JSONParser parser) { List<Analysis> analysisList = new ArrayList<Analysis>(); if(sampleIdList == null){ return analysisList; } JSONArray modifyAnalysisArray; try { modifyAnalysisArray = (JSONArray) parser.parse(sampleIdList); } catch (ParseException e) { e.printStackTrace(); return analysisList; } for (Object analysisId : modifyAnalysisArray){ analysisList.add(analysisDAO.getAnalysisById((String)analysisId)); } return analysisList; } @Override protected String getPageTitleKey() { return "configuration.batch.test.reassignment"; } @Override protected String getPageSubtitleKey() { return "configuration.batch.test.reassignment"; } private class StatusChangedMetaInfo{ public String currentTest; public String nextTest; public String sampleTypeName; } }