/**
  * Build all the reports data
  *
  * @access public
  * @since 1.5
  * @return array $reports_data All the data for customer reports
  */
 public function reports_data()
 {
     $reports_data = array();
     $downloads = $this->products->posts;
     if ($downloads) {
         foreach ($downloads as $download) {
             $reports_data[] = array('ID' => $download, 'title' => get_the_title($download), 'sales' => edd_get_download_sales_stats($download), 'earnings' => edd_get_download_earnings_stats($download), 'average_sales' => edd_get_average_monthly_download_sales($download), 'average_earnings' => edd_get_average_monthly_download_earnings($download));
         }
     }
     return $reports_data;
 }
 /**
  * Process Get Products API Request
  *
  * @access public
  * @author Daniel J Griffiths
  * @since 1.5
  * @param int $product Product (Download) ID
  * @return array $customers Multidimensional array of the products
  */
 public function get_products($product = null)
 {
     $products = array();
     if ($product == null) {
         $products['products'] = array();
         $product_list = get_posts(array('post_type' => 'download', 'posts_per_page' => $this->per_page(), 'paged' => $this->get_paged()));
         if ($product_list) {
             $i = 0;
             foreach ($product_list as $product_info) {
                 $products['products'][$i]['info']['id'] = $product_info->ID;
                 $products['products'][$i]['info']['slug'] = $product_info->post_name;
                 $products['products'][$i]['info']['title'] = $product_info->post_title;
                 $products['products'][$i]['info']['create_date'] = $product_info->post_date;
                 $products['products'][$i]['info']['modified_date'] = $product_info->post_modified;
                 $products['products'][$i]['info']['status'] = $product_info->post_status;
                 $products['products'][$i]['info']['link'] = html_entity_decode($product_info->guid);
                 $products['products'][$i]['info']['content'] = $product_info->post_content;
                 $products['products'][$i]['info']['thumbnail'] = wp_get_attachment_url(get_post_thumbnail_id($product_info->ID));
                 $products['products'][$i]['stats']['total']['sales'] = edd_get_download_sales_stats($product_info->ID);
                 $products['products'][$i]['stats']['total']['earnings'] = edd_get_download_earnings_stats($product_info->ID);
                 $products['products'][$i]['stats']['monthly_average']['sales'] = edd_get_average_monthly_download_sales($product_info->ID);
                 $products['products'][$i]['stats']['monthly_average']['earnings'] = edd_get_average_monthly_download_earnings($product_info->ID);
                 if (edd_has_variable_prices($product_info->ID)) {
                     foreach (edd_get_variable_prices($product_info->ID) as $price) {
                         $products['products'][$i]['pricing'][sanitize_key($price['name'])] = $price['amount'];
                     }
                 } else {
                     $products['products'][$i]['pricing']['amount'] = edd_get_download_price($product_info->ID);
                 }
                 foreach (edd_get_download_files($product_info->ID) as $file) {
                     $products['products'][$i]['files'][] = $file;
                 }
                 $products['products'][$i]['notes'] = edd_get_product_notes($product_info->ID);
                 $i++;
             }
         }
     } else {
         if (get_post_type($product) == 'download') {
             $product_info = get_post($product);
             $products['products'][0]['info']['id'] = $product_info->ID;
             $products['products'][0]['info']['slug'] = $product_info->post_name;
             $products['products'][0]['info']['title'] = $product_info->post_title;
             $products['products'][0]['info']['create_date'] = $product_info->post_date;
             $products['products'][0]['info']['modified_date'] = $product_info->post_modified;
             $products['products'][0]['info']['status'] = $product_info->post_status;
             $products['products'][0]['info']['link'] = html_entity_decode($product_info->guid);
             $products['products'][0]['info']['content'] = $product_info->post_content;
             $products['products'][0]['info']['thumbnail'] = wp_get_attachment_url(get_post_thumbnail_id($product_info->ID));
             $products['products'][0]['stats']['total']['sales'] = edd_get_download_sales_stats($product_info->ID);
             $products['products'][0]['stats']['total']['earnings'] = edd_get_download_earnings_stats($product_info->ID);
             $products['products'][0]['stats']['monthly_average']['sales'] = edd_get_average_monthly_download_sales($product_info->ID);
             $products['products'][0]['stats']['monthly_average']['earnings'] = edd_get_average_monthly_download_earnings($product_info->ID);
             if (edd_has_variable_prices($product_info->ID)) {
                 foreach (edd_get_variable_prices($product_info->ID) as $price) {
                     $products['products'][0]['pricing'][sanitize_key($price['name'])] = $price['amount'];
                 }
             } else {
                 $products['products'][0]['pricing']['amount'] = edd_get_download_price($product_info->ID);
             }
             foreach (edd_get_download_files($product_info->ID) as $file) {
                 $products['products'][0]['files'][] = $file;
             }
             $products['products'][0]['notes'] = edd_get_product_notes($product_info->ID);
         } else {
             $error['error'] = sprintf(__('Product %s not found!', 'edd'), $product);
             return $error;
         }
     }
     return $products;
 }
 /**
  * Given a download post object, generate the data for the API output
  *
  * @since  2.3.9
  * @param  object $product_info The Download Post Object
  * @return array                Array of post data to return back in the API
  */
 private function get_product_data($product_info)
 {
     $product = array();
     $product['info']['id'] = $product_info->ID;
     $product['info']['slug'] = $product_info->post_name;
     $product['info']['title'] = $product_info->post_title;
     $product['info']['create_date'] = $product_info->post_date;
     $product['info']['modified_date'] = $product_info->post_modified;
     $product['info']['status'] = $product_info->post_status;
     $product['info']['link'] = html_entity_decode($product_info->guid);
     $product['info']['content'] = $product_info->post_content;
     $product['info']['excerpt'] = $product_info->post_excerpt;
     $product['info']['thumbnail'] = wp_get_attachment_url(get_post_thumbnail_id($product_info->ID));
     $product['info']['category'] = get_the_terms($product_info, 'download_category');
     $product['info']['tags'] = get_the_terms($product_info, 'download_tag');
     if (user_can($this->user_id, 'view_shop_reports') || $this->override) {
         $product['stats']['total']['sales'] = edd_get_download_sales_stats($product_info->ID);
         $product['stats']['total']['earnings'] = edd_get_download_earnings_stats($product_info->ID);
         $product['stats']['monthly_average']['sales'] = edd_get_average_monthly_download_sales($product_info->ID);
         $product['stats']['monthly_average']['earnings'] = edd_get_average_monthly_download_earnings($product_info->ID);
     }
     if (edd_has_variable_prices($product_info->ID)) {
         foreach (edd_get_variable_prices($product_info->ID) as $price) {
             $product['pricing'][sanitize_key($price['name'])] = $price['amount'];
         }
     } else {
         $product['pricing']['amount'] = edd_get_download_price($product_info->ID);
     }
     if (user_can($this->user_id, 'view_shop_sensitive_data') || $this->override) {
         foreach (edd_get_download_files($product_info->ID) as $file) {
             $product['files'][] = $file;
         }
         $product['notes'] = edd_get_product_notes($product_info->ID);
     }
     return apply_filters('edd_api_products_product', $product);
 }
/**
 * 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':
            $day_by_day = false;
            break;
        case 'this_year':
            $day_by_day = false;
            break;
        case 'last_quarter':
            $day_by_day = false;
            break;
        case 'this_quarter':
            $day_by_day = false;
            break;
        case 'other':
            if ($dates['m_end'] - $dates['m_start'] >= 2 || $dates['year_end'] > $dates['year']) {
                $day_by_day = false;
            } else {
                $day_by_day = true;
            }
            break;
        default:
            $day_by_day = true;
            break;
    }
    $earnings_totals = (double) 0.0;
    // 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();
    $stats = new EDD_Payment_Stats();
    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 = $stats->get_sales($download_id, $date, $date_end);
            $sales_totals += $sales;
            $earnings = $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++;
        }
    } 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 = $stats->get_sales($download_id, $date, $date_end);
            $sales_totals += $sales;
            $earnings = $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;
                    }
                } 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 = $stats->get_earnings($download_id, $date, $end_date, $include_taxes);
                    $earnings_totals += $earnings;
                    $sales = $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 
    edd_reports_graph_controls();
    $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();
}
 /**
  * Retrieve all report data for Downloads
  *
  * @access      private
  * @since       1.3
  * @return      array
  */
 function reports_data()
 {
     $reports_data = array();
     $orderby = isset($_GET['orderby']) ? $_GET['orderby'] : 'title';
     $order = isset($_GET['order']) ? $_GET['order'] : 'DESC';
     $report_args = array('post_type' => 'download', 'post_status' => 'publish', 'order' => $order, 'posts_per_page' => $this->per_page, 'paged' => $this->get_paged());
     switch ($orderby) {
         case 'title':
             $report_args['orderby'] = 'title';
             break;
         case 'sales':
             $report_args['orderby'] = 'meta_value_num';
             $report_args['meta_key'] = '_edd_download_sales';
             break;
         case 'earnings':
             $report_args['orderby'] = 'meta_value_num';
             $report_args['meta_key'] = '_edd_download_earnings';
             break;
     }
     $downloads = get_posts($report_args);
     if ($downloads) {
         foreach ($downloads as $download) {
             $reports_data[] = array('ID' => $download->ID, 'title' => get_the_title($download->ID), 'sales' => edd_get_download_sales_stats($download->ID), 'earnings' => edd_get_download_earnings_stats($download->ID), 'average_sales' => edd_get_average_monthly_download_sales($download->ID), 'average_earnings' => edd_get_average_monthly_download_earnings($download->ID));
         }
     }
     return $reports_data;
 }
/**
 * Retrieves estimated monthly earnings and sales
 *
 * @since 1.5
 * @return array
 */
function edd_estimated_monthly_stats()
{
    $estimated = get_transient('edd_estimated_monthly_stats');
    if (false === $estimated) {
        $estimated = array('earnings' => 0, 'sales' => 0);
        $products = get_posts(array('post_type' => 'download', 'posts_per_page' => -1, 'fields' => 'ids'));
        if ($products) {
            foreach ($products as $download) {
                $estimated['earnings'] += edd_get_average_monthly_download_earnings($download);
                $estimated['sales'] += number_format(edd_get_average_monthly_download_sales($download), 0);
            }
        }
        // Cache for one day
        set_transient('edd_estimated_monthly_stats', serialize($estimated), 86400);
    }
    return maybe_unserialize($estimated);
}
 /**
  * Build all the reports data
  *
  * @access public
  * @since  2.4
  * @return array $reports_data All the data for customer reports
  */
 public function reports_data()
 {
     $cached_reports = get_transient('edd_earnings_by_category_data');
     if (false !== $cached_reports) {
         $reports_data = $cached_reports;
     } else {
         $reports_data = array();
         $term_args = array('parent' => 0, 'hierarchical' => 0);
         $categories = get_terms('download_category', $term_args);
         foreach ($categories as $category_id => $category) {
             $category_slugs = array($category->slug);
             $child_args = array('parent' => $category->term_id, 'hierarchical' => 0);
             $child_terms = get_terms('download_category', $child_args);
             if (!empty($child_terms)) {
                 foreach ($child_terms as $child_term) {
                     $category_slugs[] = $child_term->slug;
                 }
             }
             $download_args = array('post_type' => 'download', 'posts_per_page' => -1, 'fields' => 'ids', 'tax_query' => array(array('taxonomy' => 'download_category', 'field' => 'slug', 'terms' => $category_slugs)));
             $downloads = get_posts($download_args);
             $sales = 0;
             $earnings = 0.0;
             $avg_sales = 0;
             $avg_earnings = 0.0;
             foreach ($downloads as $download) {
                 $sales += edd_get_download_sales_stats($download);
                 $earnings += edd_get_download_earnings_stats($download);
                 $avg_sales += edd_get_average_monthly_download_sales($download);
                 $avg_earnings += edd_get_average_monthly_download_earnings($download);
             }
             $avg_sales = round($avg_sales / count($downloads));
             $avg_earnings = round($avg_earnings / count($downloads), edd_currency_decimal_filter());
             $reports_data[] = array('ID' => $category->term_id, 'label' => $category->name, 'total_sales' => edd_format_amount($sales, false), 'total_sales_raw' => $sales, 'total_earnings' => edd_currency_filter(edd_format_amount($earnings)), 'total_earnings_raw' => $earnings, 'avg_sales' => edd_format_amount($avg_sales, false), 'avg_earnings' => edd_currency_filter(edd_format_amount($avg_earnings)), 'is_child' => false);
             if (!empty($child_terms)) {
                 foreach ($child_terms as $child_term) {
                     $child_args = array('post_type' => 'download', 'posts_per_page' => -1, 'fields' => 'ids', 'tax_query' => array(array('taxonomy' => 'download_category', 'field' => 'slug', 'terms' => $child_term->slug)));
                     $child_downloads = get_posts($child_args);
                     $child_sales = 0;
                     $child_earnings = 0.0;
                     $child_avg_sales = 0;
                     $child_avg_earnings = 0.0;
                     foreach ($child_downloads as $child_download) {
                         $child_sales += edd_get_download_sales_stats($child_download);
                         $child_earnings += edd_get_download_earnings_stats($child_download);
                         $child_avg_sales += edd_get_average_monthly_download_sales($child_download);
                         $child_avg_earnings += edd_get_average_monthly_download_earnings($child_download);
                     }
                     $child_avg_sales = round($child_avg_sales / count($child_downloads));
                     $child_avg_earnings = round($child_avg_earnings / count($child_downloads), edd_currency_decimal_filter());
                     $reports_data[] = array('ID' => $child_term->term_id, 'label' => '&#8212; ' . $child_term->name, 'total_sales' => edd_format_amount($child_sales, false), 'total_sales_raw' => $child_sales, 'total_earnings' => edd_currency_filter(edd_format_amount($child_earnings)), 'total_earnings_raw' => $child_earnings, 'avg_sales' => edd_format_amount($child_avg_sales, false), 'avg_earnings' => edd_currency_filter(edd_format_amount($child_avg_earnings)), 'is_child' => true);
                 }
             }
         }
         set_transient('edd_earnings_by_category_data', $reports_data, HOUR_IN_SECONDS / 4);
     }
     return $reports_data;
 }
/**
 * 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':
            $day_by_day = false;
            break;
        case 'this_year':
            $day_by_day = false;
            break;
        case 'last_quarter':
            $day_by_day = false;
            break;
        case 'this_quarter':
            $day_by_day = false;
            break;
        case 'other':
            if ($dates['m_end'] - $dates['m_start'] >= 2 || $dates['year_end'] > $dates['year']) {
                $day_by_day = false;
            } else {
                $day_by_day = true;
            }
            break;
        default:
            $day_by_day = true;
            break;
    }
    $earnings_totals = (double) 0.0;
    // 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();
    $stats = new EDD_Payment_Stats();
    if ($dates['range'] == 'today' || $dates['range'] == 'yesterday') {
        // Hour by hour
        $month = $dates['m_start'];
        $hour = 1;
        $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 = $stats->get_sales($download_id, $date, $date_end);
            $sales_totals += $sales;
            $earnings = $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++;
        }
    } elseif ($dates['range'] == 'this_week' || $dates['range'] == 'last_week') {
        //Day by day
        $day = $dates['day'];
        $day_end = $dates['day_end'];
        $month = $dates['m_start'];
        while ($day <= $day_end) {
            $date = mktime(0, 0, 0, $month, $day, $dates['year']);
            $date_end = mktime(0, 0, 0, $month, $day + 1, $dates['year']);
            $sales = $stats->get_sales($download_id, $date, $date_end);
            $sales_totals += $sales;
            $earnings = $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);
            $day++;
        }
    } else {
        $y = $dates['year'];
        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;
            } else {
                $month_start = 1;
                $month_end = 12;
            }
            $i = $month_start;
            while ($i <= $month_end) {
                if ($day_by_day) {
                    if ($i == $month_end && $last_year) {
                        $num_of_days = $dates['day_end'];
                    } else {
                        $num_of_days = cal_days_in_month(CAL_GREGORIAN, $i, $y);
                    }
                    $d = $dates['day'];
                    while ($d <= $num_of_days) {
                        $date = mktime(0, 0, 0, $i, $d, $y);
                        $end_date = mktime(23, 59, 59, $i, $d, $y);
                        $sales = $stats->get_sales($download_id, $date, $end_date);
                        $sales_totals += $sales;
                        $earnings = $stats->get_earnings($download_id, $date, $end_date, $include_taxes);
                        $earnings_totals += $earnings;
                        $sales_data[] = array($date * 1000, $sales);
                        $earnings_data[] = array($date * 1000, $earnings);
                        $d++;
                    }
                } else {
                    $num_of_days = cal_days_in_month(CAL_GREGORIAN, $i, $y);
                    $date = mktime(0, 0, 0, $i, 1, $y);
                    $end_date = mktime(23, 59, 59, $i, $num_of_days, $y);
                    $sales = $stats->get_sales($download_id, $date, $end_date);
                    $sales_totals += $sales;
                    $earnings = $stats->get_earnings($download_id, $date, $end_date, $include_taxes);
                    $earnings_totals += $earnings;
                    $sales_data[] = array($date * 1000, $sales);
                    $earnings_data[] = array($date * 1000, $earnings);
                }
                $i++;
            }
            $y++;
        }
    }
    $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 
    edd_reports_graph_controls();
    $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();
}