776 lines
24 KiB
PHP
776 lines
24 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Graphing Functions
|
||
|
*
|
||
|
* @package EDD
|
||
|
* @subpackage Admin/Reports
|
||
|
* @copyright Copyright (c) 2018, Easy Digital Downloads, LLC
|
||
|
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
|
||
|
* @since 1.0
|
||
|
*/
|
||
|
|
||
|
use EDD\Reports;
|
||
|
|
||
|
// Exit if accessed directly
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Show report graphs
|
||
|
*
|
||
|
* @since 1.3
|
||
|
* @return void
|
||
|
*/
|
||
|
function edd_reports_graph() {
|
||
|
// Retrieve the queried dates
|
||
|
$dates = Reports\get_dates_filter( 'objects' );
|
||
|
|
||
|
$day_by_day = Reports\get_dates_filter_day_by_day();
|
||
|
|
||
|
$earnings_totals = 0.00; // Total earnings for time period shown
|
||
|
$sales_totals = 0; // Total sales for time period shown
|
||
|
|
||
|
$include_taxes = empty( $_GET['exclude_taxes'] ) ? true : false;
|
||
|
|
||
|
if ( $dates['range'] == 'today' || $dates['range'] == 'yesterday' ) {
|
||
|
// Hour by hour
|
||
|
$hour = 0;
|
||
|
$month = $dates['start']->month;
|
||
|
|
||
|
$i = 0;
|
||
|
$j = 0;
|
||
|
|
||
|
$start = $dates['start']->format( 'Y-m-d' );
|
||
|
$end = $dates['end']->format( 'Y-m-d' );
|
||
|
|
||
|
$sales = EDD()->payment_stats->get_sales_by_range( $dates['range'], true, $start, $end );
|
||
|
$earnings = EDD()->payment_stats->get_earnings_by_range( $dates['range'], true, $start, $end, $include_taxes );
|
||
|
|
||
|
while ( $hour <= 23 ) {
|
||
|
$date = mktime( $hour, 0, 0, $month, $dates['start']->day, $dates['start']->year ) * 1000;
|
||
|
|
||
|
if ( isset( $earnings[ $i ] ) && $earnings[ $i ]['h'] == $hour ) {
|
||
|
$earnings_data[] = array( $date, $earnings[ $i ]['total'] );
|
||
|
$earnings_totals += $earnings[ $i ]['total'];
|
||
|
$i++;
|
||
|
} else {
|
||
|
$earnings_data[] = array( $date, 0 );
|
||
|
}
|
||
|
|
||
|
if ( isset( $sales[ $j ] ) && $sales[ $j ]['h'] == $hour ) {
|
||
|
$sales_data[] = array( $date, $sales[ $j ]['count'] );
|
||
|
$sales_totals += $sales[ $j ]['count'];
|
||
|
$j++;
|
||
|
} else {
|
||
|
$sales_data[] = array( $date, 0 );
|
||
|
}
|
||
|
|
||
|
$hour++;
|
||
|
}
|
||
|
} elseif ( $dates['range'] == 'this_week' || $dates['range'] == 'last_week' ) {
|
||
|
$report_dates = array();
|
||
|
$i = 0;
|
||
|
while ( $i <= 6 ) {
|
||
|
if ( ( $dates['start']->day + $i ) <= $dates['end']->day ) {
|
||
|
$report_dates[ $i ] = array(
|
||
|
'day' => (string) $dates['start']->day + $i,
|
||
|
'month' => $dates['start']->month,
|
||
|
'year' => $dates['start']->year,
|
||
|
);
|
||
|
} else {
|
||
|
$report_dates[ $i ] = array(
|
||
|
'day' => (string) $i,
|
||
|
'month' => $dates['end']->month,
|
||
|
'year' => $dates['end']->year,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$i++;
|
||
|
}
|
||
|
|
||
|
$start_date = $report_dates[0];
|
||
|
$end_date = end( $report_dates );
|
||
|
|
||
|
$sales = EDD()->payment_stats->get_sales_by_range( $dates['range'], true, $start_date['year'] . '-' . $start_date['month'] . '-' . $start_date['day'], $end_date['year'] . '-' . $end_date['month'] . '-' . $end_date['day'] );
|
||
|
$earnings = EDD()->payment_stats->get_earnings_by_range( $dates['range'], true, $start_date['year'] . '-' . $start_date['month'] . '-' . $start_date['day'], $end_date['year'] . '-' . $end_date['month'] . '-' . $end_date['day'], $include_taxes );
|
||
|
|
||
|
$i = 0;
|
||
|
$j = 0;
|
||
|
foreach ( $report_dates as $report_date ) {
|
||
|
$date = mktime( 0, 0, 0, $report_date['month'], $report_date['day'], $report_date['year'] ) * 1000;
|
||
|
|
||
|
if ( array_key_exists( $i, $sales ) && $report_date['day'] == $sales[ $i ]['d'] && $report_date['month'] == $sales[ $i ]['m'] && $report_date['year'] == $sales[ $i ]['y'] ) {
|
||
|
$sales_data[] = array( $date, $sales[ $i ]['count'] );
|
||
|
$sales_totals += $sales[ $i ]['count'];
|
||
|
$i++;
|
||
|
} else {
|
||
|
$sales_data[] = array( $date, 0 );
|
||
|
}
|
||
|
|
||
|
if ( array_key_exists( $j, $earnings ) && $report_date['day'] == $earnings[ $j ]['d'] && $report_date['month'] == $earnings[ $j ]['m'] && $report_date['year'] == $earnings[ $j ]['y'] ) {
|
||
|
$earnings_data[] = array( $date, $earnings[ $j ]['total'] );
|
||
|
$earnings_totals += $earnings[ $j ]['total'];
|
||
|
$j++;
|
||
|
} else {
|
||
|
$earnings_data[] = array( $date, 0 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
$date_start = $dates['start']->format( 'Y-m-d' );
|
||
|
$date_end = $dates['end']->format( 'Y-m-d' );
|
||
|
|
||
|
$sales = EDD()->payment_stats->get_sales_by_range( $dates['range'], $day_by_day, $date_start, $date_end );
|
||
|
$earnings = EDD()->payment_stats->get_earnings_by_range( $dates['range'], $day_by_day, $date_start, $date_end, $include_taxes );
|
||
|
|
||
|
$temp_data = array(
|
||
|
'sales' => array(),
|
||
|
'earnings' => array(),
|
||
|
);
|
||
|
|
||
|
foreach ( $sales as $sale ) {
|
||
|
if ( $day_by_day ) {
|
||
|
$temp_data['sales'][ $sale['y'] ][ $sale['m'] ][ $sale['d'] ] = $sale['count'];
|
||
|
} else {
|
||
|
$temp_data['sales'][ $sale['y'] ][ $sale['m'] ] = $sale['count'];
|
||
|
}
|
||
|
$sales_totals += $sale['count'];
|
||
|
}
|
||
|
|
||
|
foreach ( $earnings as $earning ) {
|
||
|
if ( $day_by_day ) {
|
||
|
$temp_data['earnings'][ $earning['y'] ][ $earning['m'] ][ $earning['d'] ] = $earning['total'];
|
||
|
} else {
|
||
|
$temp_data['earnings'][ $earning['y'] ][ $earning['m'] ] = $earning['total'];
|
||
|
}
|
||
|
$earnings_totals += $earning['total'];
|
||
|
}
|
||
|
|
||
|
while ( $day_by_day && ( strtotime( $date_start ) <= strtotime( $date_end ) ) ) {
|
||
|
$d = $dates['start']->day;
|
||
|
$m = $dates['start']->month;
|
||
|
$y = $dates['start']->year;
|
||
|
|
||
|
if ( ! isset( $temp_data['sales'][ $y ][ $m ][ $d ] ) ) {
|
||
|
$temp_data['sales'][ $y ][ $m ][ $d ] = 0;
|
||
|
}
|
||
|
|
||
|
if ( ! isset( $temp_data['earnings'][ $y ][ $m ][ $d ] ) ) {
|
||
|
$temp_data['earnings'][ $y ][ $m ][ $d ] = 0;
|
||
|
}
|
||
|
|
||
|
$date_start = $dates['start']->addDays( 1 )->format( 'Y-m-d' );
|
||
|
}
|
||
|
|
||
|
while ( ! $day_by_day && ( strtotime( $date_start ) <= strtotime( $date_end ) ) ) {
|
||
|
$m = $dates['start']->month;
|
||
|
$y = $dates['start']->year;
|
||
|
|
||
|
if ( ! isset( $temp_data['sales'][ $y ][ $m ] ) ) {
|
||
|
$temp_data['sales'][ $y ][ $m ] = 0;
|
||
|
}
|
||
|
|
||
|
if ( ! isset( $temp_data['earnings'][ $y ][ $m ] ) ) {
|
||
|
$temp_data['earnings'][ $y ][ $m ] = 0;
|
||
|
}
|
||
|
|
||
|
$date_start = $dates['start']->addMonths( 1 )->format( 'Y-m' );
|
||
|
}
|
||
|
|
||
|
$sales_data = array();
|
||
|
$earnings_data = array();
|
||
|
|
||
|
// When using 3 months or smaller as the custom range, show each day individually on the graph
|
||
|
if ( $day_by_day ) {
|
||
|
foreach ( $temp_data['sales'] as $year => $months ) {
|
||
|
foreach ( $months as $month => $days ) {
|
||
|
foreach ( $days as $day => $count ) {
|
||
|
$date = mktime( 0, 0, 0, $month, $day, $year ) * 1000;
|
||
|
$sales_data[] = array( $date, $count );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
foreach ( $temp_data['earnings'] as $year => $months ) {
|
||
|
foreach ( $months as $month => $days ) {
|
||
|
foreach ( $days as $day => $total ) {
|
||
|
$date = mktime( 0, 0, 0, $month, $day, $year ) * 1000;
|
||
|
$earnings_data[] = array( $date, $total );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Sort dates in ascending order
|
||
|
foreach ( $sales_data as $key => $value ) {
|
||
|
$timestamps[ $key ] = $value[0];
|
||
|
}
|
||
|
if ( ! empty( $timestamps ) ) {
|
||
|
array_multisort( $timestamps, SORT_ASC, $sales_data );
|
||
|
}
|
||
|
|
||
|
foreach ( $earnings_data as $key => $value ) {
|
||
|
$earnings_timestamps[ $key ] = $value[0];
|
||
|
}
|
||
|
if ( ! empty( $earnings_timestamps ) ) {
|
||
|
array_multisort( $earnings_timestamps, SORT_ASC, $earnings_data );
|
||
|
}
|
||
|
|
||
|
// When showing more than 3 months of results, group them by month, by the first (except for the last month, group on the last day of the month selected)
|
||
|
} else {
|
||
|
|
||
|
foreach ( $temp_data['sales'] as $year => $months ) {
|
||
|
$month_keys = array_keys( $months );
|
||
|
$last_month = end( $month_keys );
|
||
|
|
||
|
if ( $day_by_day ) {
|
||
|
foreach ( $months as $month => $days ) {
|
||
|
$day_keys = array_keys( $days );
|
||
|
$last_day = end( $day_keys );
|
||
|
|
||
|
$month_keys = array_keys( $months );
|
||
|
|
||
|
$consolidated_date = $month === end( $month_keys ) ? cal_days_in_month( CAL_GREGORIAN, $month, $year ) : 1;
|
||
|
|
||
|
$sales = array_sum( $days );
|
||
|
$date = mktime( 0, 0, 0, $month, $consolidated_date, $year ) * 1000;
|
||
|
$sales_data[] = array( $date, $sales );
|
||
|
}
|
||
|
} else {
|
||
|
foreach ( $months as $month => $count ) {
|
||
|
$month_keys = array_keys( $months );
|
||
|
$consolidated_date = $month === end( $month_keys ) ? cal_days_in_month( CAL_GREGORIAN, $month, $year ) : 1;
|
||
|
|
||
|
$date = mktime( 0, 0, 0, $month, $consolidated_date, $year ) * 1000;
|
||
|
$sales_data[] = array( $date, $count );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Sort dates in ascending order
|
||
|
foreach ( $sales_data as $key => $value ) {
|
||
|
$timestamps[ $key ] = $value[0];
|
||
|
}
|
||
|
if ( ! empty( $timestamps ) ) {
|
||
|
array_multisort( $timestamps, SORT_ASC, $sales_data );
|
||
|
}
|
||
|
|
||
|
foreach ( $temp_data['earnings'] as $year => $months ) {
|
||
|
$month_keys = array_keys( $months );
|
||
|
$last_month = end( $month_keys );
|
||
|
|
||
|
if ( $day_by_day ) {
|
||
|
foreach ( $months as $month => $days ) {
|
||
|
$day_keys = array_keys( $days );
|
||
|
$last_day = end( $day_keys );
|
||
|
|
||
|
$month_keys = array_keys( $months );
|
||
|
|
||
|
$consolidated_date = $month === end( $month_keys )
|
||
|
? cal_days_in_month( CAL_GREGORIAN, $month, $year )
|
||
|
: 1;
|
||
|
|
||
|
$earnings = array_sum( $days );
|
||
|
$date = mktime( 0, 0, 0, $month, $consolidated_date, $year ) * 1000;
|
||
|
$earnings_data[] = array( $date, $earnings );
|
||
|
}
|
||
|
} else {
|
||
|
foreach ( $months as $month => $count ) {
|
||
|
$month_keys = array_keys( $months );
|
||
|
$consolidated_date = $month === end( $month_keys )
|
||
|
? cal_days_in_month( CAL_GREGORIAN, $month, $year )
|
||
|
: 1;
|
||
|
|
||
|
$date = mktime( 0, 0, 0, $month, $consolidated_date, $year ) * 1000;
|
||
|
$earnings_data[] = array( $date, $count );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Sort dates in ascending order
|
||
|
foreach ( $earnings_data as $key => $value ) {
|
||
|
$earnings_timestamps[ $key ] = $value[0];
|
||
|
}
|
||
|
if ( ! empty( $earnings_timestamps ) ) {
|
||
|
array_multisort( $earnings_timestamps, SORT_ASC, $earnings_data );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$data = array(
|
||
|
__( 'Earnings', 'easy-digital-downloads' ) => $earnings_data,
|
||
|
__( 'Sales', 'easy-digital-downloads' ) => $sales_data
|
||
|
);
|
||
|
|
||
|
// start our own output buffer
|
||
|
ob_start();
|
||
|
|
||
|
do_action( 'edd_reports_graph_before' ); ?>
|
||
|
|
||
|
<div id="edd-dashboard-widgets-wrap">
|
||
|
<div class="metabox-holder" style="padding-top: 0;">
|
||
|
<div class="postbox">
|
||
|
<h3><span><?php _e('Earnings Over Time','easy-digital-downloads' ); ?></span></h3>
|
||
|
|
||
|
<div class="inside">
|
||
|
<?php
|
||
|
$graph = new EDD_Graph( $data );
|
||
|
$graph->set( 'x_mode', 'time' );
|
||
|
$graph->set( 'multiple_y_axes', true );
|
||
|
$graph->display();
|
||
|
|
||
|
if( ! empty( $dates['range'] ) && 'this_month' == $dates['range'] ) {
|
||
|
$estimated = edd_estimated_monthly_stats( $include_taxes );
|
||
|
}
|
||
|
?>
|
||
|
|
||
|
<p class="edd_graph_totals">
|
||
|
<strong>
|
||
|
<?php
|
||
|
_e( 'Total earnings for period shown: ', 'easy-digital-downloads' );
|
||
|
echo edd_currency_filter( edd_format_amount( $earnings_totals ) );
|
||
|
?>
|
||
|
</strong>
|
||
|
<?php if ( ! $include_taxes ) : ?>
|
||
|
<sup>†</sup>
|
||
|
<?php endif; ?>
|
||
|
</p>
|
||
|
<p class="edd_graph_totals"><strong><?php _e( 'Total sales for period shown: ', 'easy-digital-downloads' ); echo edd_format_amount( $sales_totals, false ); ?></strong></p>
|
||
|
|
||
|
<?php if( ! empty( $dates['range'] ) && 'this_month' == $dates['range'] ) : ?>
|
||
|
<p class="edd_graph_totals">
|
||
|
<strong>
|
||
|
<?php
|
||
|
_e( 'Estimated monthly earnings: ', 'easy-digital-downloads' );
|
||
|
echo edd_currency_filter( edd_format_amount( $estimated['earnings'] ) );
|
||
|
?>
|
||
|
</strong>
|
||
|
<?php if ( ! $include_taxes ) : ?>
|
||
|
<sup>†</sup>
|
||
|
<?php endif; ?>
|
||
|
</p>
|
||
|
<p class="edd_graph_totals"><strong><?php _e( 'Estimated monthly sales: ', 'easy-digital-downloads' ); echo edd_format_amount( $estimated['sales'], false ); ?></strong></p>
|
||
|
<?php endif; ?>
|
||
|
|
||
|
<?php do_action( 'edd_reports_graph_additional_stats' ); ?>
|
||
|
|
||
|
<p class="edd_graph_notes">
|
||
|
<?php if ( false === $include_taxes ) : ?>
|
||
|
<em><sup>†</sup> <?php _e( 'Excludes sales tax.', 'easy-digital-downloads' ); ?></em>
|
||
|
<?php endif; ?>
|
||
|
</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<?php do_action( 'edd_reports_graph_after' );
|
||
|
|
||
|
// Output the buffer
|
||
|
echo ob_get_clean();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Show report graphs of a specific product
|
||
|
*
|
||
|
* @since 1.9
|
||
|
* @return void
|
||
|
*/
|
||
|
function edd_reports_graph_of_download( $download_id = 0 ) {
|
||
|
// Retrieve the queried dates
|
||
|
$dates = edd_get_report_dates();
|
||
|
|
||
|
// Determine graph options
|
||
|
switch ( $dates['range'] ) {
|
||
|
case 'today' :
|
||
|
case 'yesterday' :
|
||
|
$day_by_day = true;
|
||
|
break;
|
||
|
case 'last_year' :
|
||
|
case 'this_year' :
|
||
|
$day_by_day = false;
|
||
|
break;
|
||
|
case 'last_quarter' :
|
||
|
case 'this_quarter' :
|
||
|
$day_by_day = false;
|
||
|
break;
|
||
|
case 'other' :
|
||
|
if ( $dates['m_start'] == 12 && $dates['m_end'] == 1 ) {
|
||
|
$day_by_day = true;
|
||
|
} elseif ( $dates['m_end'] - $dates['m_start'] >= 3 || ( $dates['year_end'] > $dates['year'] && ( $dates['m_start'] - $dates['m_end'] ) != 10 ) ) {
|
||
|
$day_by_day = false;
|
||
|
} else {
|
||
|
$day_by_day = true;
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
$day_by_day = true;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
$earnings_totals = (float) 0.00; // Total earnings for time period shown
|
||
|
$sales_totals = 0; // Total sales for time period shown
|
||
|
|
||
|
$include_taxes = empty( $_GET['exclude_taxes'] ) ? true : false;
|
||
|
$earnings_data = array();
|
||
|
$sales_data = array();
|
||
|
|
||
|
if ( $dates['range'] == 'today' || $dates['range'] == 'yesterday' ) {
|
||
|
// Hour by hour
|
||
|
$month = $dates['m_start'];
|
||
|
$hour = 0;
|
||
|
$minute = 0;
|
||
|
$second = 0;
|
||
|
while ( $hour <= 23 ) :
|
||
|
if ( $hour == 23 ) {
|
||
|
$minute = $second = 59;
|
||
|
}
|
||
|
|
||
|
$date = mktime( $hour, $minute, $second, $month, $dates['day'], $dates['year'] );
|
||
|
$date_end = mktime( $hour + 1, $minute, $second, $month, $dates['day'], $dates['year'] );
|
||
|
|
||
|
$sales = EDD()->payment_stats->get_sales( $download_id, $date, $date_end );
|
||
|
$sales_totals += $sales;
|
||
|
|
||
|
$earnings = EDD()->payment_stats->get_earnings( $download_id, $date, $date_end, $include_taxes );
|
||
|
$earnings_totals += $earnings;
|
||
|
|
||
|
$sales_data[] = array( $date * 1000, $sales );
|
||
|
$earnings_data[] = array( $date * 1000, $earnings );
|
||
|
|
||
|
$hour++;
|
||
|
endwhile;
|
||
|
} elseif( $dates['range'] == 'this_week' || $dates['range'] == 'last_week' ) {
|
||
|
$num_of_days = cal_days_in_month( CAL_GREGORIAN, $dates['m_start'], $dates['year'] );
|
||
|
|
||
|
$report_dates = array();
|
||
|
$i = 0;
|
||
|
while ( $i <= 6 ) {
|
||
|
if ( ( $dates['day'] + $i ) <= $num_of_days ) {
|
||
|
$report_dates[ $i ] = array(
|
||
|
'day' => (string) $dates['day'] + $i,
|
||
|
'month' => $dates['m_start'],
|
||
|
'year' => $dates['year'],
|
||
|
);
|
||
|
} else {
|
||
|
$report_dates[ $i ] = array(
|
||
|
'day' => (string) $i,
|
||
|
'month' => $dates['m_end'],
|
||
|
'year' => $dates['year_end'],
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$i++;
|
||
|
}
|
||
|
|
||
|
foreach ( $report_dates as $report_date ) {
|
||
|
$date = mktime( 0, 0, 0, $report_date['month'], $report_date['day'], $report_date['year'] );
|
||
|
$date_end = mktime( 23, 59, 59, $report_date['month'], $report_date['day'], $report_date['year'] );
|
||
|
$sales = EDD()->payment_stats->get_sales( $download_id, $date, $date_end );
|
||
|
$sales_totals += $sales;
|
||
|
|
||
|
$earnings = EDD()->payment_stats->get_earnings( $download_id, $date, $date_end, $include_taxes );
|
||
|
$earnings_totals += $earnings;
|
||
|
|
||
|
$sales_data[] = array( $date * 1000, $sales );
|
||
|
$earnings_data[] = array( $date * 1000, $earnings );
|
||
|
}
|
||
|
} else {
|
||
|
$y = $dates['year'];
|
||
|
$temp_data = array();
|
||
|
|
||
|
while( $y <= $dates['year_end'] ) {
|
||
|
|
||
|
$last_year = false;
|
||
|
|
||
|
if( $dates['year'] == $dates['year_end'] ) {
|
||
|
$month_start = $dates['m_start'];
|
||
|
$month_end = $dates['m_end'];
|
||
|
$last_year = true;
|
||
|
} elseif( $y == $dates['year'] ) {
|
||
|
$month_start = $dates['m_start'];
|
||
|
$month_end = 12;
|
||
|
} elseif ( $y == $dates['year_end'] ) {
|
||
|
$month_start = 1;
|
||
|
$month_end = $dates['m_end'];
|
||
|
} else {
|
||
|
$month_start = 1;
|
||
|
$month_end = 12;
|
||
|
}
|
||
|
|
||
|
$i = $month_start;
|
||
|
while ( $i <= $month_end ) {
|
||
|
$d = $dates['day'];
|
||
|
|
||
|
if ( $i == $month_end ) {
|
||
|
$num_of_days = $dates['day_end'];
|
||
|
|
||
|
if ( $month_start < $month_end ) {
|
||
|
$d = 1;
|
||
|
}
|
||
|
} elseif ( $i > $month_start && $i < $month_end ) {
|
||
|
$num_of_days = cal_days_in_month( CAL_GREGORIAN, $i, $y );
|
||
|
$d = 1;
|
||
|
} else {
|
||
|
$num_of_days = cal_days_in_month( CAL_GREGORIAN, $i, $y );
|
||
|
}
|
||
|
|
||
|
while ( $d <= $num_of_days ) {
|
||
|
$date = mktime( 0, 0, 0, $i, $d, $y );
|
||
|
$end_date = mktime( 23, 59, 59, $i, $d, $y );
|
||
|
|
||
|
$earnings = EDD()->payment_stats->get_earnings( $download_id, $date, $end_date, $include_taxes );
|
||
|
$earnings_totals += $earnings;
|
||
|
|
||
|
$sales = EDD()->payment_stats->get_sales( $download_id, $date, $end_date );
|
||
|
$sales_totals += $sales;
|
||
|
|
||
|
$temp_data['earnings'][ $y ][ $i ][ $d ] = $earnings;
|
||
|
$temp_data['sales'][ $y ][ $i ][ $d ] = $sales;
|
||
|
|
||
|
$d++;
|
||
|
}
|
||
|
|
||
|
$i++;
|
||
|
}
|
||
|
|
||
|
$y++;
|
||
|
}
|
||
|
|
||
|
$sales_data = array();
|
||
|
$earnings_data = array();
|
||
|
|
||
|
// When using 2 months or smaller as the custom range, show each day individually on the graph
|
||
|
if ( $day_by_day ) {
|
||
|
foreach ( $temp_data[ 'sales' ] as $year => $months ) {
|
||
|
foreach( $months as $month => $dates ) {
|
||
|
foreach ( $dates as $day => $sales ) {
|
||
|
$date = mktime( 0, 0, 0, $month, $day, $year ) * 1000;
|
||
|
$sales_data[] = array( $date, $sales );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
foreach ( $temp_data[ 'earnings' ] as $year => $months ) {
|
||
|
foreach( $months as $month => $dates ) {
|
||
|
foreach ( $dates as $day => $earnings ) {
|
||
|
$date = mktime( 0, 0, 0, $month, $day, $year ) * 1000;
|
||
|
$earnings_data[] = array( $date, $earnings );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// When showing more than 2 months of results, group them by month, by the first (except for the last month, group on the last day of the month selected)
|
||
|
} else {
|
||
|
foreach ( $temp_data[ 'sales' ] as $year => $months ) {
|
||
|
$month_keys = array_keys( $months );
|
||
|
$last_month = end( $month_keys );
|
||
|
|
||
|
foreach ( $months as $month => $days ) {
|
||
|
$day_keys = array_keys( $days );
|
||
|
$last_day = end( $day_keys );
|
||
|
|
||
|
$consolidated_date = $month === $last_month ? $last_day : 1;
|
||
|
|
||
|
$sales = array_sum( $days );
|
||
|
$date = mktime( 0, 0, 0, $month, $consolidated_date, $year ) * 1000;
|
||
|
$sales_data[] = array( $date, $sales );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
foreach ( $temp_data[ 'earnings' ] as $year => $months ) {
|
||
|
$month_keys = array_keys( $months );
|
||
|
$last_month = end( $month_keys );
|
||
|
|
||
|
foreach ( $months as $month => $days ) {
|
||
|
$day_keys = array_keys( $days );
|
||
|
$last_day = end( $day_keys );
|
||
|
|
||
|
$consolidated_date = $month === $last_month ? $last_day : 1;
|
||
|
|
||
|
$earnings = array_sum( $days );
|
||
|
$date = mktime( 0, 0, 0, $month, $consolidated_date, $year ) * 1000;
|
||
|
$earnings_data[] = array( $date, $earnings );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$data = array(
|
||
|
__( 'Earnings', 'easy-digital-downloads' ) => $earnings_data,
|
||
|
__( 'Sales', 'easy-digital-downloads' ) => $sales_data
|
||
|
);
|
||
|
|
||
|
?>
|
||
|
<div class="metabox-holder" style="padding-top: 0;">
|
||
|
<div class="postbox">
|
||
|
<h3><span><?php printf( __('Earnings Over Time for %s', 'easy-digital-downloads' ), get_the_title( $download_id ) ); ?></span></h3>
|
||
|
|
||
|
<div class="inside">
|
||
|
<?php
|
||
|
$graph = new EDD_Graph( $data );
|
||
|
$graph->set( 'x_mode', 'time' );
|
||
|
$graph->set( 'multiple_y_axes', true );
|
||
|
$graph->display();
|
||
|
?>
|
||
|
<p class="edd_graph_totals"><strong><?php _e( 'Total earnings for period shown: ', 'easy-digital-downloads' ); echo edd_currency_filter( edd_format_amount( $earnings_totals ) ); ?></strong></p>
|
||
|
<p class="edd_graph_totals"><strong><?php _e( 'Total sales for period shown: ', 'easy-digital-downloads' ); echo $sales_totals; ?></strong></p>
|
||
|
<p class="edd_graph_totals"><strong><?php printf( __( 'Average monthly earnings: %s', 'easy-digital-downloads' ), edd_currency_filter( edd_format_amount( edd_get_average_monthly_download_earnings( $download_id ) ) ) ); ?>
|
||
|
<p class="edd_graph_totals"><strong><?php printf( __( 'Average monthly sales: %s', 'easy-digital-downloads' ), number_format( edd_get_average_monthly_download_sales( $download_id ), 0 ) ); ?>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<?php
|
||
|
echo ob_get_clean();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Grabs all of the selected date info and then redirects appropriately
|
||
|
*
|
||
|
* @since 1.3
|
||
|
*
|
||
|
* @param array $form_data POSTed data from the filters form.
|
||
|
*/
|
||
|
function edd_parse_report_dates( $form_data ) {
|
||
|
// Load the Reports API dependencies.
|
||
|
Reports\Init::bootstrap();
|
||
|
|
||
|
$filters = Reports\get_filters();
|
||
|
|
||
|
$redirect = ! empty( $form_data['edd_redirect'] )
|
||
|
? $form_data['edd_redirect']
|
||
|
: edd_get_admin_url( array(
|
||
|
'page' => 'edd-reports',
|
||
|
) );
|
||
|
|
||
|
$filter_args = array();
|
||
|
|
||
|
// Parse and validate filters.
|
||
|
foreach ( $filters as $filter => $attributes ) {
|
||
|
|
||
|
switch ( $filter ) {
|
||
|
|
||
|
case 'dates':
|
||
|
if ( ! empty( $form_data['range'] ) ) {
|
||
|
$range = sanitize_key( $form_data['range'] );
|
||
|
$relative_range = sanitize_key( $form_data['relative_range'] );
|
||
|
} else {
|
||
|
$range = Reports\get_dates_filter_range();
|
||
|
$relative_range = Reports\get_relative_dates_filter_range();
|
||
|
}
|
||
|
|
||
|
if ( 'other' === $range ) {
|
||
|
try {
|
||
|
/*
|
||
|
* This validates the input dates before saving. If they're not valid, an exception
|
||
|
* will be thrown.
|
||
|
*/
|
||
|
EDD()->utils->date( $form_data['filter_from'] );
|
||
|
EDD()->utils->date( $form_data['filter_to'] );
|
||
|
} catch ( \Exception $e ) {
|
||
|
wp_die(
|
||
|
esc_html__( 'Invalid date format. Please enter a date in the format: YYYY-mm-dd.', 'easy-digital-downloads' ),
|
||
|
esc_html__( 'Invalid Date Error', 'easy-digital-downloads' ),
|
||
|
array( 'response' => 400, 'back_link' => true )
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$filter_args = array_merge(
|
||
|
array(
|
||
|
'filter_from' => ! empty( $form_data['filter_from'] )
|
||
|
? sanitize_text_field( $form_data['filter_from'] )
|
||
|
: '',
|
||
|
'filter_to' => ! empty( $form_data['filter_to'] )
|
||
|
? sanitize_text_field( $form_data['filter_to'] )
|
||
|
: '',
|
||
|
'range' => 'other',
|
||
|
'relative_range' => 'previous_period',
|
||
|
),
|
||
|
$filter_args
|
||
|
);
|
||
|
|
||
|
} else {
|
||
|
|
||
|
$dates = Reports\parse_dates_for_range( $range );
|
||
|
|
||
|
$filter_args = array_merge(
|
||
|
array(
|
||
|
'filter_from' => $dates['start']->format( 'date-mysql' ),
|
||
|
'filter_to' => $dates['end']->format( 'date-mysql' ),
|
||
|
'range' => $range,
|
||
|
'relative_range' => $relative_range,
|
||
|
),
|
||
|
$filter_args
|
||
|
);
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'taxes':
|
||
|
$filter_args = array_merge(
|
||
|
array(
|
||
|
'exclude_taxes' => isset( $form_data['exclude_taxes'] ),
|
||
|
),
|
||
|
$filter_args
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
$filter_arg = isset( $form_data[ $filter ] )
|
||
|
? $form_data[ $filter ]
|
||
|
: array();
|
||
|
|
||
|
if ( ! empty( $filter_arg ) ) {
|
||
|
$filter_args[ $filter ] = $filter_arg;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Redirect back to report.
|
||
|
$redirect = add_query_arg( $filter_args, $redirect );
|
||
|
|
||
|
edd_redirect( $redirect );
|
||
|
}
|
||
|
add_action( 'edd_filter_reports', 'edd_parse_report_dates' );
|
||
|
|
||
|
/**
|
||
|
* EDD Reports Refresh Button
|
||
|
* @since 2.7
|
||
|
* @description: Outputs a "Refresh Reports" button for graphs
|
||
|
*/
|
||
|
function edd_reports_refresh_button() {
|
||
|
|
||
|
$url = wp_nonce_url( add_query_arg( array(
|
||
|
'edd_action' => 'refresh_reports_transients',
|
||
|
'edd-message' => 'refreshed-reports'
|
||
|
) ), 'edd-refresh-reports' );
|
||
|
|
||
|
echo '<a href="' . esc_url( $url ) . '" title="' . esc_html__( 'Clicking this will clear the reports cache', 'easy-digital-downloads' ) . '" class="button edd-refresh-reports-button">' . esc_html__( 'Refresh Reports', 'easy-digital-downloads' ) . '</a>';
|
||
|
}
|
||
|
|
||
|
add_action( 'edd_reports_graph_after', 'edd_reports_refresh_button' );
|
||
|
|
||
|
/**
|
||
|
* EDD trigger the refresh of reports transients
|
||
|
*
|
||
|
* @since 2.7
|
||
|
*
|
||
|
* @param array $data Parameters sent from Settings page
|
||
|
* @return void
|
||
|
*/
|
||
|
function edd_run_refresh_reports_transients( $data ) {
|
||
|
if ( ! wp_verify_nonce( $data['_wpnonce'], 'edd-refresh-reports' ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Delete transients
|
||
|
delete_transient( 'edd_stats_earnings' );
|
||
|
delete_transient( 'edd_stats_sales' );
|
||
|
delete_transient( 'edd_estimated_monthly_stats' );
|
||
|
delete_transient( 'edd_earnings_total' );
|
||
|
delete_transient( md5( 'edd_earnings_this_monththis_month' ) );
|
||
|
delete_transient( md5( 'edd_earnings_todaytoday' ) );
|
||
|
}
|
||
|
add_action( 'edd_refresh_reports_transients', 'edd_run_refresh_reports_transients' );
|