/** * @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; }
/** * 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(); } }