/** * Process Get Stats API Request * * @since 1.1 * * @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, 'form' => null, 'date' => null, 'startdate' => null, 'enddate' => null); $args = wp_parse_args($args, $defaults); $dates = $this->get_dates($args); $stats = array(); $earnings = array('earnings' => array()); $donations = array('donations' => array()); $error = array(); if (!user_can($this->user_id, 'view_give_reports') && !$this->override) { return $stats; } if ($args['type'] == 'donations') { if ($args['form'] == 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!', 'give'); } // Ensure both the start and end date are specified if (empty($args['startdate']) || empty($args['enddate'])) { $error['error'] = __('Invalid or no date range specified!', 'give'); } $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 = give_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 += give_get_sales_by_date(null, $month, $dates['year']); $month++; } $sales['donations'][$args['date']] = $sales_count; } else { $sales['donations'][$args['date']] = give_get_sales_by_date($dates['day'], $dates['m_start'], $dates['year']); } } } elseif ($args['form'] == 'all') { $forms = get_posts(array('post_type' => 'give_forms', 'nopaging' => true)); $i = 0; foreach ($forms as $form_info) { $sales['donations'][$i] = array($form_info->post_name => give_get_form_sales_stats($form_info->ID)); $i++; } } else { if (get_post_type($args['form']) == 'give_forms') { $form_info = get_post($args['form']); $sales['donations'][0] = array($form_info->post_name => give_get_form_sales_stats($args['form'])); } else { $error['error'] = sprintf(__('Product %s not found!', 'give'), $args['form']); } } if (!empty($error)) { return $error; } return $sales; } elseif ($args['type'] == 'earnings') { if ($args['form'] == 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!', 'give'); } // Ensure both the start and end date are specified if (empty($args['startdate']) || empty($args['enddate'])) { $error['error'] = __('Invalid or no date range specified!', 'give'); } $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 = give_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 += give_get_earnings_by_date(null, $month, $dates['year']); $month++; } $earnings['earnings'][$args['date']] = $earnings_count; } else { $earnings['earnings'][$args['date']] = give_get_earnings_by_date($dates['day'], $dates['m_start'], $dates['year']); } } } elseif ($args['form'] == 'all') { $forms = get_posts(array('post_type' => 'give_forms', 'nopaging' => true)); $i = 0; foreach ($forms as $form_info) { $earnings['earnings'][$i] = array($form_info->post_name => give_get_form_earnings_stats($form_info->ID)); $i++; } } else { if (get_post_type($args['form']) == 'give_forms') { $form_info = get_post($args['form']); $earnings['earnings'][0] = array($form_info->post_name => give_get_form_earnings_stats($args['form'])); } else { $error['error'] = sprintf(__('Form %s not found!', 'give'), $args['form']); } } if (!empty($error)) { return $error; } return $earnings; } elseif ($args['type'] == 'donors') { $customers = new Give_DB_Customers(); $stats['donations']['total_donors'] = $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); } }
/** * Draws Chart for PDF Report. * * Draws the sales and earnings chart for the PDF report and then retrieves the * URL of that chart to display on the PDF Report. * * @since 1.1.4.0 * @uses GoogleChart * @uses GoogleChartData * @uses GoogleChartShapeMarker * @uses GoogleChartTextMarker * @uses GoogleChartAxis * @return string $chart->getUrl() URL for the Google Chart */ function give_draw_chart_image() { require_once GIVE_PLUGIN_DIR . '/includes/libraries/googlechartlib/GoogleChart.php'; require_once GIVE_PLUGIN_DIR . '/includes/libraries/googlechartlib/markers/GoogleChartShapeMarker.php'; require_once GIVE_PLUGIN_DIR . '/includes/libraries/googlechartlib/markers/GoogleChartTextMarker.php'; $chart = new GoogleChart('lc', 900, 330); $i = 1; $earnings = ""; $sales = ""; while ($i <= 12) { $earnings .= give_get_earnings_by_date(null, $i, date('Y')) . ","; $sales .= give_get_sales_by_date(null, $i, date('Y')) . ","; $i++; } $earnings_array = explode(",", $earnings); $sales_array = explode(",", $sales); $i = 0; while ($i <= 11) { if (empty($sales_array[$i])) { $sales_array[$i] = 0; } $i++; } $min_earnings = 0; $max_earnings = max($earnings_array); $earnings_scale = round($max_earnings, -1); $data = new GoogleChartData(array($earnings_array[0], $earnings_array[1], $earnings_array[2], $earnings_array[3], $earnings_array[4], $earnings_array[5], $earnings_array[6], $earnings_array[7], $earnings_array[8], $earnings_array[9], $earnings_array[10], $earnings_array[11])); $data->setLegend(esc_html__('Income', 'give')); $data->setColor('1b58a3'); $chart->addData($data); $shape_marker = new GoogleChartShapeMarker(GoogleChartShapeMarker::CIRCLE); $shape_marker->setColor('000000'); $shape_marker->setSize(7); $shape_marker->setBorder(2); $shape_marker->setData($data); $chart->addMarker($shape_marker); $value_marker = new GoogleChartTextMarker(GoogleChartTextMarker::VALUE); $value_marker->setColor('000000'); $value_marker->setData($data); $chart->addMarker($value_marker); $data = new GoogleChartData(array($sales_array[0], $sales_array[1], $sales_array[2], $sales_array[3], $sales_array[4], $sales_array[5], $sales_array[6], $sales_array[7], $sales_array[8], $sales_array[9], $sales_array[10], $sales_array[11])); $data->setLegend(esc_html__('Donations', 'give')); $data->setColor('ff6c1c'); $chart->addData($data); $chart->setTitle(esc_html__('Donations by Month for all Give Forms', 'give'), '336699', 18); $chart->setScale(0, $max_earnings); $y_axis = new GoogleChartAxis('y'); $y_axis->setDrawTickMarks(true)->setLabels(array(0, $max_earnings)); $chart->addAxis($y_axis); $x_axis = new GoogleChartAxis('x'); $x_axis->setTickMarks(5); $x_axis->setLabels(array(esc_html__('Jan', 'give'), esc_html__('Feb', 'give'), esc_html__('Mar', 'give'), esc_html__('Apr', 'give'), esc_html__('May', 'give'), esc_html__('June', 'give'), esc_html__('July', 'give'), esc_html__('Aug', 'give'), esc_html__('Sept', 'give'), esc_html__('Oct', 'give'), esc_html__('Nov', 'give'), esc_html__('Dec', 'give'))); $chart->addAxis($x_axis); $shape_marker = new GoogleChartShapeMarker(GoogleChartShapeMarker::CIRCLE); $shape_marker->setSize(6); $shape_marker->setBorder(2); $shape_marker->setData($data); $chart->addMarker($shape_marker); $value_marker = new GoogleChartTextMarker(GoogleChartTextMarker::VALUE); $value_marker->setData($data); $chart->addMarker($value_marker); return $chart->getUrl(); }
/** * Show report graphs * * @since 1.0 * @return void */ function give_reports_graph() { // Retrieve the queried dates $dates = give_get_report_dates(); // Determine graph options switch ($dates['range']) { case 'today': case 'yesterday': $day_by_day = true; break; case 'last_year': case 'this_year': case 'last_quarter': case 'this_quarter': $day_by_day = false; break; case 'other': if ($dates['m_end'] - $dates['m_start'] >= 2 || $dates['year_end'] > $dates['year'] && ($dates['m_start'] != '12' && $dates['m_end'] != '1')) { $day_by_day = false; } else { $day_by_day = true; } break; default: $day_by_day = true; break; } $earnings_totals = 0.0; // Total earnings for time period shown $sales_totals = 0; // Total sales for time period shown $earnings_data = array(); $sales_data = array(); if ($dates['range'] == 'today' || $dates['range'] == 'yesterday') { // Hour by hour $hour = 1; $month = date('n', current_time('timestamp')); while ($hour <= 23) { $sales = give_get_sales_by_date($dates['day'], $month, $dates['year'], $hour); $earnings = give_get_earnings_by_date($dates['day'], $month, $dates['year'], $hour); $sales_totals += $sales; $earnings_totals += $earnings; $date = mktime($hour, 0, 0, $month, $dates['day'], $dates['year']) * 1000; $sales_data[] = array($date, $sales); $earnings_data[] = array($date, $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) { $sales = give_get_sales_by_date($day, $month, $dates['year']); $sales_totals += $sales; $earnings = give_get_earnings_by_date($day, $month, $dates['year']); $earnings_totals += $earnings; $date = mktime(0, 0, 0, $month, $day, $dates['year']) * 1000; $sales_data[] = array($date, $sales); $earnings_data[] = array($date, $earnings); $day++; } } else { $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']) { $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 ($day_by_day) { if ($i == $month_end) { $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) { $sales = give_get_sales_by_date($d, $i, $y); $sales_totals += $sales; $earnings = give_get_earnings_by_date($d, $i, $y); $earnings_totals += $earnings; $date = mktime(0, 0, 0, $i, $d, $y) * 1000; $sales_data[] = array($date, $sales); $earnings_data[] = array($date, $earnings); $d++; } } else { $sales = give_get_sales_by_date(null, $i, $y); $sales_totals += $sales; $earnings = give_get_earnings_by_date(null, $i, $y); $earnings_totals += $earnings; if ($i == $month_end) { $num_of_days = cal_days_in_month(CAL_GREGORIAN, $i, $y); } else { $num_of_days = 1; } $date = mktime(0, 0, 0, $i, $num_of_days, $y) * 1000; $sales_data[] = array($date, $sales); $earnings_data[] = array($date, $earnings); } $i++; } $y++; } } $data = array(__('Income', 'give') => $earnings_data, __('Donations', 'give') => $sales_data); // start our own output buffer ob_start(); ?> <div id="give-dashboard-widgets-wrap"> <div class="metabox-holder" style="padding-top: 0;"> <div class="postbox"> <div class="inside"> <?php $graph = new Give_Graph($data); $graph->set('x_mode', 'time'); $graph->set('multiple_y_axes', true); $graph->display(); if ('this_month' == $dates['range']) { $estimated = give_estimated_monthly_stats(); } ?> </div> </div> <?php give_reports_graph_controls(); ?> <table class="widefat reports-table alignleft" style="max-width:450px"> <tbody> <tr> <td class="row-title"> <label for="tablecell"><?php _e('Total income for period: ', 'give'); ?> </label></td> <td><?php echo give_currency_filter(give_format_amount($earnings_totals)); ?> </td> </tr> <tr class="alternate"> <td class="row-title"> <label for="tablecell"><?php _e('Total donations for period shown: ', 'give'); ?> </label> </td> <td><?php echo give_format_amount($sales_totals, false); ?> </td> </tr> <?php if ('this_month' == $dates['range']) { ?> <tr> <td class="row-title"> <label for="tablecell"><?php _e('Estimated monthly income: ', 'give'); ?> </label> </td> <td><?php echo give_currency_filter(give_format_amount($estimated['earnings'])); ?> </td> </tr> <tr class="alternate"> <td class="row-title"> <label for="tablecell"><?php _e('Estimated monthly donations: ', 'give'); ?> </label> </td> <td><?php echo give_format_amount($estimated['sales'], false); ?> </td> </tr> <?php } ?> </table> <?php do_action('give_reports_graph_additional_stats'); ?> </div> </div> <?php // get output buffer contents and end our own buffer $output = ob_get_contents(); ob_end_clean(); echo $output; }