/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
* copyright 2003-2005 Akaza Research
*/
package org.akaza.openclinica.control.submit;
import org.akaza.openclinica.bean.core.DataEntryStage;
import org.akaza.openclinica.bean.core.Role;
import org.akaza.openclinica.bean.core.Status;
import org.akaza.openclinica.bean.core.SubjectEventStatus;
import org.akaza.openclinica.bean.managestudy.EventDefinitionCRFBean;
import org.akaza.openclinica.bean.managestudy.StudyEventBean;
import org.akaza.openclinica.bean.submit.DisplayTableOfContentsBean;
import org.akaza.openclinica.bean.submit.EventCRFBean;
import org.akaza.openclinica.bean.submit.SectionBean;
import org.akaza.openclinica.control.SpringServletAccess;
import org.akaza.openclinica.control.core.SecureController;
import org.akaza.openclinica.control.form.FormProcessor;
import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO;
import org.akaza.openclinica.dao.managestudy.StudyEventDAO;
import org.akaza.openclinica.dao.submit.EventCRFDAO;
import org.akaza.openclinica.dao.submit.ItemDataDAO;
import org.akaza.openclinica.dao.submit.SectionDAO;
import org.akaza.openclinica.i18n.core.LocaleResolver;
import org.akaza.openclinica.service.crfdata.DynamicsMetadataService;
import org.akaza.openclinica.view.Page;
import org.akaza.openclinica.web.InconsistentStateException;
import org.akaza.openclinica.web.InsufficientPermissionException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
/**
* @author ssachs
*/
public class MarkEventCRFCompleteServlet extends SecureController {
Locale locale;
// < ResourceBundleresexception,respage,resword;
public static final String INPUT_EVENT_CRF_ID = "eventCRFId";
public static final String INPUT_MARK_COMPLETE = "markComplete";
public static final String VALUE_YES = "Yes";
public static final String VALUE_NO = "No";
public static final String BEAN_DISPLAY = "toc";
private FormProcessor fp;
private EventCRFDAO ecdao;
private EventCRFBean ecb;
private EventDefinitionCRFDAO edcdao;
private EventDefinitionCRFBean edcb;
private void getEventCRFBean() {
// if ((fp != null) && (ecdao != null) && (ecb != null)) {
// return ;
// }
fp = new FormProcessor(request);
int eventCRFId = fp.getInt(INPUT_EVENT_CRF_ID);
ecdao = new EventCRFDAO(sm.getDataSource());
ecb = (EventCRFBean) ecdao.findByPK(eventCRFId);
}
private boolean isEachRequiredFieldFillout() {
ItemDataDAO iddao = new ItemDataDAO(sm.getDataSource());
ArrayList dataList = iddao.findAllBlankRequiredByEventCRFId(ecb.getId(), ecb.getCRFVersionId());
// empty means all required fields got filled out,return true-jxu
return dataList.isEmpty();
}
private boolean isEachSectionReviewedOnce() {
SectionDAO sdao = new SectionDAO(sm.getDataSource());
DataEntryStage stage = ecb.getStage();
ArrayList sections = sdao.findAllByCRFVersionId(ecb.getCRFVersionId());
HashMap numItemsHM = sdao.getNumItemsBySectionId();
HashMap numItemsPendingHM = sdao.getNumItemsPendingBySectionId(ecb);
HashMap numItemsCompletedHM = sdao.getNumItemsCompletedBySectionId(ecb);
for (int i = 0; i < sections.size(); i++) {
SectionBean sb = (SectionBean) sections.get(i);
Integer key = new Integer(sb.getId());
int numItems = TableOfContentsServlet.getIntById(numItemsHM, key);
int numItemsPending = TableOfContentsServlet.getIntById(numItemsPendingHM, key);
int numItemsCompleted = TableOfContentsServlet.getIntById(numItemsCompletedHM, key);
if (stage.equals(DataEntryStage.INITIAL_DATA_ENTRY) && edcb.isDoubleEntry()) {
if (numItemsPending == 0 && numItems > 0) {
return false;
}
} else {
if (numItemsCompleted == 0 && numItems > 0) {
return false;
}
}
}
return true;
}
private void getEventDefinitionCRFBean() {
edcdao = new EventDefinitionCRFDAO(sm.getDataSource());
edcb = edcdao.findForStudyByStudyEventIdAndCRFVersionId(ecb.getStudyEventId(), ecb.getCRFVersionId());
}
/*
* (non-Javadoc)
*
* @see org.akaza.openclinica.control.core.SecureController#processRequest()
*/
@Override
protected void processRequest() throws Exception {
// FormDiscrepancyNotes discNotes =
// (FormDiscrepancyNotes)session.getAttribute(AddNewSubjectServlet.
// FORM_DISCREPANCY_NOTES_NAME);
getEventCRFBean();
getEventDefinitionCRFBean();
DataEntryStage stage = ecb.getStage();
request.setAttribute(TableOfContentsServlet.INPUT_EVENT_CRF_BEAN, ecb);
// Page errorPage = Page.TABLE_OF_CONTENTS_SERVLET;
Page errorPage = Page.LIST_STUDY_SUBJECTS_SERVLET;
/*
* if (StringUtil.isBlank(ecb.getInterviewerName())) { if ((discNotes ==
* null) ||
* discNotes.getNotes(TableOfContentsServlet.INPUT_INTERVIEWER).
* isEmpty()){ throw new InconsistentStateException(errorPage, "You may
* not mark this Event CRF complete, because interviewer name is
* blank."); } }
*
* if (ecb.getDateInterviewed() == null) { if ((discNotes == null) ||
* (discNotes
* .getNotes(TableOfContentsServlet.INPUT_INTERVIEW_DATE).isEmpty()) ) {
* throw new InconsistentStateException(errorPage, "You may not mark
* this Event CRF complete, because interview date is blank."); } }
*/
if (stage.equals(DataEntryStage.UNCOMPLETED) || stage.equals(DataEntryStage.DOUBLE_DATA_ENTRY_COMPLETE) || stage.equals(DataEntryStage.LOCKED)) {
throw new InconsistentStateException(errorPage, respage.getString("not_mark_CRF_complete1"));
}
if (stage.equals(DataEntryStage.INITIAL_DATA_ENTRY_COMPLETE) || stage.equals(DataEntryStage.DOUBLE_DATA_ENTRY)) {
if (!edcb.isDoubleEntry()) {
throw new InconsistentStateException(errorPage, respage.getString("not_mark_CRF_complete2"));
}
}
/*
* if (!isEachSectionReviewedOnce()) { throw new
* InconsistentStateException( errorPage, "You may not mark this Event
* CRF complete, because there are some sections which have not been
* reviewed once."); }
*/
if (!isEachRequiredFieldFillout()) {
throw new InconsistentStateException(errorPage, respage.getString("not_mark_CRF_complete4"));
}
if (ecb.getInterviewerName().trim().equals("")) {
throw new InconsistentStateException(errorPage, respage.getString("not_mark_CRF_complete5"));
}
if (!fp.isSubmitted()) {
DisplayTableOfContentsBean toc = TableOfContentsServlet.getDisplayBean(ecb, sm.getDataSource(), currentStudy);
toc = TableOfContentsServlet.getDisplayBeanWithShownSections(sm.getDataSource(), toc,
(DynamicsMetadataService)SpringServletAccess.getApplicationContext(getServletContext()).getBean("dynamicsMetadataService"));
request.setAttribute(BEAN_DISPLAY, toc);
resetPanel();
panel.setStudyInfoShown(false);
panel.setOrderedData(true);
setToPanel(resword.getString("subject"), toc.getStudySubject().getLabel());
setToPanel(resword.getString("study_event_definition"), toc.getStudyEventDefinition().getName());
StudyEventBean seb = toc.getStudyEvent();
setToPanel(resword.getString("location"), seb.getLocation());
setToPanel(resword.getString("start_date"), seb.getDateStarted().toString());
setToPanel(resword.getString("end_date"), seb.getDateEnded().toString());
setToPanel(resword.getString("CRF"), toc.getCrf().getName());
setToPanel(resword.getString("CRF_version"), toc.getCrfVersion().getName());
forwardPage(Page.MARK_EVENT_CRF_COMPLETE);
} else {
boolean markComplete = fp.getString(INPUT_MARK_COMPLETE).equals(VALUE_YES);
if (markComplete) {
Status newStatus = ecb.getStatus();
boolean ide = true;
if (stage.equals(DataEntryStage.INITIAL_DATA_ENTRY) && edcb.isDoubleEntry()) {
newStatus = Status.PENDING;
ecb.setUpdaterId(ub.getId());
ecb.setUpdatedDate(new Date());
ecb.setDateCompleted(new Date());
} else if (stage.equals(DataEntryStage.INITIAL_DATA_ENTRY) && !edcb.isDoubleEntry()) {
newStatus = Status.UNAVAILABLE;
ecb.setUpdaterId(ub.getId());
ecb.setUpdatedDate(new Date());
ecb.setDateCompleted(new Date());
ecb.setDateValidateCompleted(new Date());
} else if (stage.equals(DataEntryStage.INITIAL_DATA_ENTRY_COMPLETE) || stage.equals(DataEntryStage.DOUBLE_DATA_ENTRY)) {
newStatus = Status.UNAVAILABLE;
ecb.setDateValidateCompleted(new Date());
ide = false;
}
ecb.setStatus(newStatus);
ecb = (EventCRFBean) ecdao.update(ecb);
ecdao.markComplete(ecb, ide);
ItemDataDAO iddao = new ItemDataDAO(sm.getDataSource());
iddao.updateStatusByEventCRF(ecb, newStatus);
// change status for event
StudyEventDAO sedao = new StudyEventDAO(sm.getDataSource());
StudyEventBean seb = (StudyEventBean) sedao.findByPK(ecb.getStudyEventId());
seb.setUpdatedDate(new Date());
seb.setUpdater(ub);
EventDefinitionCRFDAO edcdao = new EventDefinitionCRFDAO(sm.getDataSource());
ArrayList allCRFs = ecdao.findAllByStudyEvent(seb);
ArrayList allEDCs = edcdao.findAllActiveByEventDefinitionId(seb.getStudyEventDefinitionId());
boolean eventCompleted = true;
for (int i = 0; i < allCRFs.size(); i++) {
EventCRFBean ec = (EventCRFBean) allCRFs.get(i);
if (!ec.getStatus().equals(Status.UNAVAILABLE)) {
eventCompleted = false;
break;
}
}
if (eventCompleted && allCRFs.size() >= allEDCs.size()) {
seb.setSubjectEventStatus(SubjectEventStatus.COMPLETED);
}
seb = (StudyEventBean) sedao.update(seb);
addPageMessage(respage.getString("event_CRF_marked_complete"));
request.setAttribute(EnterDataForStudyEventServlet.INPUT_EVENT_ID, String.valueOf(ecb.getStudyEventId()));
forwardPage(Page.ENTER_DATA_FOR_STUDY_EVENT_SERVLET);
} else {
request.setAttribute(DataEntryServlet.INPUT_IGNORE_PARAMETERS, Boolean.TRUE);
addPageMessage(respage.getString("event_CRF_not_marked_complete"));
forwardPage(errorPage);
}
}
}
/*
* (non-Javadoc)
*
* @see org.akaza.openclinica.control.core.SecureController#mayProceed()
*/
@Override
protected void mayProceed() throws InsufficientPermissionException {
locale = LocaleResolver.getLocale(request);
// <
// resexception=ResourceBundle.getBundle(
// "org.akaza.openclinica.i18n.exceptions",locale);
// < respage =
// ResourceBundle.getBundle("org.akaza.openclinica.i18n.page_messages",
// locale);
// < resword =
// ResourceBundle.getBundle("org.akaza.openclinica.i18n.words",locale);
fp = new FormProcessor(request);
if (currentRole.equals(Role.COORDINATOR) || currentRole.equals(Role.STUDYDIRECTOR)) {
return;
}
getEventCRFBean();
Role r = currentRole.getRole();
if (ecb.getStage().equals(DataEntryStage.INITIAL_DATA_ENTRY)) {
if (ecb.getOwnerId() != ub.getId() && !r.equals(Role.COORDINATOR) && !r.equals(Role.STUDYDIRECTOR)) {
request.setAttribute(TableOfContentsServlet.INPUT_EVENT_CRF_BEAN, ecb);
addPageMessage(respage.getString("not_mark_CRF_complete6"));
throw new InsufficientPermissionException(Page.TABLE_OF_CONTENTS_SERVLET, resexception.getString("not_study_owner"), "1");
}
} else if (ecb.getStage().equals(DataEntryStage.DOUBLE_DATA_ENTRY)) {
if (ecb.getValidatorId() != ub.getId() && !r.equals(Role.COORDINATOR) && !r.equals(Role.STUDYDIRECTOR)) {
request.setAttribute(TableOfContentsServlet.INPUT_EVENT_CRF_BEAN, ecb);
addPageMessage(respage.getString("not_mark_CRF_complete7"));
throw new InsufficientPermissionException(Page.TABLE_OF_CONTENTS_SERVLET, resexception.getString("not_study_owner"), "1");
}
}
return;
}
}