package org.akaza.openclinica.service; import org.akaza.openclinica.bean.core.Status; import org.akaza.openclinica.bean.core.SubjectEventStatus; import org.akaza.openclinica.bean.login.UserAccountBean; import org.akaza.openclinica.bean.managestudy.StudyBean; import org.akaza.openclinica.bean.managestudy.StudyEventBean; import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean; import org.akaza.openclinica.bean.managestudy.StudySubjectBean; import org.akaza.openclinica.core.SessionManager; import org.akaza.openclinica.dao.login.UserAccountDAO; import org.akaza.openclinica.dao.managestudy.StudyDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO; import org.akaza.openclinica.dao.managestudy.StudySubjectDAO; import org.akaza.openclinica.dao.submit.SubjectDAO; import org.akaza.openclinica.exception.OpenClinicaSystemException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; import java.util.HashMap; import javax.sql.DataSource; public class EventService implements EventServiceInterface { protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); SubjectDAO subjectDao; StudySubjectDAO studySubjectDao; UserAccountDAO userAccountDao; StudyEventDefinitionDAO studyEventDefinitionDao; StudyEventDAO studyEventDao; StudyDAO studyDao; DataSource dataSource; public EventService(DataSource dataSource) { this.dataSource = dataSource; } public EventService(SessionManager sessionManager) { this.dataSource = sessionManager.getDataSource(); } public HashMap<String, String> scheduleEvent(UserAccountBean user, Date startDateTime, Date endDateTime, String location, String studyUniqueId, String siteUniqueId, String eventDefinitionOID, String studySubjectId) throws OpenClinicaSystemException { // Business Validation StudyBean study = getStudyDao().findByUniqueIdentifier(studyUniqueId); int parentStudyId = study.getId(); if (siteUniqueId != null) { study = getStudyDao().findSiteByUniqueIdentifier(studyUniqueId, siteUniqueId); } StudyEventDefinitionBean studyEventDefinition = getStudyEventDefinitionDao().findByOidAndStudy(eventDefinitionOID, study.getId(), parentStudyId); StudySubjectBean studySubject = getStudySubjectDao().findByLabelAndStudy(studySubjectId, study); Integer studyEventOrdinal = null; if (canSubjectScheduleAnEvent(studyEventDefinition, studySubject)) { StudyEventBean studyEvent = new StudyEventBean(); studyEvent.setStudyEventDefinitionId(studyEventDefinition.getId()); studyEvent.setStudySubjectId(studySubject.getId()); studyEvent.setLocation(location); studyEvent.setDateStarted(startDateTime); studyEvent.setDateEnded(endDateTime); studyEvent.setOwner(user); studyEvent.setStatus(Status.AVAILABLE); studyEvent.setSubjectEventStatus(SubjectEventStatus.SCHEDULED); studyEvent.setSampleOrdinal(getStudyEventDao().getMaxSampleOrdinal(studyEventDefinition, studySubject) + 1); studyEvent = (StudyEventBean) getStudyEventDao().create(studyEvent); studyEventOrdinal = studyEvent.getSampleOrdinal(); } else { throw new OpenClinicaSystemException("Cannot schedule an event for this Subject"); } HashMap<String, String> h = new HashMap<String, String>(); h.put("eventDefinitionOID", eventDefinitionOID); h.put("studyEventOrdinal", studyEventOrdinal.toString()); h.put("studySubjectOID", studySubject.getOid()); return h; } public boolean canSubjectScheduleAnEvent(StudyEventDefinitionBean studyEventDefinition, StudySubjectBean studySubject) { if (studyEventDefinition.isRepeating()) { return true; } if (getStudyEventDao().findAllByDefinitionAndSubject(studyEventDefinition, studySubject).size() > 0) { return false; } return true; } /** * @return the subjectDao */ public SubjectDAO getSubjectDao() { subjectDao = subjectDao != null ? subjectDao : new SubjectDAO(dataSource); return subjectDao; } /** * @return the subjectDao */ public StudyDAO getStudyDao() { studyDao = studyDao != null ? studyDao : new StudyDAO(dataSource); return studyDao; } /** * @return the subjectDao */ public StudySubjectDAO getStudySubjectDao() { studySubjectDao = studySubjectDao != null ? studySubjectDao : new StudySubjectDAO(dataSource); return studySubjectDao; } /** * @return the UserAccountDao */ public UserAccountDAO getUserAccountDao() { userAccountDao = userAccountDao != null ? userAccountDao : new UserAccountDAO(dataSource); return userAccountDao; } /** * @return the StudyEventDefinitionDao */ public StudyEventDefinitionDAO getStudyEventDefinitionDao() { studyEventDefinitionDao = studyEventDefinitionDao != null ? studyEventDefinitionDao : new StudyEventDefinitionDAO(dataSource); return studyEventDefinitionDao; } /** * @return the StudyEventDao */ public StudyEventDAO getStudyEventDao() { studyEventDao = studyEventDao != null ? studyEventDao : new StudyEventDAO(dataSource); return studyEventDao; } /** * @return the datasource */ public DataSource getDataSource() { return dataSource; } /** * @param datasource * the datasource to set */ public void setDatasource(DataSource dataSource) { this.dataSource = dataSource; } }