/**
  * Process Get Stats API Request
  *
  * @author Daniel J Griffiths
  * @since 1.5
  *
  * @global object $wpdb Used to query the database using the WordPress
  *
  * @param array $args Arguments provided by API Request
  *
  * @return array
  */
 public function get_stats($args = array())
 {
     $defaults = array('type' => null, 'product' => null, 'date' => null, 'startdate' => null, 'enddate' => null);
     $args = wp_parse_args($args, $defaults);
     $dates = $this->get_dates($args);
     $stats = array();
     $earnings = array('earnings' => array());
     $sales = array('sales' => array());
     $error = array();
     if (!user_can($this->user_id, 'view_shop_reports') && !$this->override) {
         return $stats;
     }
     if ($args['type'] == 'sales') {
         if ($args['product'] == null) {
             if ($args['date'] == null) {
                 $sales = $this->get_default_sales_stats();
             } elseif ($args['date'] === 'range') {
                 // Return sales for a date range
                 // Ensure the end date is later than the start date
                 if ($args['enddate'] < $args['startdate']) {
                     $error['error'] = __('The end date must be later than the start date!', 'easy-digital-downloads');
                 }
                 // Ensure both the start and end date are specified
                 if (empty($args['startdate']) || empty($args['enddate'])) {
                     $error['error'] = __('Invalid or no date range specified!', 'easy-digital-downloads');
                 }
                 $total = 0;
                 // Loop through the years
                 $y = $dates['year'];
                 while ($y <= $dates['year_end']) {
                     if ($dates['year'] == $dates['year_end']) {
                         $month_start = $dates['m_start'];
                         $month_end = $dates['m_end'];
                     } elseif ($y == $dates['year'] && $dates['year_end'] > $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) {
                         if ($i == $dates['m_start']) {
                             $d = $dates['day_start'];
                         } else {
                             $d = 1;
                         }
                         if ($i == $dates['m_end']) {
                             $num_of_days = $dates['day_end'];
                         } else {
                             $num_of_days = cal_days_in_month(CAL_GREGORIAN, $i, $y);
                         }
                         while ($d <= $num_of_days) {
                             $sale_count = edd_get_sales_by_date($d, $i, $y);
                             $date_key = date('Ymd', strtotime($y . '/' . $i . '/' . $d));
                             if (!isset($sales['sales'][$date_key])) {
                                 $sales['sales'][$date_key] = 0;
                             }
                             $sales['sales'][$date_key] += $sale_count;
                             $total += $sale_count;
                             $d++;
                         }
                         $i++;
                     }
                     $y++;
                 }
                 $sales['totals'] = $total;
             } else {
                 if ($args['date'] == 'this_quarter' || $args['date'] == 'last_quarter') {
                     $sales_count = 0;
                     // Loop through the months
                     $month = $dates['m_start'];
                     while ($month <= $dates['m_end']) {
                         $sales_count += edd_get_sales_by_date(null, $month, $dates['year']);
                         $month++;
                     }
                     $sales['sales'][$args['date']] = $sales_count;
                 } else {
                     $sales['sales'][$args['date']] = edd_get_sales_by_date($dates['day'], $dates['m_start'], $dates['year']);
                 }
             }
         } elseif ($args['product'] == 'all') {
             $products = get_posts(array('post_type' => 'download', 'nopaging' => true));
             $i = 0;
             foreach ($products as $product_info) {
                 $sales['sales'][$i] = array($product_info->post_name => edd_get_download_sales_stats($product_info->ID));
                 $i++;
             }
         } else {
             if (get_post_type($args['product']) == 'download') {
                 $product_info = get_post($args['product']);
                 $sales['sales'][0] = array($product_info->post_name => edd_get_download_sales_stats($args['product']));
             } else {
                 $error['error'] = sprintf(__('Product %s not found!', 'easy-digital-downloads'), $args['product']);
             }
         }
         if (!empty($error)) {
             return $error;
         }
         return $sales;
     } elseif ($args['type'] == 'earnings') {
         if ($args['product'] == null) {
             if ($args['date'] == null) {
                 $earnings = $this->get_default_earnings_stats();
             } elseif ($args['date'] === 'range') {
                 // Return sales for a date range
                 // Ensure the end date is later than the start date
                 if ($args['enddate'] < $args['startdate']) {
                     $error['error'] = __('The end date must be later than the start date!', 'easy-digital-downloads');
                 }
                 // Ensure both the start and end date are specified
                 if (empty($args['startdate']) || empty($args['enddate'])) {
                     $error['error'] = __('Invalid or no date range specified!', 'easy-digital-downloads');
                 }
                 $total = (double) 0.0;
                 // Loop through the years
                 $y = $dates['year'];
                 if (!isset($earnings['earnings'])) {
                     $earnings['earnings'] = array();
                 }
                 while ($y <= $dates['year_end']) {
                     if ($dates['year'] == $dates['year_end']) {
                         $month_start = $dates['m_start'];
                         $month_end = $dates['m_end'];
                     } elseif ($y == $dates['year'] && $dates['year_end'] > $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) {
                         if ($i == $dates['m_start']) {
                             $d = $dates['day_start'];
                         } else {
                             $d = 1;
                         }
                         if ($i == $dates['m_end']) {
                             $num_of_days = $dates['day_end'];
                         } else {
                             $num_of_days = cal_days_in_month(CAL_GREGORIAN, $i, $y);
                         }
                         while ($d <= $num_of_days) {
                             $earnings_stat = edd_get_earnings_by_date($d, $i, $y);
                             $date_key = date('Ymd', strtotime($y . '/' . $i . '/' . $d));
                             if (!isset($earnings['earnings'][$date_key])) {
                                 $earnings['earnings'][$date_key] = 0;
                             }
                             $earnings['earnings'][$date_key] += $earnings_stat;
                             $total += $earnings_stat;
                             $d++;
                         }
                         $i++;
                     }
                     $y++;
                 }
                 $earnings['totals'] = $total;
             } else {
                 if ($args['date'] == 'this_quarter' || $args['date'] == 'last_quarter') {
                     $earnings_count = (double) 0.0;
                     // Loop through the months
                     $month = $dates['m_start'];
                     while ($month <= $dates['m_end']) {
                         $earnings_count += edd_get_earnings_by_date(null, $month, $dates['year']);
                         $month++;
                     }
                     $earnings['earnings'][$args['date']] = $earnings_count;
                 } else {
                     $earnings['earnings'][$args['date']] = edd_get_earnings_by_date($dates['day'], $dates['m_start'], $dates['year']);
                 }
             }
         } elseif ($args['product'] == 'all') {
             $products = get_posts(array('post_type' => 'download', 'nopaging' => true));
             $i = 0;
             foreach ($products as $product_info) {
                 $earnings['earnings'][$i] = array($product_info->post_name => edd_get_download_earnings_stats($product_info->ID));
                 $i++;
             }
         } else {
             if (get_post_type($args['product']) == 'download') {
                 $product_info = get_post($args['product']);
                 $earnings['earnings'][0] = array($product_info->post_name => edd_get_download_earnings_stats($args['product']));
             } else {
                 $error['error'] = sprintf(__('Product %s not found!', 'easy-digital-downloads'), $args['product']);
             }
         }
         if (!empty($error)) {
             return $error;
         }
         return $earnings;
     } elseif ($args['type'] == 'customers') {
         if (version_compare($edd_version, '2.3', '<') || !edd_has_upgrade_completed('upgrade_customer_payments_association')) {
             global $wpdb;
             $stats = array();
             $count = $wpdb->get_col("SELECT COUNT(DISTINCT meta_value) FROM {$wpdb->postmeta} WHERE meta_key = '_edd_payment_user_email'");
             $stats['customers']['total_customers'] = $count[0];
             return $stats;
         } else {
             $customers = new EDD_DB_Customers();
             $stats['customers']['total_customers'] = $customers->count();
             return $stats;
         }
     } elseif (empty($args['type'])) {
         $stats = array_merge($stats, $this->get_default_sales_stats());
         $stats = array_merge($stats, $this->get_default_earnings_stats());
         return array('stats' => $stats);
     }
 }
/**
 * Drop our custom tables when a mu site is deleted
 *
 * @since  2.5
 * @param  array $tables  The tables to drop
 * @param  int   $blog_id The Blog ID being deleted
 * @return array          The tables to drop
 */
function edd_wpmu_drop_tables($tables, $blog_id)
{
    switch_to_blog($blog_id);
    $customers_db = new EDD_DB_Customers();
    if ($customers_db->installed()) {
        $tables[] = $customers_db->table_name;
    }
    restore_current_blog();
    return $tables;
}