/** * 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.testmanagement.action; import org.apache.struts.Globals; import org.apache.struts.action.*; import org.hibernate.Transaction; import us.mn.state.health.lims.action.dao.ActionDAO; import us.mn.state.health.lims.action.daoimpl.ActionDAOImpl; import us.mn.state.health.lims.action.valueholder.Action; 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.analysisqaevent.dao.AnalysisQaEventDAO; import us.mn.state.health.lims.analysisqaevent.daoimpl.AnalysisQaEventDAOImpl; import us.mn.state.health.lims.analysisqaevent.valueholder.AnalysisQaEvent; import us.mn.state.health.lims.analysisqaeventaction.dao.AnalysisQaEventActionDAO; import us.mn.state.health.lims.analysisqaeventaction.daoimpl.AnalysisQaEventActionDAOImpl; import us.mn.state.health.lims.analysisqaeventaction.valueholder.AnalysisQaEventAction; 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.LIMSDuplicateRecordException; 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.resources.ResourceLocator; import us.mn.state.health.lims.common.util.validator.ActionError; import us.mn.state.health.lims.hibernate.HibernateUtil; import us.mn.state.health.lims.login.valueholder.UserSessionData; import us.mn.state.health.lims.qaevent.dao.QaEventDAO; import us.mn.state.health.lims.qaevent.daoimpl.QaEventDAOImpl; import us.mn.state.health.lims.qaevent.valueholder.QaEvent; 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.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.systemuser.dao.SystemUserDAO; import us.mn.state.health.lims.systemuser.daoimpl.SystemUserDAOImpl; import us.mn.state.health.lims.systemuser.valueholder.SystemUser; 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.typeofsample.valueholder.TypeOfSample; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Locale; public class TestVerificationNewbornUpdateAction extends BaseAction { protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String forward = FWD_SUCCESS; BaseActionForm dynaForm = (BaseActionForm) form; Sample sample = new Sample(); SampleItem sampleItem = new SampleItem(); TypeOfSample typeOfSample = new TypeOfSample(); SampleOrganization sampleOrganization = new SampleOrganization(); String accessionNumber = (String) dynaForm.get("accessionNumber"); String stringOfTestIds = (String) dynaForm.get("selectedTestIds"); // set current date for validation of dates Date today = Calendar.getInstance().getTime(); String dateAsText = DateUtil.formatDateAsText(today); Transaction tx = HibernateUtil.getSession().beginTransaction(); try { SampleDAO sampleDAO = new SampleDAOImpl(); sample.setAccessionNumber(accessionNumber); sampleDAO.getSampleByAccessionNumber(sample); SampleItemDAO sampleItemDAO = new SampleItemDAOImpl(); AnalysisDAO analysisDAO = new AnalysisDAOImpl(); AnalysisQaEventDAO analysisQaEventDAO = new AnalysisQaEventDAOImpl(); AnalysisQaEventActionDAO analysisQaEventActionDAO = new AnalysisQaEventActionDAOImpl(); QaEventDAO qaEventDAO = new QaEventDAOImpl(); ActionDAO actionDAO = new ActionDAOImpl(); SampleOrganizationDAO sampleOrganizationDAO = new SampleOrganizationDAOImpl(); // bugzilla 1773 need to store sample not sampleId for use in // sorting sampleItem.setSample(sample); sampleItemDAO.getDataBySample(sampleItem); String[] listOfTestIds = stringOfTestIds.split(SystemConfiguration .getInstance().getDefaultIdSeparator(), -1); // bugzilla 1926 insert logging - get sysUserId from login module UserSessionData usd = (UserSessionData)request.getSession().getAttribute(USER_SESSION_DATA); String sysUserId = String.valueOf(usd.getSystemUserId()); //bugzilla 2481, 2496 Action Owner SystemUser systemUser = new SystemUser(); systemUser.setId(sysUserId); SystemUserDAO systemUserDAO = new SystemUserDAOImpl(); systemUserDAO.getData(systemUser); for (int i = 0; i < listOfTestIds.length; i++) { if (!StringUtil.isNullorNill(listOfTestIds[i])) { Analysis analysis = new Analysis(); Test test = new Test(); String testId = (String) listOfTestIds[i]; test.setId(testId); TestDAO testDAO = new TestDAOImpl(); testDAO.getData(test); analysis.setTest(test); analysis.setSampleItem(sampleItem); analysis.setAnalysisType("TEST"); analysis.setStatus(SystemConfiguration.getInstance() .getAnalysisStatusAssigned()); // bugzilla 1942 analysis.setIsReportable(test.getIsReportable()); // bugzilla 1926 insert logging - get sysUserId from login // module analysis.setSysUserId(sysUserId); //bugzilla 2064 analysis.setRevision(SystemConfiguration.getInstance().getAnalysisDefaultRevision()); //bugzilla 2013 added duplicateCheck parameter analysisDAO.insertData(analysis, true); if (i == 1) { if (!StringUtil.isNullorNill(sample.getStatus()) && sample.getStatus().equals( SystemConfiguration.getInstance() .getSampleStatusReleased())) { // bugzilla 1942: if sample status WAS released set // it // back to HSE2 complete sample.setStatus(SystemConfiguration.getInstance() .getSampleStatusEntry2Complete()); // bugzilla 1942 remove released date since we are // returning to HSE2 completed status sample.setReleasedDateForDisplay(null); // bugzilla 1926 insert audit logging - get // sysUserId // from login module sample.setSysUserId(sysUserId); sampleDAO.updateData(sample); } } } } // bugzilla 2028 qa event logic needs to be executed for new and // existing analyses for this sample // ADDITIONAL REQUIREMENT ADDED 8/30: only for HSE2 Completed Status (see bugzilla 2032) boolean isSampleStatusReadyForQaEvent = false; if (!StringUtil.isNullorNill(sample.getStatus()) && (sample.getStatus().equals(SystemConfiguration.getInstance().getSampleStatusReleased())) || sample.getStatus().equals(SystemConfiguration.getInstance().getSampleStatusEntry2Complete())) { isSampleStatusReadyForQaEvent = true; } if (isSampleStatusReadyForQaEvent) { // bugzilla 2028 need additional information for qa events typeOfSample = sampleItem.getTypeOfSample(); sampleOrganization.setSample(sample); sampleOrganizationDAO.getDataBySample(sampleOrganization); String submitterNumber = null; if (sampleOrganization != null && sampleOrganization.getOrganization() != null) { submitterNumber = sampleOrganization.getOrganization() .getId(); } //bugzilla 2227 List allAnalysesForSample = analysisDAO .getMaxRevisionAnalysesBySample(sampleItem); // bugzilla 2028 get the possible qa events QaEvent qaEventForNoCollectionDate = new QaEvent(); qaEventForNoCollectionDate.setQaEventName(SystemConfiguration .getInstance().getQaEventCodeForRequestNoCollectionDate()); qaEventForNoCollectionDate = qaEventDAO .getQaEventByName(qaEventForNoCollectionDate); QaEvent qaEventForNoSampleType = new QaEvent(); qaEventForNoSampleType.setQaEventName(SystemConfiguration .getInstance().getQaEventCodeForRequestNoSampleType()); qaEventForNoSampleType = qaEventDAO .getQaEventByName(qaEventForNoSampleType); QaEvent qaEventForUnknownSubmitter = new QaEvent(); qaEventForUnknownSubmitter.setQaEventName(SystemConfiguration .getInstance().getQaEventCodeForRequestUnknownSubmitter()); qaEventForUnknownSubmitter = qaEventDAO .getQaEventByName(qaEventForUnknownSubmitter); // end bugzilla 2028 // bugzilla 2028 get the possible qa event actions Action actionForNoCollectionDate = new Action(); actionForNoCollectionDate.setCode(SystemConfiguration.getInstance() .getQaEventActionCodeForRequestNoCollectionDate()); actionForNoCollectionDate = actionDAO .getActionByCode(actionForNoCollectionDate); Action actionForNoSampleType = new Action(); actionForNoSampleType.setCode(SystemConfiguration.getInstance() .getQaEventActionCodeForRequestNoSampleType()); actionForNoSampleType = actionDAO .getActionByCode(actionForNoSampleType); Action actionForUnknownSubmitter = new Action(); actionForUnknownSubmitter.setCode(SystemConfiguration.getInstance() .getQaEventActionCodeForRequestUnknownSubmitter()); actionForUnknownSubmitter = actionDAO .getActionByCode(actionForUnknownSubmitter); // end bugzilla 2028 for (int i = 0; i < allAnalysesForSample.size(); i++) { Analysis analysis = (Analysis) allAnalysesForSample.get(i); // bugzilla 2028 QA_EVENT COLLECTIONDATE if (sample.getCollectionDate() == null) { AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent(); analysisQaEvent.setAnalysis(analysis); analysisQaEvent.setQaEvent(qaEventForNoCollectionDate); analysisQaEvent = analysisQaEventDAO .getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent); if (analysisQaEvent == null) { analysisQaEvent = new AnalysisQaEvent(); analysisQaEvent.setAnalysis(analysis); analysisQaEvent.setQaEvent(qaEventForNoCollectionDate); analysisQaEvent.setCompletedDate(null); analysisQaEvent.setSysUserId(sysUserId); analysisQaEventDAO.insertData(analysisQaEvent); } else { if (analysisQaEvent.getCompletedDate() != null) { analysisQaEvent.setCompletedDate(null); analysisQaEvent.setSysUserId(sysUserId); analysisQaEventDAO.updateData(analysisQaEvent); } } } else { AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent(); analysisQaEvent.setAnalysis(analysis); analysisQaEvent.setQaEvent(qaEventForNoCollectionDate); analysisQaEvent = analysisQaEventDAO .getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent); // if we don't find a record in ANALYSIS_QAEVENT (or // completed date is not null) then this is already // fixed if (analysisQaEvent != null && analysisQaEvent.getCompletedDate() == null) { AnalysisQaEventAction analysisQaEventAction = new AnalysisQaEventAction(); analysisQaEventAction .setAnalysisQaEvent(analysisQaEvent); analysisQaEventAction .setAction(actionForNoCollectionDate); analysisQaEventAction = analysisQaEventActionDAO .getAnalysisQaEventActionByAnalysisQaEventAndAction(analysisQaEventAction); // if we found a record in ANALYSIS_QAEVENT_ACTION // then this has been fixed if (analysisQaEventAction == null) { // insert a record in ANALYSIS_QAEVENT_ACTION AnalysisQaEventAction analQaEventAction = new AnalysisQaEventAction(); analQaEventAction .setAnalysisQaEvent(analysisQaEvent); analQaEventAction .setAction(actionForNoCollectionDate); analQaEventAction .setCreatedDateForDisplay(dateAsText); analQaEventAction.setSysUserId(sysUserId); //bugzilla 2496 analQaEventAction.setSystemUser(systemUser); analysisQaEventActionDAO .insertData(analQaEventAction); } // update the found // ANALYSIS_QAEVENT.COMPLETED_DATE with current // date stamp analysisQaEvent .setCompletedDateForDisplay(dateAsText); analysisQaEvent.setSysUserId(sysUserId); analysisQaEventDAO.updateData(analysisQaEvent); } } // bugzilla 2028 QA_EVENT SAMPLETYPE if (typeOfSample.getDescription().equals(SAMPLE_TYPE_NOT_GIVEN)) { AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent(); analysisQaEvent.setAnalysis(analysis); analysisQaEvent.setQaEvent(qaEventForNoSampleType); analysisQaEvent = analysisQaEventDAO .getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent); if (analysisQaEvent == null) { analysisQaEvent = new AnalysisQaEvent(); analysisQaEvent.setAnalysis(analysis); analysisQaEvent.setQaEvent(qaEventForNoSampleType); analysisQaEvent.setCompletedDate(null); analysisQaEvent.setSysUserId(sysUserId); analysisQaEventDAO.insertData(analysisQaEvent); } else { if (analysisQaEvent.getCompletedDate() != null) { analysisQaEvent.setCompletedDate(null); analysisQaEvent.setSysUserId(sysUserId); analysisQaEventDAO.updateData(analysisQaEvent); } } } else { AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent(); analysisQaEvent.setAnalysis(analysis); analysisQaEvent.setQaEvent(qaEventForNoSampleType); analysisQaEvent = analysisQaEventDAO .getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent); // if we don't find a record in ANALYSIS_QAEVENT (or // completed date is not null) then this is already // fixed if (analysisQaEvent != null && analysisQaEvent.getCompletedDate() == null) { AnalysisQaEventAction analysisQaEventAction = new AnalysisQaEventAction(); analysisQaEventAction .setAnalysisQaEvent(analysisQaEvent); analysisQaEventAction .setAction(actionForNoSampleType); analysisQaEventAction = analysisQaEventActionDAO .getAnalysisQaEventActionByAnalysisQaEventAndAction(analysisQaEventAction); // if we found a record in ANALYSIS_QAEVENT_ACTION // then this has been fixed if (analysisQaEventAction == null) { // insert a record in ANALYSIS_QAEVENT_ACTION AnalysisQaEventAction analQaEventAction = new AnalysisQaEventAction(); analQaEventAction .setAnalysisQaEvent(analysisQaEvent); analQaEventAction .setAction(actionForNoSampleType); analQaEventAction .setCreatedDateForDisplay(dateAsText); analQaEventAction.setSysUserId(sysUserId); //bugzilla 2496 analQaEventAction.setSystemUser(systemUser); analysisQaEventActionDAO .insertData(analQaEventAction); } // update the found // ANALYSIS_QAEVENT.COMPLETED_DATE with current // date stamp analysisQaEvent .setCompletedDateForDisplay(dateAsText); analysisQaEvent.setSysUserId(sysUserId); analysisQaEventDAO.updateData(analysisQaEvent); } } // bugzilla 2028 QA_EVENT UNKNOWN SUBMITTER if (!StringUtil.isNullorNill(submitterNumber) && submitterNumber.equals(SystemConfiguration.getInstance() .getUnknownSubmitterNumberForQaEvent())) { AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent(); analysisQaEvent.setAnalysis(analysis); analysisQaEvent.setQaEvent(qaEventForUnknownSubmitter); analysisQaEvent = analysisQaEventDAO .getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent); if (analysisQaEvent == null) { analysisQaEvent = new AnalysisQaEvent(); analysisQaEvent.setAnalysis(analysis); analysisQaEvent.setQaEvent(qaEventForUnknownSubmitter); analysisQaEvent.setCompletedDate(null); analysisQaEvent.setSysUserId(sysUserId); analysisQaEventDAO.insertData(analysisQaEvent); } else { if (analysisQaEvent.getCompletedDate() != null) { analysisQaEvent.setCompletedDate(null); analysisQaEvent.setSysUserId(sysUserId); analysisQaEventDAO.updateData(analysisQaEvent); } } } else { AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent(); analysisQaEvent.setAnalysis(analysis); analysisQaEvent.setQaEvent(qaEventForUnknownSubmitter); analysisQaEvent = analysisQaEventDAO .getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent); // if we don't find a record in ANALYSIS_QAEVENT (or // completed date is not null) then this is already // fixed if (analysisQaEvent != null && analysisQaEvent.getCompletedDate() == null) { AnalysisQaEventAction analysisQaEventAction = new AnalysisQaEventAction(); analysisQaEventAction .setAnalysisQaEvent(analysisQaEvent); analysisQaEventAction .setAction(actionForUnknownSubmitter); analysisQaEventAction = analysisQaEventActionDAO .getAnalysisQaEventActionByAnalysisQaEventAndAction(analysisQaEventAction); // if we found a record in ANALYSIS_QAEVENT_ACTION // then this has been fixed if (analysisQaEventAction == null) { // insert a record in ANALYSIS_QAEVENT_ACTION AnalysisQaEventAction analQaEventAction = new AnalysisQaEventAction(); analQaEventAction .setAnalysisQaEvent(analysisQaEvent); analQaEventAction .setAction(actionForUnknownSubmitter); analQaEventAction .setCreatedDateForDisplay(dateAsText); analQaEventAction.setSysUserId(sysUserId); //bugzilla 2496 analQaEventAction.setSystemUser(systemUser); analysisQaEventActionDAO .insertData(analQaEventAction); } // update the found // ANALYSIS_QAEVENT.COMPLETED_DATE with current // date stamp analysisQaEvent .setCompletedDateForDisplay(dateAsText); analysisQaEvent.setSysUserId(sysUserId); analysisQaEventDAO.updateData(analysisQaEvent); } } } } tx.commit(); } catch (LIMSRuntimeException lre) { //bugzilla 2154 LogEvent.logError("TestVerificationUpdateAction","performAction()",lre.toString()); tx.rollback(); ActionMessages errors = new ActionMessages(); ActionError error = null; if (lre.getException() instanceof org.hibernate.StaleObjectStateException) { error = new ActionError("errors.OptimisticLockException", null, null); } else { //bugzilla 2013 added duplicateCheck parameter if (lre.getException() instanceof LIMSDuplicateRecordException) { String messageKey = "analysis.analysis"; Locale locale = (Locale) request.getSession().getAttribute( "org.apache.struts.action.LOCALE"); String msg = ResourceLocator.getInstance() .getMessageResources().getMessage(locale,messageKey); error = new ActionError("errors.DuplicateRecord",msg, null); } else { error = new ActionError("errors.UpdateException", 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); } finally { HibernateUtil.closeSession(); } return getForward(mapping.findForward(forward)); } protected String getPageTitleKey() { return "testmanagement.newborn.title"; } protected String getPageSubtitleKey() { return "testmanagement.newborn.title"; } protected ActionForward getForward(ActionForward forward) { ActionRedirect redirect = new ActionRedirect(forward); return redirect; } }