'GET', 'callback' => array(__CLASS__, 'get_next_actions_for_user'), ) ); register_rest_route( self::$namespace, 'customer-acceptance/(?P\d+)', array( 'methods' => 'GET', 'callback' => array(__CLASS__, 'get_customer_acceptance'), 'permission_callback' => 'is_user_logged_in' ) ); register_rest_route( self::$namespace, 'customer-acceptance/(?P\d+)', array( 'methods' => 'POST', 'callback' => array(__CLASS__, 'submit_customer_acceptance'), 'permission_callback' => 'is_user_logged_in' ) ); register_rest_route( self::$namespace, 'customer-acceptance/(?P\d+)/upload-file' , array( 'methods' => 'POST', 'callback' => array(__CLASS__, 'upload_file'), 'permission_callback' => 'is_user_logged_in' ) ); } public static function get_next_actions_for_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(); $total_count = 7; $entries = GFAPI::get_entries( $form_ids, $search_criteria, null, null, $total_count ); $data = array(); foreach ($entries as $entry) { $step = gravity_flow()->get_step( $entry['workflow_step'] ); $data[] = array( 'order_id' => $entry['wiaas_delivery_order_id'], 'order_number' => $entry['wiaas_delivery_order_id'], 'status' => $entry['workflow_final_status'], 'step_action' => $step->get_name(), ); } $response = new WP_REST_Response( $data ); return $response; } public static function get_customer_acceptance(WP_REST_Request $request){ $entry = GFAPI::get_entry($request['entry_id']); if (is_wp_error($entry)){ return self::generate_error('Customer acceptance entry not found', 404); } $acceptance_documents = array(); $uploaded_files = json_decode($entry[self::UPLOADED_FILES_FIELD_ID]); foreach($uploaded_files as $file_url){ //example of decoded url : //http://localhost/wp/index.php?gf-download=2018/08/rokovi-1535378841.docx&form-id=1&field-id=12&hash=1be6c30f0eeff93563b352d15fe459d5ded12ee06c2c8f36fed66b42dedf2534 $decoded_url = urldecode($file_url); $url_parts = explode('?', $decoded_url); $file_name_base_parts = explode('&', $url_parts[1]); $file_name_parts = explode('/', $file_name_base_parts[0]); $file_name_with_extension_parts = explode('.', $file_name_parts[2]); $acceptance_documents_entry = array( 'name' => $file_name_with_extension_parts[0], 'extension' => $file_name_with_extension_parts[1], 'url' => $file_url ); array_push($acceptance_documents, $acceptance_documents_entry); } $acceptance_status = 0; if ($entry[self::ACCEPTANCE_STATUS_FIELD_ID]){ $acceptance_status = ($entry[self::ACCEPTANCE_STATUS_FIELD_ID] === 'accept') ? 1 : -1; } $result = array( 'documents' => $acceptance_documents, 'expiration' => $entry[self::EXPIRATION_DATE_FIELD_ID], 'status' => $acceptance_status, 'decline_reason' => $entry[self::DECLINE_REASON_FIELD_ID] ); return new WP_REST_Response($result); } public static function submit_customer_acceptance(WP_REST_Request $request){ $entry = GFAPI::get_entry($request['entry_id']); if (is_wp_error($entry)){ return self::generate_error('Customer acceptance entry not found', 404); } $status = $request['actionType']; $reason = $request['declineReason']; if (!in_array($status, self::ACCEPTABLE_STATUS)){ return self::generate_wiaas_response('ACCEPTANCE_STATUS_MISSING', 'error'); } $installation_declined = ($status === self::DECLINE_STATUS_LABEL); $uploaded_files = json_decode($entry[self::UPLOADED_FILES_FIELD_ID]); if ($installation_declined && $reason === ''){ return self::generate_wiaas_response('DECLINE_REASON_EMPTY', 'error'); } if (!$installation_declined && (count($uploaded_files)===0)){ return self::generate_wiaas_response('ACCEPTANCE_NOT_UPLOADED', 'error'); } $entry[self::DECLINE_REASON_FIELD_ID] = $reason; $entry[self::ACCEPTANCE_STATUS_FIELD_ID] = $status; if (!GFAPI::update_entry( $entry )){ return self::generate_wiaas_response('INTERNAL_SERVER_ERROR', 'error'); } //Check if step is already completed, to not submit again $gf_api = new Gravity_Flow_API($entry['form_id']); $current_step = $gf_api->get_current_step($entry); if ($current_step->get_name() !== self::USER_INPUT_STEP_NAME){ return self::generate_wiaas_response('ACCEPTANCE_STATUS_UPDATED', 'success'); } if ( $current_step ) { $current_step->purge_assignees(); $current_step->update_step_status( 'complete' ); } $entry_id = $entry['id']; $new_step_id = $current_step->get_id() + 1; $new_step = $gf_api->get_step( $new_step_id, $entry ); $feedback = sprintf( esc_html__( 'Sent to step: %s', 'gravityflow' ), $new_step->get_name() ); $gf_api->add_timeline_note( $entry_id, $feedback ); $gf_api->log_activity( 'workflow', 'sent_to_step', $gf_api->form_id, $entry_id, $step_id ); gform_update_meta( $entry_id, 'workflow_final_status', 'pending' ); $new_step->start(); $gf_api->process_workflow( $entry_id ); if ($installation_declined){ return self::generate_wiaas_response('INSTALLATION_DECLINED', 'success'); } return self::generate_wiaas_response('INSTALLATION_ACCEPTED', 'success'); } public static function upload_file(WP_REST_Request $request){ $files = $request->get_file_params(); if (!$files[self::FILE_KEY_NAME]){ return self::generate_wiaas_response('NO_FILES_UPLOADED', 'error'); } $entry = GFAPI::get_entry($request['entry_id']); if (is_wp_error($entry)){ return self::generate_error('Customer acceptance entry not found', 404); } $form = GFAPI::get_form($entry['form_id']); $form_upload_path = GFFormsModel::get_upload_path( $form['id'] ); $target_path = $form_upload_path . '/' . date('Y') . '/' . date('m') . '/'; wp_mkdir_p( $target_path ); GFCommon::recursive_add_index_file( $target_path ); $upload_file_field = GFAPI::get_field($form['id'], self::UPLOADED_FILES_FIELD_ID); $file_name = sanitize_file_name($files[self::FILE_KEY_NAME]['name']); $file_path_details = pathinfo($file_name); if ( GFCommon::file_name_has_disallowed_extension( $file_name ) ) { return self::generate_wiaas_response('INVALID_FILE_ACCEPTANCE', 'error'); } $allowed_extensions = ! empty( $upload_file_field->allowedExtensions ) ? GFCommon::clean_extensions( explode( ',', strtolower( $upload_file_field->allowedExtensions ) ) ) : array(); if ( ! empty( $allowed_extensions ) ) { if ( ! GFCommon::match_file_extension( $file_name, $allowed_extensions ) ) { return self::generate_wiaas_response('INVALID_FILE_ACCEPTANCE', 'error'); } } $new_file_name = $file_path_details['filename'] . '-' . time() . '.' . $file_path_details['extension']; // Bypasses security checks when running unit tests. if ( defined( 'WP_TEST_IN_PROGRESS' ) && WP_TEST_IN_PROGRESS ) { return self::generate_wiaas_response('FILE_UPLOADED', 'success'); } if ( move_uploaded_file($files[self::FILE_KEY_NAME]['tmp_name'], $target_path . $new_file_name ) ) { GFFormsModel::set_permissions( $target_path . $new_file_name ); } else { return self::generate_wiaas_response('INTERNAL_SERVER_ERROR', 'error'); } //Extract path relative to the root //Last 6 strings (excluding last empty) are path relative to the root $path_parts = explode('/', $target_path); $relative_path = ''; $i = count($path_parts) - self::PATH_PARTS_TO_EXTRACT; while($i < count($path_parts)-1){ $relative_path = $relative_path . $path_parts[$i] . '/'; $i++; } $file_url = self::BASE_NAME . $relative_path . $new_file_name; $url_for_download = $upload_file_field->get_download_url($file_url); $uploaded_files = json_decode($entry[self::UPLOADED_FILES_FIELD_ID]); if ($uploaded_files === NULL){ $uploaded_files = []; } array_push($uploaded_files, $url_for_download); $entry[self::UPLOADED_FILES_FIELD_ID] = json_encode($uploaded_files); if (GFAPI::update_entry( $entry )) { return self::generate_wiaas_response('FILE_UPLOADED','success'); } return self::generate_wiaas_response('NOT_UPLOADED', 'error'); } //Helper function private static function generate_error($message, $code = 500){ $error = array( 'status' => $code, 'message' => $message, ); $result = new WP_REST_Response($error); $result->set_status($code); return $result; } private static function generate_wiaas_response($message, $code, $data = NULL){ $response = array( 'messages' => [ array( 'code' => $code, 'message' => $message ) ], 'data' => $data ); return new WP_REST_Response($response); } }