File: /var/www/html/wpmuhibbah_err/wp-content/plugins/give/includes/payments/class-payment-stats.php
<?php
/**
* Earnings / Sales Stats
*
* @package Give
* @subpackage Classes/Stats
* @copyright Copyright (c) 2016, GiveWP
* @license https://opensource.org/licenses/gpl-license GNU Public License
* @since 1.0
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Give_Stats Class
*
* This class is for retrieving stats for earnings and sales.
*
* Stats can be retrieved for date ranges and pre-defined periods.
*
* @since 1.0
*/
class Give_Payment_Stats extends Give_Stats {
/**
* Retrieve sale stats
*
* @since 1.0
* @access public
*
* @param $form_id int The donation form to retrieve stats for. If false, gets stats for all forms
* @param $start_date string|bool The starting date for which we'd like to filter our sale stats. If false, we'll use the default start date of `this_month`
* @param $end_date string|bool The end date for which we'd like to filter our sale stats. If false, we'll use the default end date of `this_month`
* @param $status string|array The sale status(es) to count. Only valid when retrieving global stats
*
* @return float|int Total amount of donations based on the passed arguments.
*/
public function get_sales( $form_id = 0, $start_date = false, $end_date = false, $status = 'publish' ) {
$this->setup_dates( $start_date, $end_date );
// Make sure start date is valid
if ( is_wp_error( $this->start_date ) ) {
return $this->start_date;
}
// Make sure end date is valid
if ( is_wp_error( $this->end_date ) ) {
return $this->end_date;
}
$args = [
'status' => 'publish',
'start_date' => $this->start_date,
'end_date' => $this->end_date,
'fields' => 'ids',
'number' => - 1,
'output' => '',
];
if ( ! empty( $form_id ) ) {
$args['give_forms'] = $form_id;
}
/* @var Give_Payments_Query $payments */
$payments = new Give_Payments_Query( $args );
$payments = $payments->get_payments();
return count( $payments );
}
/**
* Retrieve earning stats
*
* @since 1.0
* @access public
*
* @param $form_id int The donation form to retrieve stats for. If false, gets stats for all forms.
* @param $start_date string|bool The starting date for which we'd like to filter our donation earnings stats. If false, method will use the default start date of `this_month`.
* @param $end_date string|bool The end date for which we'd like to filter the donations stats. If false, method will use the default end date of `this_month`.
* @param $gateway_id string|bool The gateway to get earnings for such as 'paypal' or 'stripe'.
*
* @return float|int Total amount of donations based on the passed arguments.
*/
public function get_earnings( $form_id = 0, $start_date = false, $end_date = false, $gateway_id = false ) {
global $wpdb;
$this->setup_dates( $start_date, $end_date );
// Make sure start date is valid
if ( is_wp_error( $this->start_date ) ) {
return $this->start_date;
}
// Make sure end date is valid
if ( is_wp_error( $this->end_date ) ) {
return $this->end_date;
}
$args = [
'status' => 'publish',
'start_date' => $this->start_date,
'end_date' => $this->end_date,
'fields' => 'ids',
'number' => - 1,
'output' => '',
];
// Filter by Gateway ID meta_key
if ( $gateway_id ) {
$args['meta_query'][] = [
'key' => '_give_payment_gateway',
'value' => $gateway_id,
];
}
// Filter by Gateway ID meta_key
if ( $form_id ) {
$args['meta_query'][] = [
'key' => '_give_payment_form_id',
'value' => $form_id,
];
}
if ( ! empty( $args['meta_query'] ) && 1 < count( $args['meta_query'] ) ) {
$args['meta_query']['relation'] = 'AND';
}
$args = apply_filters( 'give_stats_earnings_args', $args );
$key = Give_Cache::get_key( 'give_stats', $args );
// Set transient for faster stats.
$earnings = Give_Cache::get( $key );
if ( false === $earnings ) {
$this->timestamp = false;
$payments = new Give_Payments_Query( $args );
$payments = $payments->get_payments();
$earnings = 0;
if ( ! empty( $payments ) ) {
$donation_id_col = Give()->payment_meta->get_meta_type() . '_id';
$query = "SELECT {$donation_id_col} as id, meta_value as total
FROM {$wpdb->donationmeta}
WHERE meta_key='_give_payment_total'
AND {$donation_id_col} IN ('" . implode( '\',\'', $payments ) . "')";
$payments = $wpdb->get_results( $query, ARRAY_A );
if ( ! empty( $payments ) ) {
foreach ( $payments as $payment ) {
$currency_code = give_get_payment_currency_code( $payment['id'] );
/**
* Filter the donation amount
* Note: this filter documented in payments/functions.php:give_donation_amount()
*
* @since 2.1
*/
$formatted_amount = apply_filters(
'give_donation_amount',
give_format_amount( $payment['total'], [ 'donation_id' => $payment['id'] ] ),
$payment['total'],
$payment['id'],
[
'type' => 'stats',
'currency' => false,
'amount' => false,
]
);
$earnings += (float) give_maybe_sanitize_amount( $formatted_amount, [ 'currency' => $currency_code ] );
}
}
}
// Cache the results for one hour.
Give_Cache::set( $key, give_sanitize_amount_for_db( $earnings ), 60 * 60 );
}
/**
* Filter the earnings.
*
* @since 1.8.17
*
* @param float $earnings Earning amount.
* @param int $form_id Donation Form ID.
* @param string|bool $start_date Earning start date.
* @param string|bool $end_date Earning end date.
* @param string|bool $gateway_id Payment gateway id.
*/
$earnings = apply_filters( 'give_get_earnings', $earnings, $form_id, $start_date, $end_date, $gateway_id );
// return earnings
return round( $earnings, give_get_price_decimals( $form_id ) );
}
/**
* Retrieve earning stat transient key
*
* @since 1.0
* @access public
*
* @param $form_id int The donation form to retrieve stats for. If false, gets stats for all forms
* @param $start_date string|bool The starting date for which we'd like to filter our donation earnings stats. If false, we'll use the default start date of `this_month`
* @param $end_date string|bool The end date for which we'd like to filter our sale stats. If false, we'll use the default end date of `this_month`
* @param $gateway_id string|bool The gateway to get earnings for such as 'paypal' or 'stripe'
*
* @return float|int Total amount of donations based on the passed arguments.
*/
public function get_earnings_cache_key( $form_id = 0, $start_date = false, $end_date = false, $gateway_id = false ) {
$this->setup_dates( $start_date, $end_date );
// Make sure start date is valid
if ( is_wp_error( $this->start_date ) ) {
return $this->start_date;
}
// Make sure end date is valid
if ( is_wp_error( $this->end_date ) ) {
return $this->end_date;
}
$args = [
'status' => 'publish',
'start_date' => $this->start_date,
'end_date' => $this->end_date,
'fields' => 'ids',
'number' => - 1,
];
// Filter by Gateway ID meta_key
if ( $gateway_id ) {
$args['meta_query'][] = [
'key' => '_give_payment_gateway',
'value' => $gateway_id,
];
}
// Filter by Gateway ID meta_key
if ( $form_id ) {
$args['meta_query'][] = [
'key' => '_give_payment_form_id',
'value' => $form_id,
];
}
if ( ! empty( $args['meta_query'] ) && 1 < count( $args['meta_query'] ) ) {
$args['meta_query']['relation'] = 'AND';
}
$args = apply_filters( 'give_stats_earnings_args', $args );
$key = Give_Cache::get_key( 'give_stats', $args );
// return earnings
return $key;
}
/**
* Get the best selling forms
*
* @since 1.0
* @since 2.9.6 Added an explicit ORDER BY on which to apply a DESC order.
* @since 2.18.0 Updated sales calculation so that the results are ordered as integers.
* @access public
* @global wpdb $wpdb
*
* @param $number int The number of results to retrieve with the default set to 10.
*
* @return array Best selling forms
*/
public function get_best_selling( $number = 10 ) {
global $wpdb;
$meta_table = __give_v20_bc_table_details( 'form' );
$give_forms = $wpdb->get_results(
$wpdb->prepare(
"SELECT {$meta_table['column']['id']} as form_id, max(ABS(meta_value)) as sales
FROM {$meta_table['name']} WHERE meta_key='_give_form_sales' AND meta_value > 0
GROUP BY meta_value+0
ORDER BY sales DESC
LIMIT %d;",
$number
)
);
return $give_forms;
}
}