/** * 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' => '— ' . $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(); }