$order_id, 'form_id' => $process_id, ); $order_fields = GFCommon::get_fields_by_type($process_form, array('wiaas_order')); if (! empty($order_fields)) { $order_field = $order_fields[0]; $new_process_entry[$order_field['id']] = $order_id; } $process_entry_id = GFAPI::add_entry( $new_process_entry ); update_post_meta($order_id, 'wiaas_delivery_process_id', $process_id); update_post_meta($order_id, 'wiaas_delivery_process_entry_id', $process_entry_id); $order = wc_get_order($order_id); $order->set_status('processing', 'Started order delivery process.', true); $order->save(); return $process_entry_id; } return false; } /** * Delivery dates cannot be set if: * - user cannot edit delivery dates * - actions for customer config validation is not done * - action for customer acceptance is active or completed * * @param int $order_id * @param mixed $delivery_process_entry * @param array $steps * * @return bool */ public static function can_delivery_dates_be_set($order_id, $delivery_process_entry = null, $steps = null) { if ( empty($delivery_process_entry) ) { $delivery_process_entry = self::get_order_delivery_process_entry($order_id); } if (empty($delivery_process_entry) || ! GFAPI::current_user_can_any( 'manage_wiaas_order_delivery_process' )) { return false; } $workflow_api = new Gravity_Flow_API($delivery_process_entry['form_id']); $current_step = $workflow_api->get_current_step($delivery_process_entry); if ( empty($steps) ) { $steps = $workflow_api->get_steps(); } foreach ($steps as $step) { $step = $workflow_api->get_step($step->get_id(), $delivery_process_entry); // customer validation not done if ($step && Wiaas_Delivery_Process_Action::process_step_has_customer_validate_questionnaires_action($step) && $step->get_status() !== 'complete') { return false; } // customer acceptance is active or completed if ($step && Wiaas_Delivery_Process_Action::process_step_has_customer_acceptance_action($step) && ($current_step && $step->get_id() === $current_step->get_id() || $step->get_status() === 'complete')) { return false; } } return true; } public static function get_next_actions_for_current_user() { $current_user = wp_get_current_user(); $field_filters = array(); $field_filters[] = array( 'key' => 'workflow_user_id_' . $current_user->ID, 'value' => 'pending', ); $user_roles = gravity_flow()->get_user_roles(); foreach ( $user_roles as $user_role ) { $field_filters[] = array( 'key' => 'workflow_role_' . $user_role, 'value' => 'pending', ); } $field_filters['mode'] = 'any'; $search_criteria = array(); $search_criteria['field_filters'] = $field_filters; $search_criteria['status'] = 'active'; $form_ids = gravity_flow()->get_workflow_form_ids(); $entries = GFAPI::get_entries( $form_ids, $search_criteria, null, null); $actions = array(); foreach ($entries as $entry) { $order_id = $entry['wiaas_delivery_order_id']; $order = wc_get_order($order_id); if (! $order) { continue; } $step = gravity_flow()->get_step( $entry['workflow_step'] ); if (!$step) { continue; } $action = array( 'order_id' => $order_id, 'order_number' => $order->get_order_number(), 'action_title' => $step->get_name() ); if (is_admin()) { $action['url'] = '?page=gravityflow-inbox&view=entry&id=' . $entry['form_id'] . '&lid=' . $entry['id']; } $actions[] = $action; } return $actions; } /** * Maybe complete parent order for completed delivery process * @param $entry_id * @param $form */ public static function maybe_complete_parent_order($entry_id, $form) { $entry = GFAPI::get_entry($entry_id); $order_id = $entry['wiaas_delivery_order_id']; if (!isset($order_id)) { return; } $process_entry_id = get_post_meta($order_id, 'wiaas_delivery_process_entry_id', true); // order process entry completed, so complete order if (absint($process_entry_id) === absint($entry_id)) { $order = wc_get_order($order_id); $order->update_status('completed', 'Completed order delivery process.', true); } } public static function get_available_process_list_for_country($country_code) { $forms = GFAPI::get_forms(); $available_process_forms = array(); foreach ($forms as $form) { $delivery_settings = rgar($form, 'wiaas_delivery_process'); if ($delivery_settings['delivery_form_type'] === 'process' && $delivery_settings['delivery_country'] === $country_code) { $available_process_forms[] = $form; } } return $available_process_forms; } public static function get_customer_acceptance_data($order_id) { $delivery_process_entry = self::get_order_delivery_process_entry($order_id); $data = array(); if (! empty($delivery_process_entry)) { $workflow = new Gravity_Flow_API($delivery_process_entry['form_id']); $step = $workflow->get_current_step($delivery_process_entry); if ($step && Wiaas_Delivery_Process_Action::process_step_has_customer_acceptance_action($step)) { $action_entries = Wiaas_Delivery_Process_Action::get_process_step_action_entries($step); $action_entry = $action_entries[0]; $data[] = Wiaas_Delivery_Process_Action::get_customer_acceptance_action_data($action_entry['id']); } } return empty( $data ) ? $data : $data[0]; } public static function get_customer_questionnaires_data($order_id) { $data = array(); $delivery_process_entry = self::get_order_delivery_process_entry($order_id); if (! empty($delivery_process_entry)) { $workflow = new Gravity_Flow_API($delivery_process_entry['form_id']); $step = $workflow->get_current_step($delivery_process_entry); if ($step && Wiaas_Delivery_Process_Action::process_step_has_customer_validate_questionnaires_action($step)) { $action_entries = Wiaas_Delivery_Process_Action::get_process_step_action_entries($step); foreach ($action_entries as $action_entry) { $action_data = Wiaas_Delivery_Process_Action::get_customer_validate_questionnaires_action_data($action_entry['id']); if (! empty($action_data)) { $data[] = $action_data; } } } } return $data; } public static function update_customer_acceptance_status($order_id, $status, $reason) { $delivery_process_entry = self::get_order_delivery_process_entry($order_id); if (! empty($delivery_process_entry) ) { $workflow = new Gravity_Flow_API($delivery_process_entry['form_id']); $step = $workflow->get_current_step($delivery_process_entry); $action_entries = Wiaas_Delivery_Process_Action::get_process_step_action_entries($step); $action_entry = $action_entries[0]; Wiaas_Delivery_Process_Action::update_customer_acceptance_status($action_entry['id'], $status, $reason); } } public static function is_customer_acceptance_uploaded($order_id) { $delivery_process_entry = self::get_order_delivery_process_entry($order_id); if (! empty($delivery_process_entry) ) { $workflow = new Gravity_Flow_API($delivery_process_entry['form_id']); $step = $workflow->get_current_step($delivery_process_entry); $action_entries = Wiaas_Delivery_Process_Action::get_process_step_action_entries($step); $action_entry = $action_entries[0]; return Wiaas_Delivery_Process_Action::is_customer_acceptance_uploaded($action_entry['id']); } return false; } public static function upload_customer_questionnaire($order_id, $action_entry_id) { Wiaas_Delivery_Process_Action::upload_customer_questionnaire($action_entry_id); } public static function upload_customer_acceptance_document($order_id) { $delivery_process_entry = self::get_order_delivery_process_entry($order_id); if (! empty($delivery_process_entry) ) { $workflow = new Gravity_Flow_API($delivery_process_entry['form_id']); $step = $workflow->get_current_step($delivery_process_entry); $action_entries = Wiaas_Delivery_Process_Action::get_process_step_action_entries($step); $action_entry = $action_entries[0]; $success = Wiaas_Delivery_Process_Action::upload_customer_acceptance_document($action_entry['id']); return $success; } return false; } public static function get_order_delivery_process_entry($order_id) { $order = wc_get_order($order_id); $process_entry_id = $order->get_meta('wiaas_delivery_process_entry_id', true); if (empty($process_entry_id)) { return array(); } return GFAPI::get_entry($process_entry_id); } /** * Retrieves delivery process instance for order * * @param $order_id * * @return array|null */ public static function get_order_delivery_process($order_id) { $process_entry_id = get_post_meta($order_id, 'wiaas_delivery_process_entry_id', true); if (empty($process_entry_id)) { return null; } $process_instance = GFAPI::get_entry($process_entry_id); $process_form = GFAPI::get_form($process_instance['form_id']); $api = new Gravity_Flow_API($process_instance['form_id']); $steps_info = $api->get_steps(); $delivery_process = array( 'id' => $process_form['id'], 'name' => $process_form['title'], 'steps' => array( array( 'short_desc' => 'Order placed', 'status' => 'complete', 'order_id' => $order_id, 'process_id' => $process_entry_id, 'step_id' => -1, ), array( 'short_desc' => 'Assign process', 'status' => 'complete', 'order_id' => $order_id, 'process_id' => $process_entry_id, 'step_id' => 0, ) ) ); $current_step = $api->get_current_step($process_instance); foreach ( $steps_info as $step_info ) { $step = $api->get_step( $step_info->get_id(), $process_instance ); if (! $step->is_visible_to_customer) { continue; } $action_code = Wiaas_Delivery_Process_Action::get_process_step_action_form_action_code($step); $info = $step->get_feed_meta(); $status = $step->get_status(); if ($current_step && $current_step->get_id() === $step->get_id()) { $status = 'pending'; } $delivery_process['steps'][] = array( 'step_id' => $step->get_id(), 'process_id' => $process_entry_id, 'short_desc' => $info['step_name'], 'full_desc' => $info['description'], 'action_code' => $action_code, 'status' => $status, 'order_id' => $order_id, ); } return $delivery_process; } } add_action( 'gravityflow_loaded', array('Wiaas_Delivery_Process', 'init') );