/**
  * Find the submission. It is the submission that is either currently pending or already submitted
  * to a committee.
  *
  * @param protocol
  * @return
  */
 private ProtocolSubmission findSubmission(Protocol protocol) {
   for (ProtocolSubmission submission : protocol.getProtocolSubmissions()) {
     if (StringUtils.equals(submission.getSubmissionStatusCode(), ProtocolSubmissionStatus.PENDING)
         || StringUtils.equals(
             submission.getSubmissionStatusCode(),
             ProtocolSubmissionStatus.SUBMITTED_TO_COMMITTEE)) {
       return submission;
     }
   }
   return null;
 }
  private boolean canPerform(ProtocolAction lastAction, ProtocolSubmission lastSubmission) {
    boolean canPerform = false;

    if (lastAction != null && lastSubmission != null) {

      boolean traditionalSubPerform =
          ProtocolActionType.RECORD_COMMITTEE_DECISION.equals(
                  lastAction.getProtocolActionTypeCode())
              && CommitteeDecisionMotionType.SPECIFIC_MINOR_REVISIONS.equals(
                  lastSubmission.getCommitteeDecisionMotionTypeCode());

      boolean exemptExpeditePerform = false;
      if (lastSubmission.getProtocolReviewType() != null) {
        exemptExpeditePerform =
            isExpeditedOrExempt(lastSubmission.getProtocolReviewType().getReviewTypeCode())
                && ProtocolActionType.SUBMIT_TO_IRB.equals(lastAction.getProtocolActionTypeCode());
      }

      canPerform = traditionalSubPerform || exemptExpeditePerform;
    }

    return canPerform;
  }
 @Override
 public boolean isProtocolInStateToBeReviewed(ProtocolBase protocol) {
   boolean isReviewable = false;
   ProtocolSubmission submission =
       (ProtocolSubmission) ((Protocol) protocol).getProtocolSubmission();
   if (submission != null) {
     try {
       isReviewable =
           StringUtils.isNotEmpty(submission.getScheduleId())
               || ProtocolReviewType.EXPEDITED_REVIEW_TYPE_CODE.equals(
                   submission.getProtocolReviewTypeCode())
               || (ProtocolReviewType.FYI_TYPE_CODE.equalsIgnoreCase(
                       submission.getProtocolReviewTypeCode())
                   && ProtocolSubmissionType.NOTIFY_IRB.equalsIgnoreCase(
                       submission.getProtocolSubmissionType().getSubmissionTypeCode()));
       isReviewable &=
           (StringUtils.equals(
                   submission.getSubmissionStatusCode(),
                   ProtocolSubmissionStatus.SUBMITTED_TO_COMMITTEE)
               || StringUtils.equals(
                   submission.getSubmissionStatusCode(), ProtocolSubmissionStatus.IN_AGENDA));
       ProtocolDocument protocolDocument =
           (ProtocolDocument)
               protocol
                   .getProtocolDocument(); // (ProtocolDocument)
                                           // documentService.getByDocumentHeaderId(protocol.getProtocolDocument().getDocumentNumber());
       isReviewable &=
           getKraWorkflowService()
               .isCurrentNode(protocolDocument, Constants.PROTOCOL_IRBREVIEW_ROUTE_NODE_NAME);
     } catch (Exception e) {
       String errorString =
           String.format(
               "WorkflowException checking route node for creating new ProtocolOnlineReviewDocument "
                   + "for protocol %s",
               submission.getProtocolNumber());
       LOG.error(errorString, e);
       throw new RuntimeException(errorString, e);
     }
   }
   return isReviewable;
 }
  @Test
  public void testProcessApproveCommitteeDecision() throws Exception {
    Protocol protocol = getProtocolAssignedToAgenda();

    CommitteeDecision committeeDecision =
        getMockCommitteeDecisionBean(CommitteeDecisionMotionType.APPROVE);
    service.processCommitteeDecision(protocol, committeeDecision);

    ProtocolAction lastAction = protocol.getLastProtocolAction();
    assertNotNull(lastAction);
    assertEquals(
        ProtocolActionType.RECORD_COMMITTEE_DECISION, lastAction.getProtocolActionTypeCode());
    ProtocolSubmission submission = protocol.getProtocolSubmission();
    assertNotNull(submission);
    assertEquals(
        CommitteeDecisionMotionType.APPROVE, submission.getCommitteeDecisionMotionTypeCode());
    assertEquals(YES_COUNT, submission.getYesVoteCount());
    assertEquals(NO_COUNT, submission.getNoVoteCount());
    assertEquals(ABSTAIN_COUNT, submission.getAbstainerCount());
    assertEquals(RECUSED_COUNT, submission.getRecusedCount());
    assertEquals(VOTING_COMMENTS, submission.getVotingComments());
  }
 /**
  * Is the submission assigned to a committee and schedule?
  *
  * @param protocol
  * @return
  */
 private boolean isInSchedule(Protocol protocol) {
   ProtocolSubmission submission = findSubmission(protocol);
   return submission != null
       && !StringUtils.isBlank(submission.getCommitteeId())
       && !StringUtils.isBlank(submission.getScheduleId());
 }