325 lines
9.2 KiB
PHP
Executable File
325 lines
9.2 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Gravity Flow Step Feed Sliced Invoices
|
|
*
|
|
* @package GravityFlow
|
|
* @subpackage Classes/Gravity_Flow_Step_Feed_Sliced_Invoices
|
|
* @copyright Copyright (c) 2016-2018, Steven Henty S.L.
|
|
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
|
|
* @since 1.3.3-dev
|
|
*/
|
|
|
|
if ( ! class_exists( 'GFForms' ) ) {
|
|
die();
|
|
}
|
|
|
|
/**
|
|
* Class Gravity_Flow_Step_Feed_Sliced_Invoices
|
|
*/
|
|
class Gravity_Flow_Step_Feed_Sliced_Invoices extends Gravity_Flow_Step_Feed_Add_On {
|
|
|
|
/**
|
|
* The step type.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $_step_type = 'slicedinvoices';
|
|
|
|
/**
|
|
* The name of the class used by the add-on.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_class_name = 'Sliced_Invoices_GF';
|
|
|
|
/**
|
|
* The slug used by the add-on.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_slug = 'slicedinvoices';
|
|
|
|
/**
|
|
* Enable the expiration settings.
|
|
*
|
|
* @since 1.6.1-dev-2
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function supports_expiration() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Returns the step label.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_label() {
|
|
return 'Sliced Invoices';
|
|
}
|
|
|
|
/**
|
|
* Returns the URL for the step icon.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_icon_url() {
|
|
return $this->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( '<h4 style="margin-bottom:10px;">%s</h4>', $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<br><br>', esc_html__( 'Title', 'gravityflow' ), esc_html( $title ) );
|
|
echo sprintf( '%s: %s<br><br>', 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<br><br>', 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<br><br>', esc_html__( 'Status', 'gravityflow' ), esc_html( Sliced_Shared::get_status( $invoice->ID, 'invoice' ) ), $sent_status );
|
|
}
|
|
|
|
echo '<div class="gravityflow-action-buttons">';
|
|
if ( $can_edit ) {
|
|
echo sprintf( '<a href="%s" target="_blank" class="button button-large button-primary">%s</a> ', get_edit_post_link( $invoice->ID ), esc_html__( 'Edit', 'gravityflow' ) );
|
|
}
|
|
echo sprintf( '<a href="%s" target="_blank" class="button button-large button-primary">%s</a><br><br>', get_permalink( $invoice ), esc_html__( 'Preview', 'gravityflow' ) );
|
|
echo '</div>';
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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 );
|