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' );
 |