laipower/wp-content/plugins/easy-digital-downloads/includes/admin/payments/orders.php

1182 lines
39 KiB
PHP

<?php
/**
* Order Details/Add New Order Sections
*
* @package EDD
* @subpackage Admin/Orders
* @copyright Copyright (c) 2018, Easy Digital Downloads, LLC
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
* @since 3.0
*/
// Exit if accessed directly
defined( 'ABSPATH' ) || exit;
/** Publishing ******************************************************************/
/**
* Outputs publishing actions.
*
* UI is modelled off block-editor header region.
*
* @since 3.0
*
* @param EDD\Orders\Order $order Current order.
*/
function edd_order_details_publish( $order ) {
$action_name = edd_is_add_order_page()
? __( 'Create Order', 'easy-digital-downloads' )
: __( 'Save Order', 'easy-digital-downloads' )
?>
<div class="edit-post-editor-regions__header">
<div class="edit-post-header">
<div class="edit-post-header__settings">
<?php if ( edd_is_add_order_page() ) : ?>
<div class="edd-send-purchase-receipt">
<div class="edd-form-group">
<div class="edd-form-group__control">
<input type="checkbox" name="edd_order_send_receipt" id="edd-order-send-receipt" class="edd-form-group__input" value="1" checked />
<label for="edd-order-send-receipt">
<?php esc_html_e( 'Send Purchase Receipt', 'easy-digital-downloads' ); ?>
</label>
<span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<?php esc_attr_e( 'Checking this box will email the purchase receipt to the selected customer.', 'easy-digital-downloads' ); ?>"></span>
</div>
</div>
</div>
<?php endif; ?>
<div id="publishing-action">
<span class="spinner"></span>
<input
type="submit"
id="edd-order-submit"
class="button button-primary right"
value="<?php echo esc_html( $action_name ); ?>"
<?php if ( ! edd_is_add_order_page() ) : ?>
autofocus
<?php endif; ?>
/>
</div>
</div>
<div class="edit-post-header__toolbar">
</div>
</div>
</div>
<?php
}
/** Sections ******************************************************************/
/**
* Contains code to setup tabs & views using EDD\Admin\Order_Sections().
*
* @since 3.0
*
* @param mixed $item
*/
function edd_order_sections( $item = false ) {
// Instantiate the Sections class and sections array
$sections = new EDD\Admin\Order_Sections();
// Setup sections variables
$sections->use_js = true;
$sections->current_section = 'customer';
$sections->item = $item;
$sections->base_url = '';
// Get all registered tabs & views
$o_sections = edd_get_order_details_sections( $item );
// Set the customer sections
$sections->set_sections( $o_sections );
// Display the sections
$sections->display();
}
/**
* Return the order details sections.
*
* @since 3.0
*
* @param object $order
* @return array Sections.
*/
function edd_get_order_details_sections( $order ) {
$sections = array(
array(
'id' => 'customer',
'label' => __( 'Customer', 'easy-digital-downloads' ),
'icon' => 'businessman',
'callback' => 'edd_order_details_customer',
),
array(
'id' => 'email',
'label' => __( 'Email', 'easy-digital-downloads' ),
'icon' => 'email',
'callback' => 'edd_order_details_email',
),
array(
'id' => 'address',
'label' => __( 'Address', 'easy-digital-downloads' ),
'icon' => 'admin-home',
'callback' => 'edd_order_details_addresses',
),
array(
'id' => 'notes',
'label' => __( 'Notes', 'easy-digital-downloads' ),
'icon' => 'admin-comments',
'callback' => 'edd_order_details_notes',
),
array(
'id' => 'logs',
'label' => __( 'Logs', 'easy-digital-downloads' ),
'icon' => 'admin-tools',
'callback' => 'edd_order_details_logs',
),
);
// Override sections if adding a new order.
if ( edd_is_add_order_page() ) {
$sections = array(
array(
'id' => 'customer',
'label' => __( 'Customer', 'easy-digital-downloads' ),
'icon' => 'businessman',
'callback' => 'edd_order_details_customer',
),
array(
'id' => 'address',
'label' => __( 'Address', 'easy-digital-downloads' ),
'icon' => 'admin-home',
'callback' => 'edd_order_details_addresses',
),
);
}
/**
* Filter the sections.
*
* @since 3.0
*
* @param array $sections Sections.
* @param object $order Order object.
*/
return (array) apply_filters( 'edd_get_order_details_sections', $sections, $order );
}
/**
* Output the order details customer section
*
* @since 3.0
*
* @param object $order
*/
function edd_order_details_customer( $order ) {
$customer = edd_get_customer( $order->customer_id );
$payment = edd_get_payment( $order->id );
$user_info = $payment
? $payment->user_info
: array();
$change_text = edd_is_add_order_page()
? esc_html__( 'Assign', 'easy-digital-downloads' )
: esc_html__( 'Switch Customer', 'easy-digital-downloads' );
$customer_id = ! empty( $customer )
? $customer->id
: 0; ?>
<div>
<div class="column-container order-customer-info">
<div class="column-container change-customer">
<div class="edd-form-group">
<label for="customer_id" class="edd-form-group__label"><?php esc_html_e( 'Assign to an existing customer', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control">
<?php
echo EDD()->html->customer_dropdown(
array(
'class' => 'edd-payment-change-customer-input edd-form-group__input',
'selected' => $customer_id,
'id' => 'customer-id',
'name' => 'customer-id',
'none_selected' => esc_html__( 'Search for a customer', 'easy-digital-downloads' ),
'placeholder' => esc_html__( 'Search for a customer', 'easy-digital-downloads' ),
)
); // WPCS: XSS ok.
?>
</div>
</div>
<input type="hidden" name="current-customer-id" value="<?php echo esc_attr( $customer_id ); ?>" />
<?php wp_nonce_field( 'edd_customer_details_nonce', 'edd_customer_details_nonce' ); ?>
</div>
<div class="customer-details-wrap" style="display: <?php echo esc_attr( ! empty( $customer ) ? 'flex' : 'none' ); ?>">
<div class="avatar-wrap" id="customer-avatar">
<span class="spinner is-active"></span>
</div>
<div class="customer-details" style="display: none;">
<strong class="customer-name"></strong>
<em class="customer-since">
<?php
echo wp_kses(
sprintf(
__( 'Customer since %s', 'easy-digital-downloads' ), '<span>&hellip;</span>' ),
array(
'span' => true,
)
);
?>
</em>
<span class="customer-record">
<a href="<?php echo esc_url( edd_get_admin_url( array( 'page' => 'edd-customers' ) ) ); ?>"><?php esc_html_e( 'View customer record', 'easy-digital-downloads' ); ?></a>
</span>
</div>
</div>
<p class="description">
or <button class="edd-payment-new-customer button-link"><?php esc_html_e( 'create a new customer', 'easy-digital-downloads' ); ?></button>
</p>
</div>
<div class="column-container new-customer" style="display: none">
<p style="margin-top: 0;">
<input type="hidden" id="edd-new-customer" name="edd-new-customer" value="0" />
<button class="edd-payment-new-customer-cancel button-link"><?php esc_html_e( '&larr; Use an existing customer', 'easy-digital-downloads' ); ?></button>
</p>
<div class="edd-form-group">
<label class="edd-form-group__label" for="edd_new_customer_first_name">
<?php esc_html_e( 'First Name', 'easy-digital-downloads' ); ?>
</label>
<div class="edd-form-group__control">
<input type="text" id="edd_new_customer_first_name" name="edd-new-customer-first-name" value="" class="edd-form-group__input regular-text" />
</div>
</div>
<div class="edd-form-group">
<label class="edd-form-group__label" for="edd_new_customer_last_name">
<?php esc_html_e( 'Last Name', 'easy-digital-downloads' ); ?>
</label>
<div class="edd-form-group__control">
<input type="text" id="edd_new_customer_last_name" name="edd-new-customer-last-name" value="" class="edd-form-group__input regular-text" />
</div>
</div>
<div class="edd-form-group">
<label class="edd-form-group__label" for="edd_new_customer_email">
<?php esc_html_e( 'Email', 'easy-digital-downloads' ); ?>
</label>
<div class="edd-form-group__control">
<input type="email" id="edd_new_customer_email" name="edd-new-customer-email" value="" class="edd-form-group__input regular-text" />
</div>
</div>
</div>
</div>
<?php
// The edd_payment_personal_details_list hook is left here for backwards compatibility
if ( ! edd_is_add_order_page() && $payment instanceof EDD_Payment ) {
do_action( 'edd_payment_personal_details_list', $payment->get_meta(), $user_info );
}
do_action( 'edd_payment_view_details', $order->id );
}
/**
* Output the order details email section
*
* @since 3.0
*
* @param object $order
*/
function edd_order_details_email( $order ) {
$customer = edd_get_customer( $order->customer_id );
$all_emails = array( 'primary' => $customer->email );
if ( $customer->email !== $order->email ) {
$all_emails['order'] = $order->email;
}
foreach ( $customer->emails as $key => $email ) {
if ( $customer->email === $email ) {
continue;
}
$all_emails[ $key ] = $email;
}
$help = sprintf(
/* translators: email type */
__('Send a new copy of the purchase receipt to the %s email address. If download URLs were included in the original receipt, new ones will be included.', 'easy-digital-downloads' ),
count( $all_emails ) > 1 ? __( 'selected', 'easy-digital-downloads' ) : __( 'customer', 'easy-digital-downloads' )
);
$is_multiselect = count( $all_emails ) > 1;
$label_text = $is_multiselect ? __( 'Send email receipt to', 'easy-digital-downloads' ) : __( 'Email Address', 'easy-digital-downloads' );
?>
<div>
<div class="edd-form-group">
<label class="edd-form-group__label <?php echo esc_attr( ! $is_multiselect ? 'screen-reader-text' : '' ); ?>"
for="edd-order-receipt-email"
>
<?php echo esc_html( $label_text ); ?>
</label>
<div class="edd-form-group__control">
<?php if ( $is_multiselect ) : ?>
<select class="edd-form-group__input edd-order-resend-receipt-email" name="edd-select-receipt-email" id="edd-order-receipt-email">
<?php foreach ( $all_emails as $key => $email ) : ?>
<option
value="<?php echo rawurlencode( sanitize_email( $email ) ); ?>"
<?php selected( 'primary', $key ); ?>
>
<?php
echo sprintf(
'%1$s (%2$s)',
esc_attr( $email ),
esc_html(
$key === 'primary' ? __( 'Customer Primary', 'easy-digital-downloads' ) :
(
$key === 'order' ? __( 'Order Email', 'easy-digital-downloads' ) :
__( 'Customer Email', 'easy-digital-downloads' )
)
)
);
?>
</option>
<?php endforeach; ?>
</select>
<?php else : ?>
<input readonly type="email" id="edd-order-receipt-email" class="edd-form-group__input regular-text" value="<?php echo esc_attr( $order->email ); ?>" />
<?php endif; ?>
</div>
<p class="edd-form-group__help description">
<?php echo esc_html( $help ); ?>
</p>
</div>
<p>
<a href="<?php echo esc_url( add_query_arg( array(
'edd-action' => 'email_links',
'purchase_id' => absint( $order->id ),
) ) ); ?>" id="<?php echo esc_attr( 'edd-resend-receipt' ); ?>" class="button button-secondary"><?php esc_html_e( 'Resend Receipt', 'easy-digital-downloads' ); ?></a>
</p>
<?php do_action( 'edd_view_order_details_resend_receipt_after', $order->id ); ?>
</div>
<?php
}
/**
* Output the order details addresses section
*
* @since 3.0
*
* @param object $order
*/
function edd_order_details_addresses( $order ) {
$address = edd_is_add_order_page()
? (object) array(
'id' => 0,
'order_id' => 0,
'first_name' => '',
'last_name' => '',
'address' => '',
'address2' => '',
'city' => '',
'region' => '',
'postal_code' => '',
'country' => '',
)
: $order->get_address(); ?>
<div id="edd-order-address">
<?php do_action( 'edd_view_order_details_billing_before', $order->id ); ?>
<div class="order-data-address">
<h3><?php esc_html_e( 'Billing Address', 'easy-digital-downloads' ); ?></h3>
<div class="customer-address-select-wrap edd-form-group" style="display: none; padding: 16px 0; border-bottom: 1px solid #ccd0d4;">
<label for="edd_customer_existing_addresses" class="edd-form-group__label"><?php esc_html_e( 'Existing Address:', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control"></div>
</div>
<div class="edd-form-group">
<label for="edd_order_address_address" class="edd-form-group__label"><?php esc_html_e( 'Line 1:', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control">
<input type="text" name="edd_order_address[address]" id="edd_order_address_address" class="edd-form-group__input regular-text" value="<?php echo esc_attr( $address->address ); ?>" />
</div>
</div>
<div class="edd-form-group">
<label for="edd_order_address_address2" class="edd-form-group__label"><?php esc_html_e( 'Line 2:', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control">
<input type="text" name="edd_order_address[address2]" class="edd-form-group__input regular-text" id="edd_order_address_address2" value="<?php echo esc_attr( $address->address2 ); ?>" />
</div>
</div>
<div class="edd-form-group">
<label for="edd_order_address_city" class="edd-form-group__label"><?php echo esc_html_x( 'City:', 'Address City', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control">
<input type="text" name="edd_order_address[city]" class="edd-form-group__input regular-text" id="edd_order_address_city" value="<?php echo esc_attr( $address->city ); ?>" />
</div>
</div>
<div class="edd-form-group">
<label for="edd_order_address_postal_code" class="edd-form-group__label"><?php echo esc_html_x( 'Zip / Postal Code:', 'Zip / Postal code of address', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control">
<input type="text" name="edd_order_address[postal_code]" class="edd-form-group__input regular-text" id="edd_order_address_postal_code" value="<?php echo esc_attr( $address->postal_code ); ?>" class="med-text" />
</div>
</div>
<div class="edd-form-group">
<label for="edd_order_address_country" class="edd-form-group__label"><?php echo esc_html_x( 'Country:', 'Address country', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control" id="edd-order-address-country-wrap">
<?php
echo EDD()->html->country_select(
array(
'name' => 'edd_order_address[country]',
'id' => 'edd-order-address-country',
'class' => 'edd-order-address-country edd-form-group__input',
'show_option_all' => false,
'data' => array(
'nonce' => wp_create_nonce( 'edd-country-field-nonce' ),
'search-type' => 'no_ajax',
'search-placeholder' => esc_html__( 'Search Countries', 'easy-digital-downloads' ),
),
),
$address->country
); // WPCS: XSS ok.
?>
</div>
</div>
<div class="edd-form-group">
<label for="edd_order_address_region" class="edd-form-group__label"><?php echo esc_html_x( 'Region:', 'Region of address', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control" id="edd-order-address-state-wrap">
<?php
$states = edd_get_shop_states( $address->country );
if ( ! empty( $states ) ) {
echo EDD()->html->region_select(
array(
'name' => 'edd_order_address[region]',
'id' => 'edd_order_address_region',
'class' => 'edd-order-address-region edd-form-group__input',
'data' => array(
'search-type' => 'no_ajax',
'search-placeholder' => esc_html__( 'Search Regions', 'easy-digital-downloads' ),
),
),
$address->country,
$address->region
); // WPCS: XSS ok.
} else {
?>
<input type="text" id="edd_order_address_region" name="edd_order_address[region]" class="edd-form-group__input" value="<?php echo esc_attr( $address->region ); ?>" />
<?php
}
?>
</div>
</div>
<input type="hidden" name="edd_order_address[address_id]" value="<?php echo esc_attr( $address->id ); ?>" />
<?php wp_nonce_field( 'edd_get_tax_rate_nonce', 'edd_get_tax_rate_nonce' ); ?>
</div>
</div><!-- /#edd-order-address -->
<?php
do_action( 'edd_payment_billing_details', $order->id );
}
/**
* Output the order details notes section
*
* @since 3.0
*
* @param object $order
*/
function edd_order_details_notes( $order ) {
$notes = edd_get_payment_notes( $order->id ); ?>
<div>
<?php echo edd_admin_get_notes_html( $notes ); // WPCS: XSS ok. ?>
<?php echo edd_admin_get_new_note_form( $order->id, 'order' ); // WPCS: XSS ok. ?>
</div>
<?php
}
/**
* Outputs the Order Details logs section.
*
* @since 3.0
*
* @param \EDD\Orders\Order $order
*/
function edd_order_details_logs( $order ) {
?>
<div>
<?php
/**
* Allows output before the list of logs.
*
* @since 3.0.0
*
* @param int $order_id ID of the current order.
*/
do_action( 'edd_view_order_details_logs_before', $order->id );
$download_log_url = edd_get_admin_url(
array(
'page' => 'edd-tools',
'tab' => 'logs',
'payment' => absint( $order->id ),
)
);
$customer_log_url = edd_get_admin_url(
array(
'page' => 'edd-tools',
'tab' => 'logs',
'customer' => absint( $order->customer_id ),
)
);
$customer_orders_url = edd_get_admin_url(
array(
'page' => 'edd-payment-history',
'customer' => absint( $order->customer_id ),
)
);
?>
<p><a href="<?php echo esc_url( $download_log_url ); ?>"><?php esc_html_e( 'File Download Log for Order', 'easy-digital-downloads' ); ?></a></p>
<p><a href="<?php echo esc_url( $customer_log_url ); ?>"><?php esc_html_e( 'Customer Download Log', 'easy-digital-downloads' ); ?></a></p>
<p><a href="<?php echo esc_url( $customer_orders_url ); ?>"><?php esc_html_e( 'Customer Orders', 'easy-digital-downloads' ); ?></a></p>
<?php
/**
* Allows further output after the list of logs.
*
* @since 3.0.0
*
* @param int $order_id ID of the current order.
*/
do_action( 'edd_view_order_details_logs_after', $order->id );
?>
</div>
<?php
}
/** Main **********************************************************************/
/**
* Output the order details items box
*
* @since 3.0
*
* @param object $order
*/
function edd_order_details_overview( $order ) {
$_items = array();
$_adjustments = array();
$_refunds = array();
if ( true !== edd_is_add_order_page() ) {
$items = edd_get_order_items( array(
'order_id' => $order->id,
'number' => 999,
) );
foreach ( $items as $item ) {
$item_adjustments = array();
$adjustments = edd_get_order_adjustments( array(
'object_id' => $item->id,
'number' => 999,
'object_type' => 'order_item',
'type' => array(
'discount',
'credit',
'fee',
),
) );
foreach ( $adjustments as $adjustment ) {
// @todo edd_get_order_adjustment_to_json()?
$adjustment_args = array(
'id' => esc_html( $adjustment->id ),
'objectId' => esc_html( $adjustment->object_id ),
'objectType' => esc_html( $adjustment->object_type ),
'typeId' => esc_html( $adjustment->type_id ),
'type' => esc_html( $adjustment->type ),
'description' => esc_html( $adjustment->description ),
'subtotal' => esc_html( $adjustment->subtotal ),
'tax' => esc_html( $adjustment->tax ),
'total' => esc_html( $adjustment->total ),
'dateCreated' => esc_html( $adjustment->date_created ),
'dateModified' => esc_html( $adjustment->date_modified ),
'uuid' => esc_html( $adjustment->uuid ),
);
$item_adjustments[] = $adjustment_args;
$_adjustments[] = $adjustment_args;
}
// @todo edd_get_order_item_to_json()?
$_items[] = array(
'id' => esc_html( $item->id ),
'orderId' => esc_html( $item->order_id ),
'productId' => esc_html( $item->product_id ),
'productName' => esc_html( $item->get_order_item_name() ),
'priceId' => esc_html( $item->price_id ),
'cartIndex' => esc_html( $item->cart_index ),
'type' => esc_html( $item->type ),
'status' => esc_html( $item->status ),
'statusLabel' => esc_html( edd_get_status_label( $item->status ) ),
'quantity' => esc_html( $item->quantity ),
'amount' => esc_html( $item->amount ),
'subtotal' => esc_html( $item->subtotal ),
'discount' => esc_html( $item->discount ),
'tax' => esc_html( $item->tax ),
'total' => esc_html( $item->total ),
'dateCreated' => esc_html( $item->date_created ),
'dateModified' => esc_html( $item->date_modified ),
'uuid' => esc_html( $item->uuid ),
'deliverable' => $item->is_deliverable(),
'adjustments' => $item_adjustments,
);
}
$adjustments = edd_get_order_adjustments( array(
'object_id' => $order->id,
'number' => 999,
'object_type' => 'order',
'type' => array(
'discount',
'credit',
'fee',
),
) );
foreach ( $adjustments as $adjustment ) {
// @todo edd_get_order_adjustment_to_json()?
$_adjustments[] = array(
'id' => esc_html( $adjustment->id ),
'objectId' => esc_html( $adjustment->object_id ),
'objectType' => esc_html( $adjustment->object_type ),
'typeId' => esc_html( $adjustment->type_id ),
'type' => esc_html( $adjustment->type ),
'description' => esc_html( $adjustment->description ),
'subtotal' => esc_html( $adjustment->subtotal ),
'tax' => esc_html( $adjustment->tax ),
'total' => esc_html( $adjustment->total ),
'dateCreated' => esc_html( $adjustment->date_created ),
'dateModified' => esc_html( $adjustment->date_modified ),
'uuid' => esc_html( $adjustment->uuid ),
);
}
$refunds = edd_get_order_refunds( $order->id );
foreach ( $refunds as $refund ) {
$_refunds[] = array(
'id' => esc_html( $refund->id ),
'number' => esc_html( $refund->order_number ),
'total' => esc_html( $refund->total ),
'dateCreated' => esc_html( $refund->date_created ),
'dateCreatedi18n' => esc_html( edd_date_i18n( $refund->date_created ) ),
'uuid' => esc_html( $refund->uuid ),
);
}
}
$has_tax = 'none';
$tax_rate = $order->id ? $order->get_tax_rate() : false;
$location = array(
'rate' => $tax_rate,
'country' => '',
'region' => '',
'inclusive' => edd_prices_include_tax(),
);
if ( edd_is_add_order_page() && edd_use_taxes() ) {
$default_rate = edd_get_tax_rate_by_location(
array(
'country' => '',
'region' => '',
)
);
if ( $default_rate ) {
$location['rate'] = floatval( $default_rate->amount );
}
$has_tax = $location;
} elseif ( $tax_rate ) {
$has_tax = $location;
$has_tax['rate'] = $tax_rate;
if ( $order->tax_rate_id ) {
$tax_rate_object = $order->get_tax_rate_object();
if ( $tax_rate_object ) {
$has_tax['country'] = $tax_rate_object->name;
$has_tax['region'] = $tax_rate_object->description;
}
}
}
$has_quantity = true;
if ( edd_is_add_order_page() && ! edd_item_quantities_enabled() ) {
$has_quantity = false;
}
wp_localize_script(
'edd-admin-orders',
'eddAdminOrderOverview',
array(
'items' => $_items,
'adjustments' => $_adjustments,
'refunds' => $_refunds,
'isAdding' => true === edd_is_add_order_page(),
'hasQuantity' => $has_quantity,
'hasTax' => $has_tax,
'hasDiscounts' => true === edd_has_active_discounts(),
'order' => array(
'status' => $order->status,
'currency' => $order->currency,
'currencySymbol' => html_entity_decode( edd_currency_symbol( $order->currency ) ),
'subtotal' => $order->subtotal,
'discount' => $order->discount,
'tax' => $order->tax,
'total' => $order->total,
),
'nonces' => array(
'edd_admin_order_get_item_amounts' => wp_create_nonce( 'edd_admin_order_get_item_amounts' ),
),
'i18n' => array(
'closeText' => esc_html__( 'Close', 'easy-digital-downloads' ),
),
)
);
$templates = array(
'actions',
'subtotal',
'tax',
'total',
'item',
'adjustment',
'adjustment-discount',
'refund',
'no-items',
'copy-download-link',
'form-add-order-item',
'form-add-order-discount',
'form-add-order-adjustment',
);
foreach ( $templates as $tmpl ) {
echo '<script type="text/html" id="tmpl-edd-admin-order-' . esc_attr( $tmpl ) . '">';
require_once EDD_PLUGIN_DIR . 'includes/admin/views/tmpl-order-' . $tmpl . '.php';
echo '</script>';
}
?>
<div id="edd-order-overview" class="postbox edd-edit-purchase-element edd-order-overview">
<table id="edd-order-overview-summary" class="widefat wp-list-table edd-order-overview-summary">
<thead>
<tr>
<th class="column-name column-primary"><?php echo esc_html( edd_get_label_singular() ); ?></th>
<th class="column-amount"><?php esc_html_e( 'Unit Price', 'easy-digital-downloads' ); ?></th>
<?php if ( $has_quantity ) : ?>
<th class="column-quantity"><?php esc_html_e( 'Quantity', 'easy-digital-downloads' ); ?></th>
<?php endif; ?>
<th class="column-subtotal column-right"><?php esc_html_e( 'Amount', 'easy-digital-downloads' ); ?></th>
</tr>
</thead>
</table>
<div id="edd-order-overview-actions" class="edd-order-overview-actions inside"></div>
</div>
<?php
/**
* @since unknown
*/
do_action( 'edd_view_order_details_files_after', $order->id );
}
/**
* Output the order details sections box
*
* @since 3.0
*
* @param object $order
*/
function edd_order_details_sections( $order ) {
?>
<div id="edd-customer-details" class="postbox">
<h2 class="hndle">
<span><?php esc_html_e( 'Order Details', 'easy-digital-downloads' ); ?></span>
</h2>
<?php edd_order_sections( $order ); ?>
</div>
<?php
}
/** Sidebar *******************************************************************/
/**
* Output the order details extras box
*
* @since 3.0
*
* @param object $order
*/
function edd_order_details_extras( $order = false ) {
$transaction_id = ! empty( $order->id )
? $order->get_transaction_id()
: '';
$unlimited = ! empty( $order->id )
? $order->has_unlimited_downloads()
: false;
$readonly = ! empty( $order->id )
? 'readonly'
: '';
// Setup gateway list.
if ( empty( $order->id ) ) {
$known_gateways = edd_get_payment_gateways();
$gateways = array();
foreach ( $known_gateways as $id => $data ) {
$gateways[ $id ] = esc_html( $data['admin_label'] );
}
}
// Filter the transaction ID (here specifically for back-compat)
if ( ! empty( $transaction_id ) ) {
$transaction_id = apply_filters( 'edd_payment_details_transaction_id-' . $order->gateway, $transaction_id, $order->id );
} ?>
<div id="edd-order-extras" class="postbox edd-order-data">
<h2 class="hndle">
<span><?php esc_html_e( 'Order Extras', 'easy-digital-downloads' ); ?></span>
</h2>
<div class="inside">
<div class="edd-admin-box">
<?php do_action( 'edd_view_order_details_payment_meta_before', $order->id ); ?>
<?php if ( ! edd_is_add_order_page() ) : ?>
<div class="edd-order-gateway edd-admin-box-inside edd-admin-box-inside--row">
<span class="label"><?php esc_html_e( 'Gateway', 'easy-digital-downloads' ); ?></span>
<span class="value"><?php echo edd_get_gateway_admin_label( $order->gateway ); ?></span>
</div>
<?php else : ?>
<div class="edd-order-gateway edd-admin-box-inside">
<div class="edd-form-group">
<label for="edd_gateway_select" class="edd-form-group__label"><?php esc_html_e( 'Gateway', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control">
<?php
echo EDD()->html->select(
array(
'name' => 'gateway',
'class' => 'edd-form-group__input',
'id' => 'edd_gateway_select',
'options' => $gateways,
'selected' => 'manual',
'show_option_none' => false,
'show_option_all' => false,
)
); // WPCS: XSS ok.
?>
</div>
</div>
</div>
<?php endif; ?>
<div class="edd-admin-box-inside">
<div class="edd-form-group">
<label for="edd_payment_key" class="edd-form-group__label"><?php esc_html_e( 'Key', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control">
<input type="text" name="payment_key" id="edd_payment_key" class="edd-form-group__input regular-text" <?php echo esc_attr( $readonly ); ?> value="<?php echo esc_attr( $order->payment_key ); ?>" />
</div>
</div>
</div>
<?php if ( edd_is_add_order_page() ) : ?>
<div class="edd-order-ip edd-admin-box-inside">
<div class="edd-form-group">
<label for="edd_ip" class="edd-form-group__label"><?php esc_html_e( 'IP', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control">
<input type="text" name="ip" id="edd_ip" class="edd-form-group__input" value="<?php echo esc_attr( edd_get_ip() ); ?>" />
</div>
</div>
</div>
<?php else : ?>
<div class="edd-order-gateway edd-admin-box-inside edd-admin-box-inside--row">
<span class="label"><?php esc_html_e( 'IP', 'easy-digital-downloads' ); ?></span>
<span class="value"><?php echo edd_payment_get_ip_address_url( $order->id ); // WPCS: XSS ok. ?></span>
</div>
<?php endif; ?>
<?php if ( $transaction_id ) : ?>
<div class="edd-order-tx-id edd-admin-box-inside edd-admin-box-inside--row">
<span class="label"><?php esc_html_e( 'Transaction ID', 'easy-digital-downloads' ); ?></span>
<span><?php echo $transaction_id; ?></span>
</div>
<?php endif; ?>
<?php if ( edd_is_add_order_page() ) : ?>
<div class="edd-order-tx-id edd-admin-box-inside edd-admin-box-inside--row">
<div class="edd-form-group">
<label for="edd_transaction_id" class="edd-form-group__label"><?php esc_html_e( 'Transaction ID', 'easy-digital-downloads' ); ?></label>
<div class="edd-form-group__control">
<input type="text" name="transaction_id" class="edd-form-group__input" id="edd_transaction_id" value="" />
</div>
</div>
</div>
<?php endif; ?>
<div class="edd-unlimited-downloads edd-admin-box-inside">
<div class="edd-form-group">
<div class="edd-form-group__control">
<input type="checkbox" name="edd-unlimited-downloads" id="edd_unlimited_downloads" class="edd-form-group__input" value="1"<?php checked( true, $unlimited, true ); ?>/>
<label for="edd_unlimited_downloads">
<?php esc_html_e( 'Unlimited Downloads', 'easy-digital-downloads' ); ?></label>
<span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<?php esc_attr_e( 'Checking this box will override all other file download limits for this purchase, granting the customer unlimited downloads of all files included on the purchase.', 'easy-digital-downloads' ); ?>"></span>
</div>
</div>
</div>
<?php do_action( 'edd_view_order_details_payment_meta_after', $order->id ); ?>
</div>
</div>
</div>
<?php
}
/**
* Output the order details attributes box
*
* @since 3.0
*
* @param object $order
*/
function edd_order_details_attributes( $order ) {
$recovery_url = edd_is_add_order_page()
? ''
: edd_get_payment( $order->id )->get_recovery_url();
$order_date = edd_get_edd_timezone_equivalent_date_from_utc( EDD()->utils->date( $order->date_created, 'utc', true ) );
?>
<div id="edd-order-update" class="postbox edd-order-data">
<h2 class="hndle">
<span><?php esc_html_e( 'Order Attributes', 'easy-digital-downloads' ); ?></span>
</h2>
<div class="inside">
<div class="edd-order-update-box edd-admin-box">
<div class="edd-admin-box-inside">
<div class="edd-form-group">
<label for="edd_payment_status" class="edd-form-group__label">
<?php
esc_html_e( 'Status', 'easy-digital-downloads' );
$status_help = '<ul>';
$status_help .= '<li>' . __( '<strong>Pending</strong>: order is still processing or was abandoned by customer. Successful orders will be marked as Complete automatically once processing is finalized.', 'easy-digital-downloads' ) . '</li>';
$status_help .= '<li>' . __( '<strong>Complete</strong>: all processing is completed for this purchase.', 'easy-digital-downloads' ) . '</li>';
$status_help .= '<li>' . __( '<strong>Revoked</strong>: access to purchased items is disabled, perhaps due to policy violation or fraud.', 'easy-digital-downloads' ) . '</li>';
$status_help .= '<li>' . __( '<strong>Refunded</strong>: the purchase amount is returned to the customer and access to items is disabled.', 'easy-digital-downloads' ) . '</li>';
$status_help .= '<li>' . __( '<strong>Abandoned</strong>: the purchase attempt was not completed by the customer.', 'easy-digital-downloads' ) . '</li>';
$status_help .= '<li>' . __( '<strong>Failed</strong>: customer clicked Cancel before completing the purchase.', 'easy-digital-downloads' ) . '</li>';
$status_help .= '</ul>';
?>
<span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<?php echo $status_help; // WPCS: XSS ok. ?>"></span>
</label>
<div class="edd-form-group__control">
<select name="edd-payment-status" id="edd_payment_status" class="edd-form-group__input">
<?php foreach ( edd_get_payment_statuses() as $key => $status ) : ?>
<option value="<?php echo esc_attr( $key ); ?>"<?php selected( $order->status, $key, true ); ?>><?php echo esc_html( $status ); ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<?php
if ( ! edd_is_add_order_page() ) :
$trash_url = wp_nonce_url(
edd_get_admin_url( array(
'page' => 'edd-payment-history',
'order_type' => 'sale',
'edd-action' => 'trash_order',
'purchase_id' => absint( $order->id ),
) ),
'edd_payment_nonce'
);
?>
<div style="margin-top: 8px;">
<a href="<?php echo esc_url( $trash_url ); ?>" class="edd-delete-payment edd-delete">
<?php esc_html_e( 'Move to Trash', 'easy-digital-downloads' ); ?>
</a>
</div>
<?php endif; ?>
</div>
<?php if ( ! edd_is_add_order_page() && edd_is_order_recoverable( $order->id ) && ! empty( $recovery_url ) ) : ?>
<div class="edd-admin-box-inside">
<div class="edd-form-group">
<label class="edd-form-group__label" for="edd_recovery_url">
<?php esc_html_e( 'Recover', 'easy-digital-downloads' ); ?>
<span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<?php esc_html_e( 'Pending and abandoned payments can be resumed by the customer, using this custom URL. Payments can be resumed only when they do not have a transaction ID from the gateway.', 'easy-digital-downloads' ); ?>"></span>
</label>
<div class="edd-form-group__control">
<input type="text" class="edd-form-group__input" id="edd_recovery_url" readonly="readonly" value="<?php echo esc_url( $recovery_url ); ?>"/>
</div>
</div>
</div>
<?php endif; ?>
<div class="edd-admin-box-inside">
<div class="edd-form-group">
<label for="edd-payment-date" class="edd-form-group__label"><?php esc_html_e( 'Date', 'easy-digital-downloads' ); ?>
</label>
<div class="edd-form-group__control">
<input type="text" id="edd-payment-date" class="edd-form-group__input edd_datepicker" name="edd-payment-date" value="<?php echo esc_attr( $order_date->format( 'Y-m-d' ) ); ?>"placeholder="<?php echo esc_attr( edd_get_date_picker_format() ); ?>"/>
</div>
</div>
</div>
<div class="edd-admin-box-inside">
<fieldset class="edd-form-group">
<legend class="edd-form-group__label">
<?php echo esc_html( __( 'Time', 'easy-digital-downloads' ) . ' (' . edd_get_timezone_abbr() . ')' ); ?>
</legend>
<div class="edd-form-group__control">
<label for="edd-payment-time-hour" class="screen-reader-text">
<?php esc_html_e( 'Hour', 'easy-digital-downloads' ); ?>
</label>
<input type="number" class="edd-form-group__input small-text" min="0" max="24" step="1" name="edd-payment-time-hour" id="edd-payment-time-hour" value="<?php echo esc_attr( $order_date->format( 'H' ) ); ?>" />
:
<label for="edd-payment-time-min" class="screen-reader-text">
<?php esc_html_e( 'Minute', 'easy-digital-downloads' ); ?>
</label>
<input type="number" class="edd-form-group__input small-text" min="0" max="59" step="1" name="edd-payment-time-min" id="edd-payment-time-min" value="<?php echo esc_attr( $order_date->format( 'i' ) ); ?>" />
</div>
</fieldset>
</div>
<?php do_action( 'edd_view_order_details_update_inner', $order->id ); ?>
</div><!-- /.edd-admin-box -->
</div><!-- /.inside -->
</div>
<?php
}
/**
* Check if we are on the `Add New Order` page, or editing an existing one.
*
* @since 3.0
*
* @return boolean True if on the `Add Order` page, false otherwise.
*/
function edd_is_add_order_page() {
return isset( $_GET['view'] ) && 'add-order' === sanitize_key( $_GET['view'] ); // WPCS: CSRF ok.
}
/**
* Returns markup for an Order status badge.
*
* @since 3.0
*
* @param string $order_status Order status slug.
* @return string
*/
function edd_get_order_status_badge( $order_status ) {
$icon = '';
$status = $order_status;
switch ( $order_status ) {
case 'refunded':
$icon = 'undo';
break;
case 'failed':
$icon = 'no-alt';
$status = 'error';
break;
case 'complete':
case 'partially_refunded':
$icon = 'yes';
$status = 'success';
break;
case 'pending':
$status = 'warning';
break;
}
/**
* Filters the arguments for the order status badge.
*
* @since 3.1.4
* @param array $status_badge_args Array of arguments for the status badge.
* @param string $order_status Order status slug.
*/
$status_badge_args = apply_filters(
'edd_get_order_status_badge_args',
array(
'status' => $status,
'label' => edd_get_payment_status_label( $order_status ),
'icon' => $icon,
'class' => "edd-admin-order-status-badge--{$order_status}",
),
$order_status
);
$status_badge = new EDD\Utils\StatusBadge( $status_badge_args );
/**
* Filters the markup for the order status badge icon.
*
* @since 3.0
*
* @param string $icon Icon HTML markup.
*/
$icon = apply_filters( 'edd_get_order_status_badge_icon', $status_badge->get_icon(), $order_status );
return $status_badge->get( $icon );
}