Exemplo n.º 1
0
 /**
  * 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);
     }
 }
Exemplo n.º 2
0
/**
 * 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();
}
Exemplo n.º 3
0
/**
 * 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;
}