PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.24.0
GiveWP – Donation Plugin and Fundraising Platform v2.24.0
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-donations.php 6 years ago class-give-tools-delete-import-donors.php 6 years ago class-give-tools-delete-test-donors.php 6 years ago class-give-tools-delete-test-transactions.php 6 years ago class-give-tools-recount-all-stats.php 6 years ago class-give-tools-recount-donor-stats.php 6 years ago class-give-tools-recount-form-stats.php 5 years ago class-give-tools-recount-income.php 5 years ago class-give-tools-recount-single-donor-stats.php 6 years ago class-give-tools-reset-stats.php 5 years ago tools-actions.php 7 years ago
class-give-tools-recount-form-stats.php
342 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, GiveWP
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 *
28 * @var string
29 * @since 1.5
30 */
31 public $export_type = '';
32
33 /**
34 * Allows for a non-form batch processing to be run.
35 *
36 * @since 1.5
37 * @var boolean
38 */
39 public $is_void = true;
40
41 /**
42 * Sets the number of items to pull on each step
43 *
44 * @since 1.5
45 * @var integer
46 */
47 public $per_step = 30;
48
49 /**
50 * Sets the donation form ID to recalculate
51 *
52 * @since 1.5
53 * @var integer
54 */
55 protected $form_id = 0;
56
57 /**
58 * Constructor.
59 */
60 public function __construct( $_step = 1 ) {
61 parent::__construct( $_step );
62
63 $this->is_writable = true;
64 }
65
66 /**
67 * Get the Export Data
68 *
69 * @access public
70 * @since 1.5
71 *
72 * @return bool
73 */
74 public function get_data() {
75
76 $accepted_statuses = apply_filters( 'give_recount_accepted_statuses', [ 'publish' ] );
77
78 if ( $this->step == 1 ) {
79 $this->delete_data( 'give_temp_recount_form_stats' );
80 }
81
82 $totals = $this->get_stored_data( 'give_temp_recount_form_stats' );
83
84 if ( false === $totals ) {
85 $totals = [
86 'earnings' => (float) 0,
87 'sales' => 0,
88 ];
89 $this->store_data( 'give_temp_recount_form_stats', $totals );
90 }
91
92 $args = apply_filters(
93 'give_recount_form_stats_args',
94 [
95 'give_forms' => $this->form_id,
96 'number' => $this->per_step,
97 'status' => $accepted_statuses,
98 'paged' => $this->step,
99 'fields' => 'ids',
100 ]
101 );
102
103 $payments = new Give_Payments_Query( $args );
104 $payments = $payments->get_payments();
105
106 if ( $payments ) {
107 foreach ( $payments as $payment ) {
108
109 // Ensure acceptable status only.
110 if ( ! in_array( $payment->post_status, $accepted_statuses ) ) {
111 continue;
112 }
113
114 // Ensure only payments for this form are counted.
115 if ( $payment->form_id != $this->form_id ) {
116 continue;
117 }
118
119 $currency_code = give_get_payment_currency_code( $payment->ID );
120
121 /**
122 * Filter the payment amount.
123 *
124 * @since 2.1
125 */
126 $earning_amount = apply_filters(
127 'give_donation_amount',
128 give_format_amount( $payment->total, [ 'donation_id' => $payment->ID ] ),
129 $payment->total,
130 $payment->ID,
131 [
132 'type' => 'stats',
133 'currency' => false,
134 'amount' => false,
135 ]
136 );
137
138 $totals['sales'] ++;
139 $totals['earnings'] += (float) give_maybe_sanitize_amount( $earning_amount, [ 'currency' => $currency_code ] );
140
141 }
142
143 $this->store_data( 'give_temp_recount_form_stats', $totals );
144
145 return true;
146 }
147
148 give_update_meta( $this->form_id, '_give_form_sales', $totals['sales'] );
149 give_update_meta( $this->form_id, '_give_form_earnings', give_sanitize_amount_for_db( $totals['earnings'] ) );
150
151 return false;
152 }
153
154 /**
155 * Return the calculated completion percentage
156 *
157 * @since 1.5
158 * @return int
159 */
160 public function get_percentage_complete() {
161 if ( $this->step == 1 ) {
162 $this->delete_data( 'give_recount_total_' . $this->form_id );
163 }
164
165 $accepted_statuses = apply_filters( 'give_recount_accepted_statuses', [ 'publish' ] );
166 $total = $this->get_stored_data( 'give_recount_total_' . $this->form_id );
167
168 if ( false === $total ) {
169 $total = 0;
170 $args = apply_filters(
171 'give_recount_form_stats_total_args',
172 [
173 'give_forms' => $this->form_id,
174 'number' => - 1,
175 'status' => $accepted_statuses,
176 'fields' => 'ids',
177 ]
178 );
179
180 $payments = new Give_Payments_Query( $args );
181 $total = count( $payments->get_payments() );
182 $this->store_data( 'give_recount_total_' . $this->form_id, $total );
183
184 }
185
186 $percentage = 100;
187
188 if ( $total > 0 ) {
189 $percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
190 }
191
192 if ( $percentage > 100 ) {
193 $percentage = 100;
194 }
195
196 return $percentage;
197 }
198
199 /**
200 * Set the properties specific to the payments export
201 *
202 * @since 1.5
203 *
204 * @param array $request The Form Data passed into the batch processing
205 */
206 public function set_properties( $request ) {
207 $this->form_id = isset( $request['form_id'] ) ? sanitize_text_field( $request['form_id'] ) : false;
208 }
209
210 /**
211 * Process a step
212 *
213 * @since 1.5
214 * @return bool
215 */
216 public function process_step() {
217
218 if ( ! $this->can_export() ) {
219 wp_die( esc_html__( 'You do not have permission to recount stats.', 'give' ), esc_html__( 'Error', 'give' ), [ 'response' => 403 ] );
220 }
221
222 $had_data = $this->get_data();
223
224 if ( $had_data ) {
225 $this->done = false;
226
227 return true;
228 } else {
229 $this->delete_data( 'give_recount_total_' . $this->form_id );
230 $this->delete_data( 'give_temp_recount_form_stats' );
231 $this->done = true;
232 $this->message = sprintf( esc_html__( 'Donation counts and revenue amount statistics successfully recounted for "%s".', 'give' ), get_the_title( $this->form_id ) );
233
234 return false;
235 }
236 }
237
238 public function headers() {
239 give_ignore_user_abort();
240 }
241
242 /**
243 * Perform the export
244 *
245 * @access public
246 * @since 1.5
247 * @return void
248 */
249 public function export() {
250
251 // Set headers
252 $this->headers();
253
254 give_die();
255 }
256
257 /**
258 * Given a key, get the information from the Database Directly
259 *
260 * @since 1.5
261 *
262 * @param string $key The option_name
263 *
264 * @return mixed Returns the data from the database
265 */
266 private function get_stored_data( $key ) {
267 global $wpdb;
268 $value = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = '%s'", $key ) );
269
270 if ( empty( $value ) ) {
271 return false;
272 }
273
274 $maybe_json = json_decode( $value );
275 if ( ! is_null( $maybe_json ) ) {
276 $value = json_decode( $value, true );
277 }
278
279 return $value;
280 }
281
282 /**
283 * Give a key, store the value
284 *
285 * @since 1.5
286 *
287 * @param string $key The option_name
288 * @param mixed $value The value to store
289 *
290 * @return void
291 */
292 private function store_data( $key, $value ) {
293 global $wpdb;
294
295 $value = is_array( $value ) ? wp_json_encode( $value ) : esc_attr( $value );
296
297 $data = [
298 'option_name' => $key,
299 'option_value' => $value,
300 'autoload' => 'no',
301 ];
302
303 $formats = [
304 '%s',
305 '%s',
306 '%s',
307 ];
308
309 $wpdb->replace( $wpdb->options, $data, $formats );
310 }
311
312 /**
313 * Delete an option
314 *
315 * @since 1.5
316 *
317 * @param string $key The option_name to delete
318 *
319 * @return void
320 */
321 private function delete_data( $key ) {
322 global $wpdb;
323 $wpdb->delete( $wpdb->options, [ 'option_name' => $key ] );
324 }
325
326 /**
327 * Unset the properties specific to the donors export.
328 *
329 * @since 2.3.0
330 *
331 * @param array $request
332 * @param Give_Batch_Export $export
333 */
334 public function unset_properties( $request, $export ) {
335 if ( $export->done ) {
336 // Delete all the donation ids.
337 $this->delete_data( 'give_temp_recount_form_stats' );
338 $this->delete_data( 'give_recount_total_' . $this->form_id );
339 }
340 }
341 }
342