PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.1.0
GiveWP – Donation Plugin and Fundraising Platform v2.1.0
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
311 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 /**
113 * Filter the payment amount.
114 *
115 * @since 2.1
116 */
117 $earning_amount = apply_filters(
118 'give_donation_amount',
119 give_format_amount( $payment->total, array( 'donation_id' => $payment->ID ) ),
120 $payment->total,
121 $payment->ID,
122 array( 'type' => 'stats', 'currency' => false, 'amount' => false )
123 );
124
125 $totals['sales'] ++;
126 $totals['earnings'] += (float) give_maybe_sanitize_amount( $earning_amount );
127
128 }
129
130 $this->store_data( 'give_temp_recount_form_stats', $totals );
131
132 return true;
133 }
134
135
136 give_update_meta( $this->form_id, '_give_form_sales', $totals['sales'] );
137 give_update_meta( $this->form_id, '_give_form_earnings', give_sanitize_amount_for_db( $totals['earnings'] ) );
138
139 return false;
140 }
141
142 /**
143 * Return the calculated completion percentage
144 *
145 * @since 1.5
146 * @return int
147 */
148 public function get_percentage_complete() {
149 if ( $this->step == 1 ) {
150 $this->delete_data( 'give_recount_total_' . $this->form_id );
151 }
152
153 $accepted_statuses = apply_filters( 'give_recount_accepted_statuses', array( 'publish' ) );
154 $total = $this->get_stored_data( 'give_recount_total_' . $this->form_id );
155
156 if ( false === $total ) {
157 $total = 0;
158 $args = apply_filters( 'give_recount_form_stats_total_args', array(
159 'give_forms' => $this->form_id,
160 'number' => - 1,
161 'status' => $accepted_statuses,
162 'fields' => 'ids',
163 ) );
164
165 $payments = new Give_Payments_Query( $args );
166 $total = count( $payments->get_payments() );
167 $this->store_data( 'give_recount_total_' . $this->form_id, $total );
168
169 }
170
171 $percentage = 100;
172
173 if ( $total > 0 ) {
174 $percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
175 }
176
177 if ( $percentage > 100 ) {
178 $percentage = 100;
179 }
180
181 return $percentage;
182 }
183
184 /**
185 * Set the properties specific to the payments export
186 *
187 * @since 1.5
188 *
189 * @param array $request The Form Data passed into the batch processing
190 */
191 public function set_properties( $request ) {
192 $this->form_id = isset( $request['form_id'] ) ? sanitize_text_field( $request['form_id'] ) : false;
193 }
194
195 /**
196 * Process a step
197 *
198 * @since 1.5
199 * @return bool
200 */
201 public function process_step() {
202
203 if ( ! $this->can_export() ) {
204 wp_die( esc_html__( 'You do not have permission to recount stats.', 'give' ), esc_html__( 'Error', 'give' ), array( 'response' => 403 ) );
205 }
206
207 $had_data = $this->get_data();
208
209 if ( $had_data ) {
210 $this->done = false;
211
212 return true;
213 } else {
214 $this->delete_data( 'give_recount_total_' . $this->form_id );
215 $this->delete_data( 'give_temp_recount_form_stats' );
216 $this->done = true;
217 $this->message = sprintf( esc_html__( 'Donation counts and income amount statistics successfully recounted for "%s".', 'give' ), get_the_title( $this->form_id ) );
218
219 return false;
220 }
221 }
222
223 public function headers() {
224 give_ignore_user_abort();
225 }
226
227 /**
228 * Perform the export
229 *
230 * @access public
231 * @since 1.5
232 * @return void
233 */
234 public function export() {
235
236 // Set headers
237 $this->headers();
238
239 give_die();
240 }
241
242 /**
243 * Given a key, get the information from the Database Directly
244 *
245 * @since 1.5
246 *
247 * @param string $key The option_name
248 *
249 * @return mixed Returns the data from the database
250 */
251 private function get_stored_data( $key ) {
252 global $wpdb;
253 $value = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = '%s'", $key ) );
254
255 if ( empty( $value ) ) {
256 return false;
257 }
258
259 $maybe_json = json_decode( $value );
260 if ( ! is_null( $maybe_json ) ) {
261 $value = json_decode( $value, true );
262 }
263
264 return $value;
265 }
266
267 /**
268 * Give a key, store the value
269 *
270 * @since 1.5
271 *
272 * @param string $key The option_name
273 * @param mixed $value The value to store
274 *
275 * @return void
276 */
277 private function store_data( $key, $value ) {
278 global $wpdb;
279
280 $value = is_array( $value ) ? wp_json_encode( $value ) : esc_attr( $value );
281
282 $data = array(
283 'option_name' => $key,
284 'option_value' => $value,
285 'autoload' => 'no',
286 );
287
288 $formats = array(
289 '%s',
290 '%s',
291 '%s',
292 );
293
294 $wpdb->replace( $wpdb->options, $data, $formats );
295 }
296
297 /**
298 * Delete an option
299 *
300 * @since 1.5
301 *
302 * @param string $key The option_name to delete
303 *
304 * @return void
305 */
306 private function delete_data( $key ) {
307 global $wpdb;
308 $wpdb->delete( $wpdb->options, array( 'option_name' => $key ) );
309 }
310
311 }