/** * 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.qaevent.action.retroCI; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.validator.GenericValidator; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; 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.LIMSInvalidConfigurationException; import us.mn.state.health.lims.common.formfields.FormFields; import us.mn.state.health.lims.common.formfields.FormFields.Field; import us.mn.state.health.lims.common.services.*; import us.mn.state.health.lims.common.services.DisplayListService.ListType; import us.mn.state.health.lims.common.services.QAService.QAObservationType; import us.mn.state.health.lims.common.util.ConfigurationProperties; import us.mn.state.health.lims.common.util.ConfigurationProperties.Property; import us.mn.state.health.lims.common.util.DateUtil; import us.mn.state.health.lims.note.valueholder.Note; import us.mn.state.health.lims.observationhistory.dao.ObservationHistoryDAO; import us.mn.state.health.lims.observationhistory.daoimpl.ObservationHistoryDAOImpl; import us.mn.state.health.lims.observationhistory.valueholder.ObservationHistory; import us.mn.state.health.lims.organization.dao.OrganizationDAO; import us.mn.state.health.lims.organization.daoimpl.OrganizationDAOImpl; import us.mn.state.health.lims.organization.valueholder.Organization; import us.mn.state.health.lims.patient.util.PatientUtil; 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.project.dao.ProjectDAO; import us.mn.state.health.lims.project.daoimpl.ProjectDAOImpl; import us.mn.state.health.lims.project.valueholder.Project; import us.mn.state.health.lims.provider.dao.ProviderDAO; import us.mn.state.health.lims.provider.daoimpl.ProviderDAOImpl; import us.mn.state.health.lims.provider.valueholder.Provider; import us.mn.state.health.lims.qaevent.valueholder.retroCI.QaEventItem; import us.mn.state.health.lims.requester.dao.SampleRequesterDAO; import us.mn.state.health.lims.requester.daoimpl.SampleRequesterDAOImpl; import us.mn.state.health.lims.requester.valueholder.SampleRequester; 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.sampleproject.dao.SampleProjectDAO; import us.mn.state.health.lims.sampleproject.daoimpl.SampleProjectDAOImpl; import us.mn.state.health.lims.sampleproject.valueholder.SampleProject; import us.mn.state.health.lims.sampleqaevent.dao.SampleQaEventDAO; import us.mn.state.health.lims.sampleqaevent.daoimpl.SampleQaEventDAOImpl; import us.mn.state.health.lims.sampleqaevent.valueholder.SampleQaEvent; import us.mn.state.health.lims.test.daoimpl.TestSectionDAOImpl; import us.mn.state.health.lims.test.valueholder.TestSection; import us.mn.state.health.lims.typeofsample.dao.TypeOfSampleDAO; import us.mn.state.health.lims.typeofsample.daoimpl.TypeOfSampleDAOImpl; import us.mn.state.health.lims.typeofsample.valueholder.TypeOfSample; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.InvocationTargetException; import java.util.*; public class NonConformityAction extends BaseAction{ private PatientService patientService; private List<ObservationHistory> observationHistoryList; private List<SampleQaEvent> sampleQAEventList; private static final String QA_NOTE_SUBJECT = "QaEvent Note"; private static SampleDAO sampleDAO = new SampleDAOImpl(); private static SampleItemDAO sampleItemDAO = new SampleItemDAOImpl(); private static TypeOfSampleDAO typeOfSampleDAO = new TypeOfSampleDAOImpl(); private static SampleHumanDAO sampleHumanDAO = new SampleHumanDAOImpl(); private static PersonDAO personDAO = new PersonDAOImpl(); private static ProviderDAO providerDAO = new ProviderDAOImpl(); private static OrganizationDAO orgDAO = new OrganizationDAOImpl(); private Boolean readOnly = Boolean.FALSE; private boolean sampleFound; private Sample sample; private boolean useSiteList; @Override protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{ useSiteList = FormFields.getInstance().useField(Field.NON_CONFORMITY_SITE_LIST); BaseActionForm dynaForm = (BaseActionForm)form; dynaForm.initialize(mapping); readOnly = Boolean.FALSE; request.getSession().setAttribute(SAVE_DISABLED, TRUE); String labNumber = request.getParameter("labNo"); if(!GenericValidator.isBlankOrNull(labNumber)){ sample = getSampleForLabNumber(labNumber); sampleFound = !(sample == null || GenericValidator.isBlankOrNull(sample.getId())); PropertyUtils.setProperty(dynaForm, "labNo", labNumber); Date today = Calendar.getInstance().getTime(); PropertyUtils.setProperty(dynaForm, "date", DateUtil.formatDateAsText(today)); if(FormFields.getInstance().useField(Field.QATimeWithDate)){ PropertyUtils.setProperty(dynaForm, "time", DateUtil.nowTimeAsText()); } if(sampleFound){ createForExistingSample(dynaForm); } setProjectList(dynaForm); PropertyUtils.setProperty(dynaForm, "sampleItemsTypeOfSampleIds", getSampleTypeOfSamplesString()); PropertyUtils.setProperty(dynaForm, "sections", createSectionList()); PropertyUtils.setProperty(dynaForm, "qaEventTypes", DisplayListService.getList(ListType.QA_EVENTS)); PropertyUtils.setProperty(dynaForm, "qaEvents", getSampleQaEventItems(sample)); PropertyUtils.setProperty( dynaForm, "typeOfSamples", DisplayListService.getList( ListType.SAMPLE_TYPE_ACTIVE) ); PropertyUtils.setProperty(dynaForm, "readOnly", readOnly); PropertyUtils.setProperty(dynaForm, "siteList", DisplayListService.getFreshList(ListType.SAMPLE_PATIENT_REFERRING_CLINIC)); Provider provider = getProvider(); if(provider != null){ PropertyUtils.setProperty(dynaForm, "providerNew", Boolean.FALSE.toString()); Person providerPerson = getProviderPerson(provider); if(providerPerson != null && !providerPerson.getId().equals(PatientUtil.getUnknownPerson().getId())){ PersonService personService = new PersonService(providerPerson); PropertyUtils.setProperty(dynaForm, "providerFirstName", personService.getFirstName()); PropertyUtils.setProperty(dynaForm, "providerLastName", personService.getLastName()); PropertyUtils.setProperty(dynaForm, "providerWorkPhone", personService.getPhone()); Map<String, String> addressComponents = personService.getAddressComponents(); PropertyUtils.setProperty(dynaForm, "providerStreetAddress", addressComponents.get("Street")); PropertyUtils.setProperty(dynaForm, "providerCity", addressComponents.get("village")); PropertyUtils.setProperty(dynaForm, "providerCommune", addressComponents.get("commune")); PropertyUtils.setProperty(dynaForm, "providerDepartment", addressComponents.get("department")); } }else{ PropertyUtils.setProperty(dynaForm, "providerNew", Boolean.TRUE.toString()); PropertyUtils.setProperty(dynaForm, "requesterSampleID", ""); PropertyUtils.setProperty(dynaForm, "providerFirstName", ""); PropertyUtils.setProperty(dynaForm, "providerLastName", ""); PropertyUtils.setProperty(dynaForm, "providerWorkPhone", ""); } PropertyUtils.setProperty(dynaForm, "departments", DisplayListService.getList(ListType.HAITI_DEPARTMENTS)); } return mapping.findForward(FWD_SUCCESS); } private void createForExistingSample(BaseActionForm dynaForm) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{ getPatient(sample); getObservationHistory(sample); getSampleQaEvents(sample); PropertyUtils.setProperty(dynaForm, "sampleId", sample.getId()); PropertyUtils.setProperty(dynaForm, "patientId", patientService.getPatientId()); Project project = getProjectForSample(sample); if(project != null){ PropertyUtils.setProperty(dynaForm, "projectId", project.getId()); PropertyUtils.setProperty(dynaForm, "project", project.getLocalizedName()); } String subjectNo = patientService.getSubjectNumber(); if(!GenericValidator.isBlankOrNull(subjectNo)){ PropertyUtils.setProperty(dynaForm, "subjectNew", Boolean.FALSE); PropertyUtils.setProperty(dynaForm, "subjectNo", subjectNo); } String STNo = patientService.getSTNumber(); if(!GenericValidator.isBlankOrNull(STNo)){ PropertyUtils.setProperty(dynaForm, "newSTNumber", Boolean.FALSE); PropertyUtils.setProperty(dynaForm, "STNumber", STNo); } String nationalId = patientService.getNationalId(); if(!GenericValidator.isBlankOrNull(nationalId)){ PropertyUtils.setProperty(dynaForm, "nationalIdNew", Boolean.FALSE); PropertyUtils.setProperty(dynaForm, "nationalId", nationalId); } ObservationHistory doctorObservation = getRefererObservation(sample); if(doctorObservation != null){ PropertyUtils.setProperty(dynaForm, "doctorNew", Boolean.FALSE); PropertyUtils.setProperty(dynaForm, "doctor", doctorObservation.getValue()); } if(useSiteList){ PropertyUtils.setProperty(dynaForm, "serviceNew", Boolean.FALSE); PropertyUtils.setProperty(dynaForm, "service", getSampleRequesterOrganizationName()); }else{ ObservationHistory serviceObservation = getServiceObservation(sample); if(serviceObservation != null){ PropertyUtils.setProperty(dynaForm, "serviceNew", Boolean.FALSE); PropertyUtils.setProperty(dynaForm, "service", serviceObservation.getValue()); } } PropertyUtils.setProperty(dynaForm, "comment", getNoteForSample(sample)); PropertyUtils.setProperty(dynaForm, "requesterSampleID", sample.getReferringId()); } /** * @return */ private String getSampleRequesterOrganizationName(){ SampleRequesterDAO sampleRequesterDAO = new SampleRequesterDAOImpl(); List<SampleRequester> sampleRequestors = sampleRequesterDAO.getRequestersForSampleId(sample.getId()); if(sampleRequestors.size() == 0){ return null; } long typeID = TableIdService.ORGANIZATION_REQUESTER_TYPE_ID; for(SampleRequester sampleRequester : sampleRequestors){ if(sampleRequester.getRequesterTypeId() == typeID){ String orgId = String.valueOf(sampleRequester.getRequesterId()); Organization org = orgDAO.getOrganizationById(orgId); if(org != null){ String orgName = org.getOrganizationName(); orgName += GenericValidator.isBlankOrNull(org.getShortName()) ? "" : ("-" + org.getShortName()); return orgName; } } } return null; } /** * @param provider * @return */ private Person getProviderPerson(Provider provider){ if(provider == null){ return null; } Person providerPerson = provider.getPerson(); personDAO.getData(providerPerson); return providerPerson; } private Provider getProvider(){ if(sample == null){ return null; } SampleHuman sampleHuman = getSampleHuman(); Provider provider = new Provider(); String id = sampleHuman.getProviderId(); if(id == null){ return null; } provider.setId(id); providerDAO.getData(provider); return provider; } /** * @return */ private SampleHuman getSampleHuman(){ SampleHuman sampleHuman = new SampleHuman(); sampleHuman.setSampleId(sample.getId()); sampleHumanDAO.getDataBySample(sampleHuman); return sampleHuman; } /** * @param sample * @return */ private List<QaEventItem> getSampleQaEventItems(Sample sample){ List<QaEventItem> qaEventItems = new ArrayList<QaEventItem>(); if(sample != null){ getSampleQaEvents(sample); for(SampleQaEvent event : sampleQAEventList){ QAService qa = new QAService(event); QaEventItem item = new QaEventItem(); item.setId(qa.getEventId()); item.setQaEvent(qa.getQAEvent().getId()); SampleItem sampleItem = qa.getSampleItem(); // -1 is the index for "all samples" item.setSampleType((sampleItem == null) ? "-1" : sampleItem.getTypeOfSampleId()); item.setSection(qa.getObservationValue( QAObservationType.SECTION )); item.setAuthorizer(qa.getObservationValue( QAObservationType.AUTHORIZER )); item.setRecordNumber(qa.getObservationValue( QAObservationType.DOC_NUMBER )); item.setRemove(false); item.setNote(getNoteForSampleQaEvent(event)); qaEventItems.add(item); } } int oldQaEvents = qaEventItems.size(); for(int i = oldQaEvents; i < 10; i++){ qaEventItems.add(new QaEventItem()); } return qaEventItems; } private Set<TypeOfSample> getSampleTypeOfSamples(){ Set<TypeOfSample> typeOfSamples = new HashSet<TypeOfSample>(); List<SampleItem> sampleItems = sampleItemDAO.getSampleItemsBySampleId(sample.getId()); for(SampleItem sampleItem : sampleItems){ TypeOfSample typeOfSample = typeOfSampleDAO.getTypeOfSampleById(sampleItem.getTypeOfSampleId()); if(!typeOfSamples.contains(typeOfSample)){ typeOfSamples.add(typeOfSample); } } return typeOfSamples; } private String getSampleTypeOfSamplesString(){ if(sample == null){ return ""; } Set<TypeOfSample> sampleTypeOfSamples = getSampleTypeOfSamples(); StringBuilder str = new StringBuilder(","); for(TypeOfSample typeOfSample : sampleTypeOfSamples){ str.append(typeOfSample.getId()).append(","); } return str.toString(); } public static String getNoteForSample(Sample sample){ Note note = new NoteService( sample ).getMostRecentNoteFilteredBySubject( QA_NOTE_SUBJECT ); return note != null ? note.getText() : null; } public static String getNoteForSampleQaEvent(SampleQaEvent sampleQaEvent){ if(sampleQaEvent == null || GenericValidator.isBlankOrNull(sampleQaEvent.getId())){ return null; }else{ Note note = new NoteService( sampleQaEvent ).getMostRecentNoteFilteredBySubject( null ); return note != null ? note.getText() : null; } } private void getSampleQaEvents(Sample sample){ SampleQaEventDAO sampleQaEventDAO = new SampleQaEventDAOImpl(); sampleQAEventList = sampleQaEventDAO.getSampleQaEventsBySample(sample); } private void setProjectList(BaseActionForm dynaForm) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{ ProjectDAO projectDAO = new ProjectDAOImpl(); List<Project> projects = projectDAO.getAllProjects(); PropertyUtils.setProperty(dynaForm, "projects", projects); } private Sample getSampleForLabNumber(String labNumber) throws LIMSInvalidConfigurationException{ return sampleDAO.getSampleByAccessionNumber(labNumber); } private void getPatient(Sample sample){ SampleHumanDAO sampleHumanDAO = new SampleHumanDAOImpl(); Patient patient = sampleHumanDAO.getPatientForSample(sample); patientService = new PatientService(patient); } private void getObservationHistory(Sample sample){ ObservationHistoryDAO observationDAO = new ObservationHistoryDAOImpl(); observationHistoryList = observationDAO.getAll(patientService.getPatient(), sample); } private Project getProjectForSample(Sample sample){ SampleProjectDAO samplePorjectDAO = new SampleProjectDAOImpl(); SampleProject sampleProject = samplePorjectDAO.getSampleProjectBySampleId(sample.getId()); return sampleProject == null ? null : sampleProject.getProject(); } private ObservationHistory getRefererObservation(Sample sample){ for(ObservationHistory observation : observationHistoryList){ if(observation.getObservationHistoryTypeId().equals(TableIdService.DOCTOR_OBSERVATION_TYPE_ID)){ return observation; } } return null; } private ObservationHistory getServiceObservation(Sample sample){ for(ObservationHistory observation : observationHistoryList){ if(observation.getObservationHistoryTypeId().equals(TableIdService.SERVICE_OBSERVATION_TYPE_ID)){ return observation; } } return null; } private void sortSections(List<TestSection> list){ Collections.sort(list, new Comparator<TestSection>(){ @Override public int compare(TestSection o1, TestSection o2){ return o1.getSortOrderInt() - o2.getSortOrderInt(); } }); } private List<TestSection> createSectionList(){ List<TestSection> sections = new TestSectionDAOImpl().getAllActiveTestSections(); if(ConfigurationProperties.getInstance().isPropertyValueEqual(Property.NONCONFORMITY_RECEPTION_AS_UNIT, "true")){ TestSection extra = new TestSection(); extra.setTestSectionName("Reception"); extra.setSortOrder("0"); extra.setNameKey("testSection.Reception"); sections.add(extra); } if(ConfigurationProperties.getInstance().isPropertyValueEqual(Property.NONCONFORMITY_SAMPLE_COLLECTION_AS_UNIT, "true")){ TestSection extra = new TestSection(); extra.setTestSectionName("Sample Collection"); extra.setSortOrder("1"); extra.setNameKey("testSection.SampleCollection"); sections.add(extra); } sortSections(sections); return sections; } @Override protected String getPageSubtitleKey(){ return "qaevent.add.title"; } @Override protected String getPageTitleKey(){ return "qaevent.add.title"; } }