package org.akaza.openclinica.controller; import org.akaza.openclinica.bean.core.DiscrepancyNoteType; import org.akaza.openclinica.bean.core.ResolutionStatus; import org.akaza.openclinica.bean.core.Role; import org.akaza.openclinica.bean.core.Status; import org.akaza.openclinica.bean.core.UserType; import org.akaza.openclinica.bean.login.StudyUserRoleBean; import org.akaza.openclinica.bean.login.UserAccountBean; import org.akaza.openclinica.bean.login.UserDTO; import org.akaza.openclinica.bean.managestudy.DiscrepancyNoteBean; 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.StudyEventDefinitionBean; import org.akaza.openclinica.bean.managestudy.StudySubjectBean; import org.akaza.openclinica.bean.service.StudyParameterValueBean; import org.akaza.openclinica.bean.submit.CRFVersionBean; import org.akaza.openclinica.control.SpringServletAccess; import org.akaza.openclinica.dao.hibernate.AuthoritiesDao; import org.akaza.openclinica.dao.login.UserAccountDAO; import org.akaza.openclinica.dao.managestudy.DiscrepancyNoteDAO; 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.managestudy.StudyEventDefinitionDAO; import org.akaza.openclinica.dao.managestudy.StudySubjectDAO; import org.akaza.openclinica.dao.service.StudyParameterValueDAO; import org.akaza.openclinica.dao.submit.CRFVersionDAO; import org.akaza.openclinica.domain.user.AuthoritiesBean; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.akaza.openclinica.service.pmanage.ParticipantPortalRegistrar; import org.akaza.openclinica.web.pform.PFormCache; import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.httpclient.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Locale; @Controller @RequestMapping(value = "/auth/api/v1/discrepancynote") @ResponseStatus(value = org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR) public class DiscrepancyNoteController { @Autowired @Qualifier("dataSource") private BasicDataSource dataSource; @Autowired ServletContext context; public static final String FORM_CONTEXT = "ecid"; protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); StudyDAO sdao; DiscrepancyNoteDAO dnDao; @RequestMapping(value = "/dnote", method = RequestMethod.POST) public ResponseEntity buidDiscrepancyNote(@RequestBody HashMap<String, String> map, HttpServletRequest request) throws Exception { ResourceBundleProvider.updateLocale(new Locale("en_US")); System.out.println("I'm in EnketoForm DN Rest Method"); org.springframework.http.HttpStatus httpStatus = null; String se_oid = map.get("EntityID"); String ordinal = map.get("Ordinal"); String entityName = map.get("EntityName"); // start_date , end_date , location String studySubjectOid = map.get("SS_OID"); String noteType = map.get("NoteType"); String resolutionStatus = map.get("Status"); String assignedUser = map.get("AssignedUser"); String owner = map.get("Owner"); String description = map.get("Description"); String detailedNotes = map.get("DetailedNote"); String dn_id = map.get("DN_Id"); dn_id = dn_id != null ? dn_id.replaceFirst("DN_",""): dn_id; UserAccountDAO udao = new UserAccountDAO(dataSource); StudySubjectDAO ssdao = new StudySubjectDAO(dataSource); StudyEventDefinitionDAO seddao = new StudyEventDefinitionDAO(dataSource); StudyEventDAO sedao = new StudyEventDAO(dataSource); DiscrepancyNoteDAO dndao = new DiscrepancyNoteDAO(dataSource); UserAccountBean assignedUserBean = (UserAccountBean) udao.findByUserName(assignedUser); UserAccountBean ownerBean = (UserAccountBean)request.getSession().getAttribute("userBean"); StudySubjectBean ssBean = ssdao.findByOid(studySubjectOid); StudyEventDefinitionBean sedBean = seddao.findByOid(se_oid); StudyBean studyBean = getStudy(sedBean.getStudyId()); StudyEventBean seBean = (StudyEventBean) sedao.findByStudySubjectIdAndDefinitionIdAndOrdinal(ssBean.getId(), sedBean.getId(), Integer.valueOf(ordinal)); String entityType = "studyEvent"; DiscrepancyNoteBean parent = (DiscrepancyNoteBean) dndao.findByPK(Integer.valueOf(dn_id)); if (!mayProceed(resolutionStatus, noteType, seBean, entityName, parent, ownerBean)) { httpStatus = org.springframework.http.HttpStatus.BAD_REQUEST; return new ResponseEntity(httpStatus); } if (!parent.isActive()){ saveFieldNotes(description, detailedNotes, seBean.getId(), entityType, studyBean, ownerBean, assignedUserBean, resolutionStatus, noteType, entityName); httpStatus = org.springframework.http.HttpStatus.OK; } else { createDiscrepancyNoteBean(description, detailedNotes, seBean.getId(), entityType, studyBean, ownerBean, assignedUserBean, parent.getId(), resolutionStatus, noteType, entityName); httpStatus = org.springframework.http.HttpStatus.OK; } return new ResponseEntity(httpStatus); } private StudyBean getParentStudy(Integer studyId) { StudyBean study = getStudy(studyId); if (study.getParentStudyId() == 0) { return study; } else { StudyBean parentStudy = (StudyBean) sdao.findByPK(study.getParentStudyId()); return parentStudy; } } private StudyBean getParentStudy(String studyOid) { StudyBean study = getStudy(studyOid); if (study.getParentStudyId() == 0) { return study; } else { StudyBean parentStudy = (StudyBean) sdao.findByPK(study.getParentStudyId()); return parentStudy; } } private StudyBean getStudy(Integer id) { sdao = new StudyDAO(dataSource); StudyBean studyBean = (StudyBean) sdao.findByPK(id); return studyBean; } private StudyBean getStudy(String oid) { sdao = new StudyDAO(dataSource); StudyBean studyBean = (StudyBean) sdao.findByOid(oid); return studyBean; } private Date getDate(String dateInString) throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy"); Date date = formatter.parse(dateInString); System.out.println(date); System.out.println(formatter.format(date)); return date; } public void saveFieldNotes(String description, String detailedNotes, int entityId, String entityType, StudyBean sb, UserAccountBean ownerBean, UserAccountBean assignedUserBean, String resolutionStatus, String noteType, String entityName) { // Create a new thread each time DiscrepancyNoteBean parent = createDiscrepancyNoteBean(description, detailedNotes, entityId, entityType, sb, ownerBean, assignedUserBean, null, resolutionStatus, noteType, entityName); createDiscrepancyNoteBean(description, detailedNotes, entityId, entityType, sb, ownerBean, assignedUserBean, parent.getId(), resolutionStatus, noteType, entityName); } private DiscrepancyNoteBean createDiscrepancyNoteBean(String description, String detailedNotes, int entityId, String entityType, StudyBean sb, UserAccountBean ownerBean, UserAccountBean assignedUserBean, Integer parentId, String resolutionStatus, String noteType, String entityName) { DiscrepancyNoteBean dnb = new DiscrepancyNoteBean(); dnb.setResStatus(ResolutionStatus.getByName(resolutionStatus)); dnb.setEntityId(entityId); dnb.setStudyId(sb.getId()); dnb.setEntityType(entityType); dnb.setDescription(description); dnb.setDetailedNotes(detailedNotes); dnb.setColumn(entityName); dnb.setOwner(ownerBean); dnb.setAssignedUser(assignedUserBean); dnb.setDisType(DiscrepancyNoteType.getByName(noteType)); dnb.setDiscrepancyNoteTypeId(dnb.getDisType().getId()); dnb.setResolutionStatusId(dnb.getResStatus().getId()); dnb.setAssignedUserId(dnb.getAssignedUser().getId()); if (parentId != null) { dnb.setParentDnId(parentId); } dnb = (DiscrepancyNoteBean) getDnDao().create(dnb); getDnDao().createMapping(dnb); DiscrepancyNoteBean eventParentNote = (DiscrepancyNoteBean) getDnDao().findByPK(dnb.getParentDnId()); eventParentNote.setResolutionStatusId(dnb.getResolutionStatusId()); eventParentNote.setDiscrepancyNoteTypeId(dnb.getDiscrepancyNoteTypeId()); eventParentNote.setAssignedUserId(assignedUserBean.getId()); eventParentNote.setUpdater(ownerBean); getDnDao().update(eventParentNote); // update parent DN if(eventParentNote.getAssignedUserId() != 0) { getDnDao().updateAssignedUser(eventParentNote); // update parent DN assigned user } return dnb; } public DiscrepancyNoteDAO getDnDao() { dnDao = new DiscrepancyNoteDAO(dataSource); return dnDao; } public void setDnDao(DiscrepancyNoteDAO dnDao) { this.dnDao = dnDao; } public Boolean mayProceed(String resolutionStatus, String noteType, StudyEventBean seBean, String entityName, DiscrepancyNoteBean parent, UserAccountBean ownerBean) { Boolean result = true; if (!resolutionStatus.equals("Updated") && !resolutionStatus.equals("Resolution Proposed") && !resolutionStatus.equals("Closed") && !resolutionStatus.equals("New")) { result = false; } if (!noteType.equals("Annotation") && !noteType.equals("Query") && !noteType.equals("Reason for Change") && !noteType.equals("Failed Validation Check")) { result = false; } if (!seBean.isActive()) { result = false; } if (!entityName.equals("start_date") && !entityName.equals("end_date") && !entityName.equals("location")) { result = false; } if (!ownerBean.isActive()) { result = false; } return result; } }