get_base_url() . '/images/sliced-invoices-icon.svg'; } /** * Returns the settings for this step. * * @since 1.6.1-dev-2 Added the Step Completion setting. * * @return array */ public function get_settings() { $settings = parent::get_settings(); if ( ! $this->is_supported() ) { return $settings; } $settings_api = $this->get_common_settings_api(); $fields = array( $settings_api->get_setting_assignee_type(), $settings_api->get_setting_assignees(), $settings_api->get_setting_assignee_routing(), $settings_api->get_setting_notification_tabs( array( array( 'label' => __( 'Assignee Email', 'gravityflow' ), 'id' => 'tab_assignee_notification', 'fields' => $settings_api->get_setting_notification( array( 'type' => 'assignee', ) ), ) ) ), $settings_api->get_setting_instructions(), $settings_api->get_setting_display_fields(), array( 'name' => 'post_feed_completion', 'type' => 'select', 'label' => __( 'Step Completion', 'gravityflow' ), 'choices' => array( array( 'label' => __( 'Immediately following feed processing', 'gravityflow' ), 'value' => '' ), array( 'label' => __( 'Delay until invoices are paid', 'gravityflow' ), 'value' => 'delayed' ), ), ) ); $settings['fields'] = array_merge( $settings['fields'], $fields ); return $settings; } /** * Processes this step. * * @since 1.6.1-dev-2 * * @return bool Is the step complete? */ public function process() { $complete = parent::process(); $this->assign(); return $complete; } /** * Processes the given feed for the add-on. * * @since 1.6.1-dev-2 * * @param array $feed The feed to be processed. * * @return bool Returning false if the feed created an invoice to ensure the next step is not processed until after the invoice is paid. */ public function process_feed( $feed ) { add_action( 'sliced_gravityforms_feed_processed', array( $this, 'sliced_gravityforms_feed_processed' ), 1, 3 ); parent::process_feed( $feed ); remove_action( 'sliced_gravityforms_feed_processed', array( $this, 'sliced_gravityforms_feed_processed' ), 1 ); return rgars( $feed, 'meta/post_type' ) !== 'invoice' || $this->post_feed_completion !== 'delayed' ? true : false; } /** * Perform any actions once the invoice/quote has been created. * * @since 1.6.1-dev-2 * * @param int $id The invoice (post) ID. * @param array $feed The feed which created the invoice. * @param array $entry The entry which created the invoice. */ public function sliced_gravityforms_feed_processed( $id, $feed, $entry ) { if ( rgars( $feed, 'meta/post_type' ) === 'invoice' && $this->post_feed_completion === 'delayed' ) { // Store the IDs so we can complete the step once the invoice is paid. update_post_meta( $id, '_gform-entry-id', rgar( $entry, 'id' ) ); update_post_meta( $id, '_gform-feed-id', rgar( $feed, 'id' ) ); update_post_meta( $id, '_gravityflow-step-id', $this->get_id() ); if ( function_exists( 'sliced_get_accepted_payment_methods' ) ) { update_post_meta( $id, '_sliced_payment_methods', array_keys( sliced_get_accepted_payment_methods() ) ); } } } /** * Display the workflow detail box for this step. * * @since 1.6.1-dev-2 * * @param array $form The current form. * @param array $args The page arguments. */ public function workflow_detail_box( $form, $args ) { $args = array( 'post_type' => 'sliced_invoice', 'meta_query' => array( array( 'key' => '_gform-entry-id', 'value' => $this->get_entry_id(), ), array( 'key' => '_gravityflow-step-id', 'value' => $this->get_id(), ), ), ); $invoices = get_posts( $args ); if ( ! empty( $invoices ) ) { echo sprintf( '

%s

', $this->get_label() ); $assignee_key = gravity_flow()->get_current_user_assignee_key(); $can_edit = $this->is_assignee( $assignee_key ) && current_user_can( 'edit_posts' ); /* @var WP_Post $invoice */ foreach ( $invoices as $invoice ) { $title = $invoice->post_title; if ( ! $title ) { $feed_id = get_post_meta( $invoice->ID, '_gform-feed-id', true ); $feed = gravity_flow()->get_feed( $feed_id ); $title = rgar( $feed['meta'], 'feedName' ); } echo sprintf( '%s: %s

', esc_html__( 'Title', 'gravityflow' ), esc_html( $title ) ); echo sprintf( '%s: %s

', esc_html__( 'Number', 'gravityflow' ), esc_html( get_post_meta( $invoice->ID, '_sliced_invoice_number', true ) ) ); if ( function_exists( 'sliced_get_invoice_total' ) ) { echo sprintf( '%s: %s

', esc_html__( 'Total', 'gravityflow' ), esc_html( sliced_get_invoice_total( $invoice->ID ) ) ); } if ( class_exists( 'Sliced_Shared' ) ) { $sent_status = ''; if ( class_exists( 'Sliced_Invoice' ) && Sliced_Invoice::get_email_sent_date( $invoice->ID ) ) { $sent_status = ' – ' . esc_html__( 'Invoice Sent', 'gravityflow' ); } echo sprintf( '%s: %s%s

', esc_html__( 'Status', 'gravityflow' ), esc_html( Sliced_Shared::get_status( $invoice->ID, 'invoice' ) ), $sent_status ); } echo '
'; if ( $can_edit ) { echo sprintf( '%s ', get_edit_post_link( $invoice->ID ), esc_html__( 'Edit', 'gravityflow' ) ); } echo sprintf( '%s

', get_permalink( $invoice ), esc_html__( 'Preview', 'gravityflow' ) ); echo '
'; } } } /** * When restarting the workflow or step delete the step ID from the post meta of the invoices which already exist. * * @since 1.6.1-dev-2 */ public function restart_action() { $args = array( 'post_type' => 'sliced_invoice', 'meta_query' => array( array( 'key' => '_gform-entry-id', 'value' => $this->get_entry_id(), ), array( 'key' => '_gravityflow-step-id', 'value' => $this->get_id(), ), ), ); $invoices = get_posts( $args ); if ( empty( $invoices ) ) { return; } /* @var WP_Post $invoice */ foreach ( $invoices as $invoice ) { delete_post_meta( $invoice->ID, '_gravityflow-step-id' ); } } /** * Resume the workflow if the invoice is paid and originated from a feed processed by one of our steps. * * @since 1.6.1-dev-2 * * @param string $id The invoice (post) ID. * @param string $status The invoice status. */ public static function invoice_status_update( $id, $status ) { if ( $status !== 'paid' ) { return; } $entry_id = get_post_meta( $id, '_gform-entry-id', true ); $feed_id = get_post_meta( $id, '_gform-feed-id', true ); $step_id = get_post_meta( $id, '_gravityflow-step-id', true ); if ( ! $entry_id || ! $feed_id || ! $step_id ) { return; } $entry = GFAPI::get_entry( $entry_id ); if ( ! is_wp_error( $entry ) && rgar( $entry, 'workflow_final_status' ) === 'pending' ) { $api = new Gravity_Flow_API( $entry['form_id'] ); /* @var Gravity_Flow_Step_Feed_Sliced_Invoices $step */ $step = $api->get_current_step( $entry ); if ( $step && $step->get_id() == $step_id ) { $feed = gravity_flow()->get_feed( $feed_id ); $label = $step->get_feed_label( $feed ); $step->add_note( sprintf( esc_html__( 'Invoice paid: %s', 'gravityflow' ), $label ) ); $step->log_debug( __METHOD__ . '() - Feed processing complete: ' . $label ); $add_on_feeds = $step->get_processed_add_on_feeds( $entry_id ); if ( ! in_array( $feed_id, $add_on_feeds ) ) { $add_on_feeds[] = $feed_id; $step->update_processed_feeds( $add_on_feeds, $entry_id ); $form = GFAPI::get_form( $entry['form_id'] ); gravity_flow()->process_workflow( $form, $entry_id ); } } } } } Gravity_Flow_Steps::register( new Gravity_Flow_Step_Feed_Sliced_Invoices() ); add_action( 'sliced_invoice_status_update', array( 'Gravity_Flow_Step_Feed_Sliced_Invoices', 'invoice_status_update' ), 10, 2 );