259 lines
5.6 KiB
PHP
259 lines
5.6 KiB
PHP
<?php
|
|
/**
|
|
* Recount store earnings
|
|
*
|
|
* This class handles batch processing of recounting earnings
|
|
*
|
|
* @subpackage Admin/Tools/EDD_Tools_Recount_Store_Earnings
|
|
* @copyright Copyright (c) 2015, Chris Klosowski
|
|
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
|
|
* @since 2.5
|
|
*/
|
|
|
|
// Exit if accessed directly
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* EDD_Tools_Recount_Store_Earnings Class
|
|
*
|
|
* @since 2.5
|
|
*/
|
|
class EDD_Tools_Recount_Store_Earnings extends EDD_Batch_Export {
|
|
|
|
/**
|
|
* Our export type. Used for export-type specific filters/actions
|
|
* @var string
|
|
* @since 2.5
|
|
*/
|
|
public $export_type = '';
|
|
|
|
/**
|
|
* Allows for a non-download batch processing to be run.
|
|
* @since 2.5
|
|
* @var boolean
|
|
*/
|
|
public $is_void = true;
|
|
|
|
/**
|
|
* Sets the number of items to pull on each step
|
|
* @since 2.5
|
|
* @var integer
|
|
*/
|
|
public $per_step = 100;
|
|
|
|
/**
|
|
* Get the Export Data
|
|
*
|
|
* @since 2.5
|
|
* @global object $wpdb Used to query the database using the WordPress
|
|
* Database API
|
|
* @return bool True if results were found, false if not.
|
|
*/
|
|
public function get_data() {
|
|
|
|
if ( $this->step == 1 ) {
|
|
$this->delete_data( 'edd_temp_recount_earnings' );
|
|
}
|
|
|
|
$total = get_option( 'edd_temp_recount_earnings', false );
|
|
|
|
if ( false === $total ) {
|
|
$total = (float) 0;
|
|
$this->store_data( 'edd_temp_recount_earnings', $total );
|
|
}
|
|
|
|
$accepted_statuses = apply_filters( 'edd_recount_accepted_statuses', edd_get_gross_order_statuses() );
|
|
|
|
$args = apply_filters(
|
|
'edd_recount_earnings_args',
|
|
array(
|
|
'number' => $this->per_step,
|
|
'offset' => $this->per_step * ( $this->step - 1 ),
|
|
'status' => $accepted_statuses,
|
|
'fields' => 'total',
|
|
'no_found_rows' => true,
|
|
'type' => array( 'sale', 'refund' ),
|
|
)
|
|
);
|
|
|
|
$orders = edd_get_orders( $args );
|
|
|
|
if ( ! empty( $orders ) ) {
|
|
$total += array_sum( $orders );
|
|
|
|
if ( $total < 0 ) {
|
|
$total = 0;
|
|
}
|
|
|
|
$total = round( $total, edd_currency_decimal_filter() );
|
|
|
|
$this->store_data( 'edd_temp_recount_earnings', $total );
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
update_option( 'edd_earnings_total', $total, false );
|
|
set_transient( 'edd_earnings_total', $total, 86400 );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
/**
|
|
* Return the calculated completion percentage
|
|
*
|
|
* @since 2.5
|
|
* @return int
|
|
*/
|
|
public function get_percentage_complete() {
|
|
|
|
$total = $this->get_stored_data( 'edd_recount_earnings_total' );
|
|
|
|
if ( false === $total ) {
|
|
$accepted_statuses = apply_filters( 'edd_recount_accepted_statuses', edd_get_gross_order_statuses() );
|
|
$args = apply_filters(
|
|
'edd_recount_earnings_total_args',
|
|
array(
|
|
'status' => $accepted_statuses,
|
|
'type' => array( 'sale', 'refund' ),
|
|
)
|
|
);
|
|
$total = apply_filters( 'edd_recount_store_earnings_total', edd_count_orders( $args ) );
|
|
|
|
$this->store_data( 'edd_recount_earnings_total', $total );
|
|
}
|
|
|
|
$percentage = 100;
|
|
|
|
if ( $total > 0 ) {
|
|
$percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
|
|
}
|
|
|
|
if ( $percentage > 100 ) {
|
|
$percentage = 100;
|
|
}
|
|
|
|
return $percentage;
|
|
}
|
|
|
|
/**
|
|
* Set the properties specific to the payments export
|
|
*
|
|
* @since 2.5
|
|
* @param array $request The Form Data passed into the batch processing
|
|
*/
|
|
public function set_properties( $request ) {}
|
|
|
|
/**
|
|
* Process a step
|
|
*
|
|
* @since 2.5
|
|
* @return bool
|
|
*/
|
|
public function process_step() {
|
|
|
|
if ( ! $this->can_export() ) {
|
|
wp_die( __( 'You do not have permission to export data.', 'easy-digital-downloads' ), __( 'Error', 'easy-digital-downloads' ), array( 'response' => 403 ) );
|
|
}
|
|
|
|
$had_data = $this->get_data();
|
|
|
|
if( $had_data ) {
|
|
$this->done = false;
|
|
return true;
|
|
} else {
|
|
delete_transient( 'edd_stats_earnings' );
|
|
delete_transient( 'edd_stats_sales' );
|
|
delete_transient( 'edd_estimated_monthly_stats' . true );
|
|
delete_transient( 'edd_estimated_monthly_stats' . false );
|
|
|
|
$this->delete_data( 'edd_recount_earnings_total' );
|
|
$this->delete_data( 'edd_temp_recount_earnings' );
|
|
$this->done = true;
|
|
$this->message = __( 'Store earnings successfully recounted.', 'easy-digital-downloads' );
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public function headers() {
|
|
edd_set_time_limit();
|
|
}
|
|
|
|
/**
|
|
* Perform the export
|
|
*
|
|
* @since 2.5
|
|
* @return void
|
|
*/
|
|
public function export() {
|
|
|
|
// Set headers
|
|
$this->headers();
|
|
|
|
edd_die();
|
|
}
|
|
|
|
/**
|
|
* Given a key, get the information from the Database Directly
|
|
*
|
|
* @since 2.5
|
|
* @param string $key The option_name
|
|
* @return mixed Returns the data from the database
|
|
*/
|
|
private function get_stored_data( $key ) {
|
|
global $wpdb;
|
|
$value = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = '%s'", $key ) );
|
|
|
|
if ( empty( $value ) ) {
|
|
return false;
|
|
}
|
|
|
|
$maybe_json = json_decode( $value );
|
|
if ( ! is_null( $maybe_json ) ) {
|
|
$value = json_decode( $value, true );
|
|
}
|
|
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* Give a key, store the value
|
|
*
|
|
* @since 2.5
|
|
* @param string $key The option_name
|
|
* @param mixed $value The value to store
|
|
* @return void
|
|
*/
|
|
private function store_data( $key, $value ) {
|
|
global $wpdb;
|
|
|
|
$value = is_array( $value ) ? wp_json_encode( $value ) : esc_attr( $value );
|
|
|
|
$data = array(
|
|
'option_name' => $key,
|
|
'option_value' => $value,
|
|
'autoload' => 'no',
|
|
);
|
|
|
|
$formats = array(
|
|
'%s', '%s', '%s',
|
|
);
|
|
|
|
$wpdb->replace( $wpdb->options, $data, $formats );
|
|
}
|
|
|
|
/**
|
|
* Delete an option
|
|
*
|
|
* @since 2.5
|
|
* @param string $key The option_name to delete
|
|
* @return void
|
|
*/
|
|
private function delete_data( $key ) {
|
|
global $wpdb;
|
|
$wpdb->delete( $wpdb->options, array( 'option_name' => $key ) );
|
|
}
|
|
|
|
}
|