PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.0.3
GiveWP – Donation Plugin and Fundraising Platform v2.0.3
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / admin / tools / data / class-give-tools-recount-form-stats.php
give / includes / admin / tools / data Last commit date
class-give-tools-delete-import-donors.php 8 years ago class-give-tools-delete-test-donors.php 8 years ago class-give-tools-delete-test-transactions.php 8 years ago class-give-tools-recount-all-stats.php 8 years ago class-give-tools-recount-donor-stats.php 8 years ago class-give-tools-recount-form-stats.php 8 years ago class-give-tools-recount-income.php 8 years ago class-give-tools-recount-single-donor-stats.php 8 years ago class-give-tools-reset-stats.php 8 years ago tools-actions.php 8 years ago
class-give-tools-recount-form-stats.php
298 lines
1 <?php
2 /**
3 * Recount donation form income and donations
4 *
5 * This class handles batch processing of recounting earnings and stats
6 *
7 * @subpackage Admin/Tools/Give_Tools_Recount_Stats
8 * @copyright Copyright (c) 2016, WordImpress
9 * @license https://opensource.org/licenses/gpl-license GNU Public License
10 * @since 1.5
11 */
12
13 // Exit if accessed directly.
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit;
16 }
17
18 /**
19 * Give_Tools_Recount_Form_Stats Class
20 *
21 * @since 1.5
22 */
23 class Give_Tools_Recount_Form_Stats extends Give_Batch_Export {
24
25 /**
26 * Our export type. Used for export-type specific filters/actions
27 * @var string
28 * @since 1.5
29 */
30 public $export_type = '';
31
32 /**
33 * Allows for a non-form batch processing to be run.
34 * @since 1.5
35 * @var boolean
36 */
37 public $is_void = true;
38
39 /**
40 * Sets the number of items to pull on each step
41 * @since 1.5
42 * @var integer
43 */
44 public $per_step = 30;
45
46 /**
47 * Sets the donation form ID to recalculate
48 * @since 1.5
49 * @var integer
50 */
51 protected $form_id = null;
52
53 /**
54 * Constructor.
55 */
56 public function __construct( $_step = 1 ) {
57 parent::__construct( $_step );
58
59 $this->is_writable = true;
60 }
61
62 /**
63 * Get the Export Data
64 *
65 * @access public
66 * @since 1.5
67 *
68 * @return bool
69 */
70 public function get_data() {
71
72 $accepted_statuses = apply_filters( 'give_recount_accepted_statuses', array( 'publish' ) );
73
74 if ( $this->step == 1 ) {
75 $this->delete_data( 'give_temp_recount_form_stats' );
76 }
77
78 $totals = $this->get_stored_data( 'give_temp_recount_form_stats' );
79
80 if ( false === $totals ) {
81 $totals = array(
82 'earnings' => (float) 0,
83 'sales' => 0,
84 );
85 $this->store_data( 'give_temp_recount_form_stats', $totals );
86 }
87
88 $args = apply_filters( 'give_recount_form_stats_args', array(
89 'give_forms' => $this->form_id,
90 'number' => $this->per_step,
91 'status' => $accepted_statuses,
92 'paged' => $this->step,
93 'fields' => 'ids',
94 ) );
95
96 $payments = new Give_Payments_Query( $args );
97 $payments = $payments->get_payments();
98
99 if ( $payments ) {
100 foreach ( $payments as $payment ) {
101
102 // Ensure acceptable status only.
103 if ( ! in_array( $payment->post_status, $accepted_statuses ) ) {
104 continue;
105 }
106
107 // Ensure only payments for this form are counted.
108 if ( $payment->form_id != $this->form_id ) {
109 continue;
110 }
111
112 $totals['sales'] ++;
113 $totals['earnings'] += $payment->total;
114
115 }
116
117 $this->store_data( 'give_temp_recount_form_stats', $totals );
118
119 return true;
120 }
121
122
123 give_update_meta( $this->form_id, '_give_form_sales', $totals['sales'] );
124 give_update_meta( $this->form_id, '_give_form_earnings', give_sanitize_amount_for_db( $totals['earnings'] ) );
125
126 return false;
127 }
128
129 /**
130 * Return the calculated completion percentage
131 *
132 * @since 1.5
133 * @return int
134 */
135 public function get_percentage_complete() {
136 if ( $this->step == 1 ) {
137 $this->delete_data( 'give_recount_total_' . $this->form_id );
138 }
139
140 $accepted_statuses = apply_filters( 'give_recount_accepted_statuses', array( 'publish' ) );
141 $total = $this->get_stored_data( 'give_recount_total_' . $this->form_id );
142
143 if ( false === $total ) {
144 $total = 0;
145 $args = apply_filters( 'give_recount_form_stats_total_args', array(
146 'give_forms' => $this->form_id,
147 'number' => - 1,
148 'status' => $accepted_statuses,
149 'fields' => 'ids',
150 ) );
151
152 $payments = new Give_Payments_Query( $args );
153 $total = count( $payments->get_payments() );
154 $this->store_data( 'give_recount_total_' . $this->form_id, $total );
155
156 }
157
158 $percentage = 100;
159
160 if ( $total > 0 ) {
161 $percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
162 }
163
164 if ( $percentage > 100 ) {
165 $percentage = 100;
166 }
167
168 return $percentage;
169 }
170
171 /**
172 * Set the properties specific to the payments export
173 *
174 * @since 1.5
175 *
176 * @param array $request The Form Data passed into the batch processing
177 */
178 public function set_properties( $request ) {
179 $this->form_id = isset( $request['form_id'] ) ? sanitize_text_field( $request['form_id'] ) : false;
180 }
181
182 /**
183 * Process a step
184 *
185 * @since 1.5
186 * @return bool
187 */
188 public function process_step() {
189
190 if ( ! $this->can_export() ) {
191 wp_die( esc_html__( 'You do not have permission to recount stats.', 'give' ), esc_html__( 'Error', 'give' ), array( 'response' => 403 ) );
192 }
193
194 $had_data = $this->get_data();
195
196 if ( $had_data ) {
197 $this->done = false;
198
199 return true;
200 } else {
201 $this->delete_data( 'give_recount_total_' . $this->form_id );
202 $this->delete_data( 'give_temp_recount_form_stats' );
203 $this->done = true;
204 $this->message = sprintf( esc_html__( 'Donation counts and income amount statistics successfully recounted for "%s".', 'give' ), get_the_title( $this->form_id ) );
205
206 return false;
207 }
208 }
209
210 public function headers() {
211 give_ignore_user_abort();
212 }
213
214 /**
215 * Perform the export
216 *
217 * @access public
218 * @since 1.5
219 * @return void
220 */
221 public function export() {
222
223 // Set headers
224 $this->headers();
225
226 give_die();
227 }
228
229 /**
230 * Given a key, get the information from the Database Directly
231 *
232 * @since 1.5
233 *
234 * @param string $key The option_name
235 *
236 * @return mixed Returns the data from the database
237 */
238 private function get_stored_data( $key ) {
239 global $wpdb;
240 $value = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = '%s'", $key ) );
241
242 if ( empty( $value ) ) {
243 return false;
244 }
245
246 $maybe_json = json_decode( $value );
247 if ( ! is_null( $maybe_json ) ) {
248 $value = json_decode( $value, true );
249 }
250
251 return $value;
252 }
253
254 /**
255 * Give a key, store the value
256 *
257 * @since 1.5
258 *
259 * @param string $key The option_name
260 * @param mixed $value The value to store
261 *
262 * @return void
263 */
264 private function store_data( $key, $value ) {
265 global $wpdb;
266
267 $value = is_array( $value ) ? wp_json_encode( $value ) : esc_attr( $value );
268
269 $data = array(
270 'option_name' => $key,
271 'option_value' => $value,
272 'autoload' => 'no',
273 );
274
275 $formats = array(
276 '%s',
277 '%s',
278 '%s',
279 );
280
281 $wpdb->replace( $wpdb->options, $data, $formats );
282 }
283
284 /**
285 * Delete an option
286 *
287 * @since 1.5
288 *
289 * @param string $key The option_name to delete
290 *
291 * @return void
292 */
293 private function delete_data( $key ) {
294 global $wpdb;
295 $wpdb->delete( $wpdb->options, array( 'option_name' => $key ) );
296 }
297
298 }