/** * 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) The Minnesota Department of Health. All Rights Reserved. */ package us.mn.state.health.lims.result.action; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.PropertyUtils; import org.apache.struts.Globals; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessages; 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.action.BaseActionForm; import us.mn.state.health.lims.common.exception.LIMSRuntimeException; import us.mn.state.health.lims.common.log.LogEvent; import us.mn.state.health.lims.common.util.DateUtil; import us.mn.state.health.lims.common.util.StringUtil; import us.mn.state.health.lims.common.util.SystemConfiguration; import us.mn.state.health.lims.common.util.validator.ActionError; 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.login.dao.UserTestSectionDAO; import us.mn.state.health.lims.login.daoimpl.UserTestSectionDAOImpl; import us.mn.state.health.lims.note.dao.NoteDAO; import us.mn.state.health.lims.note.daoimpl.NoteDAOImpl; import us.mn.state.health.lims.note.valueholder.Note; import us.mn.state.health.lims.patient.dao.PatientDAO; import us.mn.state.health.lims.patient.daoimpl.PatientDAOImpl; import us.mn.state.health.lims.patient.valueholder.Patient; import us.mn.state.health.lims.person.dao.PersonDAO; import us.mn.state.health.lims.person.daoimpl.PersonDAOImpl; import us.mn.state.health.lims.person.valueholder.Person; import us.mn.state.health.lims.referencetables.valueholder.ReferenceTables; 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.result.valueholder.ResultsEntryTestResultComparator; import us.mn.state.health.lims.result.valueholder.Sample_TestAnalyte; import us.mn.state.health.lims.result.valueholder.TestAnalyte_TestResults; 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.samplehuman.dao.SampleHumanDAO; import us.mn.state.health.lims.samplehuman.daoimpl.SampleHumanDAOImpl; import us.mn.state.health.lims.samplehuman.valueholder.SampleHuman; import us.mn.state.health.lims.sampleitem.dao.SampleItemDAO; import us.mn.state.health.lims.sampleitem.daoimpl.SampleItemDAOImpl; import us.mn.state.health.lims.sampleitem.valueholder.SampleItem; 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.test.dao.TestDAO; import us.mn.state.health.lims.test.daoimpl.TestDAOImpl; import us.mn.state.health.lims.test.valueholder.Test; import us.mn.state.health.lims.test.valueholder.TestComparator; import us.mn.state.health.lims.test.valueholder.TestSectionComparator; import us.mn.state.health.lims.testanalyte.dao.TestAnalyteDAO; import us.mn.state.health.lims.testanalyte.daoimpl.TestAnalyteDAOImpl; import us.mn.state.health.lims.testanalyte.valueholder.TestAnalyte; import us.mn.state.health.lims.testresult.dao.TestResultDAO; import us.mn.state.health.lims.testresult.daoimpl.TestResultDAOImpl; import us.mn.state.health.lims.testresult.valueholder.TestResult; /** * @author diane benz * //AIS - bugzilla 1863 * //AIS - bugzilla 1891 * To change this generated comment edit the template variable "typecomment": * Window>Preferences>Java>Templates. To enable and disable the creation of type * comments go to Window>Preferences>Java>Code Generation. * bugzilla 1992 - cleanup (remove counter definitions to stay consistent) * bugzilla 2614 - fix to work for NB samples */ public class BatchResultsEntryViewAction extends BaseAction { private boolean isNew = false; protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // The first job is to determine if we are coming to this action with an // ID parameter in the request. If there is no parameter, we are // creating a new Result. // If there is a parameter present, we should bring up an existing // Result to edit. String id = request.getParameter(ID); String forward = FWD_SUCCESS; request.setAttribute(ALLOW_EDITS_KEY, "true"); request.setAttribute(PREVIOUS_DISABLED, "true"); request.setAttribute(NEXT_DISABLED, "true"); BaseActionForm dynaForm = (BaseActionForm) form; //bugzilla 2028 sub bugzilla 2036 if coming back from Qa Events selectedTestId will be request parameter //bugzilla 2053 naming of static variable changed String selectedTestId = (String)request.getParameter("QA_EVENTS_ENTRY_ROUTING_FROM_BATCH_RESULTS_ENTRY_PARAM_TEST_ID");; if (StringUtil.isNullorNill(selectedTestId)) { selectedTestId = (String) dynaForm.get("selectedTestId"); } String receivedDateForDisplay = (String) dynaForm .get("receivedDateForDisplay"); String currentDate = (String) dynaForm.get("currentDate"); List testSections = (List) dynaForm.get("testSections"); List tests = (List) dynaForm.get("tests"); //bugzilla 2379 String selectedTestSectionId = (String)dynaForm.get("selectedTestSectionId"); //bugzilla 2379 TestDAO testDAO = new TestDAOImpl(); UserTestSectionDAO userTestSectionDAO = new UserTestSectionDAOImpl(); if (!StringUtil.isNullorNill(selectedTestSectionId)) { tests = testDAO.getTestsByTestSection(selectedTestSectionId); } else { testSections = userTestSectionDAO.getAllUserTestSections(request); tests = userTestSectionDAO.getAllUserTests(request, true); } ActionMessages errors = null; // bugzilla #1346 add ability to hover over accession number and // view patient/person information (first and last name and external id) //bugzilla 1387 renamed so more generic //bugzilla 2614 allow for NB domain samples // initialize the form dynaForm.initialize(mapping); List sample_Tas = new ArrayList(); List sample_Tasv = new ArrayList(); List sample_Tasvt = new ArrayList(); List testAnalyte_TestResults = new ArrayList(); if (!StringUtil.isNullorNill(selectedTestId)) { Test test = new Test(); test.setId(selectedTestId); testDAO.getData(test); List testAnalytes = new ArrayList(); TestAnalyteDAO testAnalyteDAO = new TestAnalyteDAOImpl(); testAnalytes = testAnalyteDAO.getAllTestAnalytesPerTest(test); try { List analyses = new ArrayList(); AnalysisDAO analysisDAO = new AnalysisDAOImpl(); //bugzilla 2227 analyses = analysisDAO.getAllMaxRevisionAnalysesPerTest(test); SampleDAO sampleDAO = new SampleDAOImpl(); ResultDAO resultDAO = new ResultDAOImpl(); PatientDAO patientDAO = new PatientDAOImpl(); PersonDAO personDAO = new PersonDAOImpl(); SampleItemDAO sampleItemDAO = new SampleItemDAOImpl(); SampleHumanDAO sampleHumanDAO = new SampleHumanDAOImpl(); SampleOrganizationDAO sampleOrganizationDAO = new SampleOrganizationDAOImpl(); NoteDAO noteDAO = new NoteDAOImpl(); Patient patient = new Patient(); Person person = new Person(); SampleHuman sampleHuman = new SampleHuman(); SampleOrganization sampleOrganization = new SampleOrganization(); Analysis analysis = null; SampleItem sampleItem = null; //bugzilla 2227 String sampleHasTestRevisions = "false"; for (int i = 0; i < analyses.size(); i++) { analysis = (Analysis) analyses.get(i); //bugzilla 2227 sampleHasTestRevisions = "false"; //bugzilla 1942 status results verified changed to released (logic is to say if analysis status is not yet released then go ahead) if(!StringUtil.isNullorNill(analysis.getStatus()) && !analysis.getStatus().equals(SystemConfiguration.getInstance() .getAnalysisStatusReleased()) ) { sampleItem = (SampleItem) analysis.getSampleItem(); //System.out.println("This is sampleItem " + sampleItem); if (sampleItem != null) { //bugzilla 1773 need to store sample not sampleId for use in sorting String sampleId = sampleItem.getSample().getId(); Sample sample = new Sample(); //bgm - bugzilla 1639 check sampleId first before using... if(sampleId !=null){ sample.setId(sampleId); sampleDAO.getData(sample); //bugzilla 2227 if (!analysis.getRevision().equals("0")) { sampleHasTestRevisions = "true"; } // bugzilla #1346 add ability to hover over accession // number and // view patient/person information (first and last name // and external id) //bugzilla 2614 allow for NB domain samples // bugzilla #1346 add ability to hover over // accession number and // view patient/person information (first and last // name and external id) if (!StringUtil.isNullorNill(sample.getId())) { //bugzilla 2252 sampleHuman = new SampleHuman(); patient = new Patient(); person = new Person(); sampleHuman.setSampleId(sample.getId()); sampleHumanDAO.getDataBySample(sampleHuman); sampleOrganization.setSample(sample); sampleOrganizationDAO.getDataBySample(sampleOrganization); if(sampleHuman !=null){ patient.setId(sampleHuman.getPatientId()); if(patient.getId() !=null) { patientDAO.getData(patient); person = patient.getPerson(); personDAO.getData(person); } } Sample_TestAnalyte sample_Ta = new Sample_TestAnalyte(); Sample_TestAnalyte sample_Tav = new Sample_TestAnalyte(); Sample_TestAnalyte sample_Tavt = new Sample_TestAnalyte(); // System.out.println("This is // sample.getReceivedDate " // + sample.getReceivedDate()); // System.out.println("This is // receivedDateForDisplay " // + receivedDateForDisplay); String locale = SystemConfiguration.getInstance() .getDefaultLocale().toString(); java.sql.Date convertedReceivedDate = DateUtil.convertStringDateToSqlDate( receivedDateForDisplay, locale); if (sample.getReceivedDate().equals(convertedReceivedDate) || StringUtil.isNullorNill(receivedDateForDisplay)) { // exclude samples for which results have been // entered // (status code?? in analysis or sample) sample_Ta.setSample(sample); // bugzilla #1346 add ability to hover over // accession number and // view patient/person information (first and // last name and external id) // display N/A if no first, last name if (person.getFirstName() == null && person.getLastName() == null) { person.setFirstName(NOT_APPLICABLE); person.setLastName(BLANK); } if (person.getFirstName() != null && person.getLastName() == null) { person.setLastName(BLANK); } if (person.getFirstName() == null && person.getLastName() != null) { person.setFirstName(BLANK); } sample_Ta.setPerson(person); // display N/A if no externalId if (patient.getExternalId() == null) { patient.setExternalId(NOT_APPLICABLE); } sample_Ta.setPatient(patient); sample_Ta.setAnalysis(analysis); sample_Ta.setTestAnalytes(testAnalytes); List results = new ArrayList(); List resultValues = new ArrayList(); List resultValuesn = new ArrayList(); List resultValuest = new ArrayList(); List resultIds = new ArrayList(); List resultLastupdatedList = new ArrayList(); List sampleResultHasNotesList = new ArrayList(); for (int j = 0; j < testAnalytes.size(); j++) { TestAnalyte ta = (TestAnalyte) testAnalytes .get(j); Result result = new Result(); resultDAO.getResultByAnalysisAndAnalyte( result, analysis, ta); if (result != null) { if (result.getTestResult() != null) { resultIds.add(result.getId()); TestResult tr = result .getTestResult(); String trId = tr.getId(); results.add(trId); if (tr.getTestResultType().equalsIgnoreCase(SystemConfiguration.getInstance().getNumericType())){ resultValues.add(result.getValue()); resultValuesn.add(result.getValue()); resultValuest.add(""); }else if(tr.getTestResultType().equalsIgnoreCase(SystemConfiguration.getInstance().getTiterType())){ String resultValue = result.getValue(); resultValue = resultValue.substring(2,resultValue.length()); resultValues.add(resultValue); resultValuest.add(resultValue); resultValuesn.add(""); }else{ resultValues.add(""); resultValuesn.add(""); resultValuest.add(""); } resultLastupdatedList.add(result .getLastupdated()); } else { results.add(""); resultIds.add("0"); resultValues.add(""); resultValuesn.add(""); resultValuest.add(""); resultLastupdatedList .add(new Timestamp( System.currentTimeMillis())); } } else { results.add(""); resultIds.add("0"); resultValues.add(""); resultValuesn.add(""); resultValuest.add(""); resultLastupdatedList .add(new Timestamp( System.currentTimeMillis())); } // bugzilla 1942 now get the Notes for this result if // exist/ we need to know about notes on batch result entry // in order to determine whether an existing result is allowed to be deleted if (result != null && result.getTestResult() != null) { Note note = new Note(); List notesByResult = new ArrayList(); note.setReferenceId(result.getId()); //bugzilla 1922 //bugzilla 2571 go through ReferenceTablesDAO to get reference tables info ReferenceTables referenceTables = new ReferenceTables(); referenceTables.setId(SystemConfiguration .getInstance() .getResultReferenceTableId()); //bugzilla 2571 go through ReferenceTablesDAO to get reference tables info note .setReferenceTables(referenceTables); notesByResult = noteDAO .getAllNotesByRefIdRefTable(note); if (notesByResult != null && notesByResult.size() > 0) { sampleResultHasNotesList.add(true); } else { sampleResultHasNotesList.add(false); } } else {//no result sampleResultHasNotesList.add(false); } //END 1942 } sample_Ta.setSampleTestResultIds(results); sample_Ta.setResultLastupdatedList(resultLastupdatedList); sample_Ta.setTestResultValues(resultValues); sample_Ta.setResultIds(resultIds); sample_Ta.setResultHasNotesList(sampleResultHasNotesList); //bugzilla 2227 sample_Ta.setSampleHasTestRevisions(sampleHasTestRevisions); sample_Tav.setTestResultValues(resultValuesn); sample_Tavt.setTestResultValues(resultValuest); sample_Tas.add(sample_Ta); sample_Tasv.add(sample_Tav); sample_Tasvt.add(sample_Tavt); } } // bugzilla #1346 add ability to hover over // accession number and // view patient/person information (first and last // name and external id) } } }//end if analysisStatus check }//end for loop // Load list of TestAnalyte_TestResults for display TestResultDAO testResultDAO = new TestResultDAOImpl(); DictionaryDAO dictDAO = new DictionaryDAOImpl(); TestAnalyte ta = null; TestAnalyte_TestResults ta_Trs = null; List listOfTestResults = null; for (int i = 0; i < testAnalytes.size(); i++) { ta = (TestAnalyte) testAnalytes.get(i); ta_Trs = new TestAnalyte_TestResults(); ta_Trs.setTestAnalyte(ta); listOfTestResults = new ArrayList(); listOfTestResults = testResultDAO .getTestResultsByTestAndResultGroup(ta); // fill in dictionary values for (int j = 0; j < listOfTestResults.size(); j++) { TestResult tr = (TestResult) listOfTestResults.get(j); if (tr.getTestResultType().equals( SystemConfiguration.getInstance() .getDictionaryType())) { // get from dictionary Dictionary dictionary = new Dictionary(); dictionary.setId(tr.getValue()); dictDAO.getData(dictionary); //bugzilla 1847: use dictEntryDisplayValue tr.setValue(dictionary.getDictEntryDisplayValue()); } } //bugzilla 1845 Collections.sort(listOfTestResults, ResultsEntryTestResultComparator.SORTORDER_VALUE_COMPARATOR); ta_Trs.setTestResults(listOfTestResults); testAnalyte_TestResults.add(ta_Trs); } } catch (LIMSRuntimeException lre) { // if error then forward to fail and don't update to blank // page // = false //bugzilla 2154 LogEvent.logError("BatchResultsEntryViewAction","performAction()",lre.toString()); errors = new ActionMessages(); ActionError error = null; error = new ActionError("errors.GetException", null, null); errors.add(ActionMessages.GLOBAL_MESSAGE, error); saveErrors(request, errors); request.setAttribute(Globals.ERROR_KEY, errors); request.setAttribute(ALLOW_EDITS_KEY, "false"); return mapping.findForward(FWD_FAIL); } } // #1347 sort dropdown values Collections.sort(testSections, TestSectionComparator.NAME_COMPARATOR); //bugzilla 1844 Collections.sort(tests, TestComparator.DESCRIPTION_COMPARATOR); PropertyUtils.setProperty(form, "sample_TestAnalytes", sample_Tas); PropertyUtils.setProperty(form, "resultValueN", sample_Tasv); PropertyUtils.setProperty(form, "resultValueT", sample_Tasvt); PropertyUtils.setProperty(form, "testAnalyte_TestResults", testAnalyte_TestResults); PropertyUtils.setProperty(form, "selectedTestId", selectedTestId); //bugzilla 2379 PropertyUtils.setProperty(form, "selectedTestSectionId", selectedTestSectionId); PropertyUtils.setProperty(form, "receivedDateForDisplay", receivedDateForDisplay); PropertyUtils.setProperty(form, "tests", tests); PropertyUtils.setProperty(form, "testSections", testSections); PropertyUtils.setProperty(form, "currentDate", currentDate); return mapping.findForward(forward); } protected String getPageTitleKey() { if (isNew) { return "batchresultsentry.add.title"; } else { return "batchresultsentry.edit.title"; } } protected String getPageSubtitleKey() { if (isNew) { return "batchresultsentry.add.subtitle"; } else { return "batchresultsentry.edit.subtitle"; } } }