package org.akaza.openclinica.service;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
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.StudyBean;
import org.akaza.openclinica.bean.managestudy.StudyEventBean;
import org.akaza.openclinica.bean.managestudy.StudySubjectBean;
import org.akaza.openclinica.bean.submit.CRFVersionBean;
import org.akaza.openclinica.bean.submit.EventCRFBean;
import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO;
import org.akaza.openclinica.dao.managestudy.StudyDAO;
import org.akaza.openclinica.dao.managestudy.StudyEventDAO;
import org.akaza.openclinica.dao.submit.CRFVersionDAO;
import org.akaza.openclinica.dao.submit.EventCRFDAO;
public class ParticipantEventService {
private DataSource dataSource = null;
private StudyDAO studyDAO = null;
private StudyEventDAO studyEventDAO = null;
private EventCRFDAO eventCRFDAO = null;
private EventDefinitionCRFDAO eventDefCRFDAO = null;
private CRFVersionDAO crfVersionDAO = null;
public ParticipantEventService(DataSource dataSource) {
this.dataSource = dataSource;
}
public StudyEventBean getNextParticipantEvent(StudySubjectBean studySubject) {
List<StudyEventBean> studyEvents = (ArrayList<StudyEventBean>)getStudyEventDAO().findAllBySubjectIdOrdered(studySubject.getId());
for (StudyEventBean studyEvent:studyEvents) {
// Skip to next event if study event is not in the right status
if (studyEvent.getStatus() != Status.AVAILABLE ||
(studyEvent.getSubjectEventStatus() != SubjectEventStatus.DATA_ENTRY_STARTED
&& studyEvent.getSubjectEventStatus() != SubjectEventStatus.SCHEDULED)) continue;
List<EventDefinitionCRFBean> eventDefCrfs = getEventDefCrfsForStudyEvent(studySubject, studyEvent);
for (EventDefinitionCRFBean eventDefCrf:eventDefCrfs) {
boolean participantForm = eventDefCrf.isParticipantForm();
if (participantForm) {
List<CRFVersionBean> crfVersions = getAllCrfVersions(eventDefCrf);
boolean eventCrfExists = false;
for (CRFVersionBean crfVersion:crfVersions) {
EventCRFBean eventCRF = getEventCRFDAO().findByEventCrfVersion(studyEvent, crfVersion);
if (eventCRF != null && eventCRF.getStatus() == Status.AVAILABLE) return studyEvent;
else if (eventCRF != null) eventCrfExists = true;
}
if (!eventCrfExists) return studyEvent;
}
}
}
// Did not find a next participant event
return null;
}
public EventCRFBean getExistingEventCRF(StudySubjectBean studySubject, StudyEventBean nextEvent,
EventDefinitionCRFBean eventDefCrf) {
List<CRFVersionBean> crfVersions = getAllCrfVersions(eventDefCrf);
for (CRFVersionBean crfVersion:crfVersions) {
EventCRFBean eventCRF = (EventCRFBean) getEventCRFDAO().findByEventCrfVersion(nextEvent, crfVersion);
if (eventCRF != null) return eventCRF;
}
return null;
}
public List<CRFVersionBean> getAllCrfVersions(EventDefinitionCRFBean eventDefCrf) {
List<CRFVersionBean> versions = new ArrayList<CRFVersionBean>();
EventDefinitionCRFBean selectedEventDefCrf = null;
if (eventDefCrf.getParentId() > 0) selectedEventDefCrf = (EventDefinitionCRFBean)getEventDefCRFDAO().findByPK(eventDefCrf.getParentId());
else selectedEventDefCrf = eventDefCrf;
versions = (ArrayList) getCRFVersionDAO().findAllByCRF(selectedEventDefCrf.getCrfId());
return versions;
}
public List<EventDefinitionCRFBean> getEventDefCrfsForStudyEvent(StudySubjectBean studySubject, StudyEventBean studyEvent) {
Integer studyId = studySubject.getStudyId();
StudyBean studyBean = (StudyBean) getStudyDAO().findByPK(studyId);
ArrayList<EventDefinitionCRFBean> eventDefCrfs = null;
ArrayList<EventDefinitionCRFBean> parentEventDefCrfs = new ArrayList<EventDefinitionCRFBean>();
ArrayList<EventDefinitionCRFBean> netEventDefinitionCrfs = new ArrayList<EventDefinitionCRFBean>();
eventDefCrfs = (ArrayList<EventDefinitionCRFBean>) getEventDefCRFDAO().findAllDefIdandStudyId(studyEvent.getStudyEventDefinitionId(), studyId);
StudyBean parentStudy = null;
if (studyBean.getParentStudyId() == 0) parentStudy = studyBean;
else parentStudy = (StudyBean) getStudyDAO().findByPK(studyBean.getParentStudyId());
parentEventDefCrfs = (ArrayList<EventDefinitionCRFBean>) getEventDefCRFDAO().findAllDefIdandStudyId(studyEvent.getStudyEventDefinitionId(), parentStudy.getId());
boolean found;
for (EventDefinitionCRFBean parentEventDefinitionCrf : parentEventDefCrfs) {
found = false;
for (EventDefinitionCRFBean eventDefinitionCrf : eventDefCrfs) {
if (parentEventDefinitionCrf.getId() == eventDefinitionCrf.getParentId()) { //
found = true;
netEventDefinitionCrfs.add(eventDefinitionCrf);
break;
}
}
if (!found) netEventDefinitionCrfs.add(parentEventDefinitionCrf);
}
return netEventDefinitionCrfs;
}
/**
* @return the StudyDAO
*/
private StudyDAO getStudyDAO() {
studyDAO = studyDAO != null ? studyDAO : new StudyDAO(dataSource);
return studyDAO;
}
/**
* @return the StudyEventDAO
*/
private StudyEventDAO getStudyEventDAO() {
studyEventDAO = studyEventDAO != null ? studyEventDAO : new StudyEventDAO(dataSource);
return studyEventDAO;
}
/**
* @return the EventCRFDAO
*/
private EventCRFDAO getEventCRFDAO() {
eventCRFDAO = eventCRFDAO != null ? eventCRFDAO : new EventCRFDAO(dataSource);
return eventCRFDAO;
}
/**
* @return the EventDefinitionCRFDAO
*/
private EventDefinitionCRFDAO getEventDefCRFDAO() {
eventDefCRFDAO = eventDefCRFDAO != null ? eventDefCRFDAO : new EventDefinitionCRFDAO(dataSource);
return eventDefCRFDAO;
}
/**
* @return the CRFVersionDAO
*/
private CRFVersionDAO getCRFVersionDAO() {
crfVersionDAO = crfVersionDAO != null ? crfVersionDAO : new CRFVersionDAO(dataSource);
return crfVersionDAO;
}
}