/**
  * @param Gravity_Flow_Assignee $assignee
  * @param $new_status
  * @param $form
  *
  * @return bool|string If processed return a message to be displayed to the user.
  */
 public function process_assignee_status($assignee, $new_status, $form)
 {
     $feedback = false;
     if (!in_array($new_status, array('pending', 'approved', 'rejected', 'revert'))) {
         return $feedback;
     }
     $current_user_status = $assignee->get_status();
     $current_role_status = false;
     $role = false;
     foreach (gravity_flow()->get_user_roles() as $role) {
         $current_role_status = $this->get_role_status($role);
         if ($current_role_status == 'pending') {
             break;
         }
     }
     if ($current_user_status != 'pending' && $current_role_status != 'pending') {
         return esc_html__('The status could not be changed because this step has already been processed.', 'gravityflow');
     }
     if ($new_status == 'revert') {
         if ($this->revertEnable) {
             $step = gravity_flow()->get_step($this->revertValue, $this->get_entry());
             if ($step) {
                 $this->end();
                 $note = $this->get_name() . ': ' . esc_html__('Reverted to step', 'gravityflow') . ' - ' . $step->get_label();
                 $user_note = rgpost('gravityflow_note');
                 if (!empty($user_note)) {
                     $note .= sprintf("\n%s: %s", __('Note', 'gravityflow'), $user_note);
                 }
                 $this->add_note($note);
                 $step->start();
                 $feedback = esc_html__('Reverted to step:', 'gravityflow') . ' ' . $step->get_label();
             }
         }
         return $feedback;
     }
     if ($current_user_status == 'pending') {
         $assignee->update_status($new_status);
     }
     if ($current_role_status == 'pending') {
         $this->update_role_status($role, $new_status);
     }
     $note = '';
     if ($new_status == 'approved') {
         $note = $this->get_name() . ': ' . __('Approved.', 'gravityflow');
         $this->send_approval_notification();
     } elseif ($new_status == 'rejected') {
         $note = $this->get_name() . ': ' . __('Rejected.', 'gravityflow');
         $this->send_rejection_notification();
     }
     if (!empty($note)) {
         $user_note = rgpost('gravityflow_note');
         if (!empty($user_note)) {
             $note .= sprintf("\n%s: %s", __('Note', 'gravityflow'), $user_note);
         }
         $user_id = $assignee->get_type() == 'user_id' ? $assignee->get_id() : 0;
         $this->add_note($note, $user_id, $assignee->get_display_name());
     }
     $status = $this->evaluate_status();
     $this->update_step_status($status);
     $entry = $this->refresh_entry();
     GFAPI::send_notifications($form, $entry, 'workflow_approval');
     switch ($new_status) {
         case 'approved':
             $feedback = __('Entry Approved', 'gravityflow');
             break;
         case 'rejected':
             $feedback = __('Entry Rejected', 'gravityflow');
             break;
     }
     return $feedback;
 }
 /**
  * @param Gravity_Flow_Assignee $assignee
  * @param string $new_status
  * @param array $form
  *
  * @return string|bool If processed return a message to be displayed to the user.
  */
 public function process_assignee_status($assignee, $new_status, $form)
 {
     if ($new_status == 'complete') {
         $current_user_status = $assignee->get_status();
         $current_role_status = false;
         $role = false;
         foreach (gravity_flow()->get_user_roles() as $role) {
             $current_role_status = $this->get_role_status($role);
             if ($current_role_status == 'pending') {
                 break;
             }
         }
         if ($current_user_status == 'pending') {
             $assignee->update_status('complete');
         }
         if ($current_role_status == 'pending') {
             $this->update_role_status($role, 'complete');
         }
         $this->refresh_entry();
     }
     $feedback = $new_status == 'complete' ? __('Entry updated and marked complete.', 'gravityflow') : __('Entry updated - in progress.', 'gravityflow');
     $note = sprintf('%s: %s', $this->get_name(), $feedback);
     $user_note = rgpost('gravityflow_note');
     if (!empty($user_note)) {
         $note .= sprintf("\n%s: %s", esc_html__('Note', 'gravityflow'), $user_note);
     }
     $this->add_note($note);
     $status = $this->evaluate_status();
     $this->update_step_status($status);
     $entry = $this->refresh_entry();
     GFAPI::send_notifications($form, $entry, 'workflow_user_input');
     return $feedback;
 }
Ejemplo n.º 3
0
 /**
  * Removes assignees from and/or adds assignees to a step. Call after updating entry values.
  * Make sure you call get_assignees() before you update the entry or the previous assignees may not get removed.
  *
  * @param Gravity_Flow_Assignee[] $previous_assignees The previous assign
  */
 public function maybe_adjust_assignment($previous_assignees)
 {
     gravity_flow()->log_debug(__METHOD__ . '(): Starting');
     $new_assignees = $this->get_assignees();
     $new_assignees_keys = array();
     foreach ($new_assignees as $new_assignee) {
         $new_assignees_keys[] = $new_assignee->get_key();
     }
     $previous_assignees_keys = array();
     foreach ($previous_assignees as $previous_assignee) {
         $previous_assignees_keys[] = $previous_assignee->get_key();
     }
     $assignee_keys_to_add = array_diff($new_assignees_keys, $previous_assignees_keys);
     $assignee_keys_to_remove = array_diff($previous_assignees_keys, $new_assignees_keys);
     foreach ($assignee_keys_to_add as $assignee_key_to_add) {
         $assignee_to_add = new Gravity_Flow_Assignee($assignee_key_to_add, $this);
         $assignee_to_add->update_status('pending');
     }
     foreach ($assignee_keys_to_remove as $assignee_key_to_remove) {
         $assignee_to_remove = new Gravity_Flow_Assignee($assignee_key_to_remove, $this);
         $assignee_to_remove->remove();
     }
 }