PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.2.2
GiveWP – Donation Plugin and Fundraising Platform v2.2.2
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 / export / class-batch-export-donors.php
give / includes / admin / tools / export Last commit date
class-batch-export-donors.php 7 years ago class-batch-export-forms.php 8 years ago class-batch-export.php 8 years ago class-core-settings-export.php 8 years ago class-export-earnings.php 8 years ago class-export.php 8 years ago class-give-export-donations.php 8 years ago export-actions.php 8 years ago export-functions.php 8 years ago give-export-donations-exporter.php 7 years ago give-export-donations-functions.php 7 years ago pdf-reports.php 7 years ago
class-batch-export-donors.php
441 lines
1 <?php
2 /**
3 * Batch Donors Export Class
4 *
5 * This class handles donor export.
6 *
7 * @package Give
8 * @subpackage Admin/Reports
9 * @copyright Copyright (c) 2016, WordImpress
10 * @license https://opensource.org/licenses/gpl-license GNU Public License
11 * @since 1.5
12 */
13
14 // Exit if accessed directly.
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit;
17 }
18
19 /**
20 * Give_Batch_Donors_Export Class
21 *
22 * @since 1.5
23 */
24 class Give_Batch_Donors_Export extends Give_Batch_Export {
25
26 /**
27 * Our export type. Used for export-type specific filters/actions.
28 *
29 * @var string
30 * @since 1.5
31 */
32 public $export_type = 'donors';
33
34 /**
35 * Form submission data
36 *
37 * @var array
38 * @since 1.5
39 */
40 private $data = array();
41
42 /**
43 * Array of donor ids which is already included in csv file.
44 *
45 * @since 1.8
46 * @var array
47 */
48 private $donor_ids = array();
49
50 /**
51 * Array of payment stats which is already included in csv file.
52 *
53 * @since 1.8.9
54 * @var array
55 */
56 private $payment_stats = array();
57
58 /**
59 * Export query id.
60 *
61 * @since 1.8
62 * @var string
63 */
64 private $query_id = '';
65
66 /**
67 * Give_Batch_Export constructor.
68 *
69 * @since 2.1.0
70 *
71 * @param int $_step
72 */
73 public function __construct( $_step = 1 ) {
74
75 parent::__construct( $_step );
76
77 // Filter to change the filename.
78 add_filter( 'give_export_filename', array( $this, 'give_export_filename' ), 10, 2 );
79 }
80
81 /**
82 * Function to change the filename
83 *
84 * @since 2.1.0
85 *
86 * @param string $filename File name.
87 * @param string $export_type export type.
88 *
89 * @return string $filename file name.
90 */
91 public function give_export_filename( $filename, $export_type ) {
92
93 if ( $this->export_type !== $export_type ) {
94 return $filename;
95 }
96
97 $forms = empty( $_GET['forms'] ) ? 0 : absint( $_GET['forms'] );
98
99 if ( $forms ) {
100 $slug = get_post_field( 'post_name', get_post( $forms ) );
101 $filename = 'give-export-donors-' . $slug . '-' . date( 'm-d-Y' );
102 } else {
103 $filename = 'give-export-donors-all-forms-' . date( 'm-d-Y' );
104 }
105
106 return $filename;
107 }
108
109 /**
110 * Set the properties specific to the donors export.
111 *
112 * @since 1.5
113 *
114 * @param array $request The Form Data passed into the batch processing
115 */
116 public function set_properties( $request ) {
117
118 // Set data from form submission
119 if ( isset( $_POST['form'] ) ) {
120 parse_str( $_POST['form'], $this->data );
121 }
122
123 $this->form = $this->data['forms'];
124
125 // Setup donor ids cache.
126 if ( ! empty( $this->form ) ) {
127 // Cache donor ids to output unique list of donor.
128 $this->query_id = give_clean( $_REQUEST['give_export_option']['query_id'] );
129 $this->cache_donor_ids();
130 }
131
132 $this->price_id = ! empty( $request['give_price_option'] ) && 'all' !== $request['give_price_option'] ? absint( $request['give_price_option'] ) : null;
133 }
134
135 /**
136 * Cache donor ids.
137 *
138 * @since 1.8.9
139 * @access private
140 */
141 private function cache_donor_ids() {
142 // Fetch already cached donor ids.
143 $donor_ids = $this->donor_ids;
144
145 if ( $cached_donor_ids = Give_Cache::get( $this->query_id, true ) ) {
146 $donor_ids = array_unique( array_merge( $cached_donor_ids, $this->donor_ids ) );
147 }
148
149 $donor_ids = array_values( $donor_ids );
150 Give_Cache::set( $this->query_id, $donor_ids, HOUR_IN_SECONDS, true );
151 }
152
153 /**
154 * Set the CSV columns.
155 *
156 * @access public
157 * @since 1.5
158 * @return array|bool $cols All the columns.
159 */
160 public function csv_cols() {
161
162 $columns = isset( $this->data['give_export_option'] ) ? $this->data['give_export_option'] : array();
163
164 // We need columns.
165 if ( empty( $columns ) ) {
166 return false;
167 }
168
169 $cols = $this->get_cols( $columns );
170
171 return $cols;
172 }
173
174 /**
175 * CSV file columns.
176 *
177 * @param array $columns
178 *
179 * @return array
180 */
181 private function get_cols( $columns ) {
182
183 $cols = array();
184
185 foreach ( $columns as $key => $value ) {
186
187 switch ( $key ) {
188 case 'full_name' :
189 $cols['full_name'] = esc_html__( 'Full Name', 'give' );
190 break;
191 case 'email' :
192 $cols['email'] = esc_html__( 'Email Address', 'give' );
193 break;
194 case 'address' :
195 $cols['address_line1'] = esc_html__( 'Address', 'give' );
196 $cols['address_line2'] = esc_html__( 'Address 2', 'give' );
197 $cols['address_city'] = esc_html__( 'City', 'give' );
198 $cols['address_state'] = esc_html__( 'State', 'give' );
199 $cols['address_zip'] = esc_html__( 'Zip', 'give' );
200 $cols['address_country'] = esc_html__( 'Country', 'give' );
201 break;
202 case 'userid' :
203 $cols['userid'] = esc_html__( 'User ID', 'give' );
204 break;
205 case 'donor_created_date' :
206 $cols['donor_created_date'] = esc_html__( 'Donor Created Date', 'give' );
207 break;
208 case 'donations' :
209 $cols['donations'] = esc_html__( 'Number of Donations', 'give' );
210 break;
211 case 'donation_sum' :
212 $cols['donation_sum'] = esc_html__( 'Sum of Donations', 'give' );
213 break;
214 }
215 }
216
217 return $cols;
218
219 }
220
221 /**
222 * Get the Export Data
223 *
224 * @access public
225 * @since 1.0
226 *
227 * @return array $data The data for the CSV file.
228 */
229 public function get_data() {
230 $i = 0;
231
232 $data = array();
233 $cached_donor_ids = Give_Cache::get( $this->query_id, true );
234
235 if ( ! empty( $this->form ) ) {
236
237 // Export donors for a specific donation form and also within specified timeframe
238 $args = array(
239 'output' => 'payments', // Use 'posts' to get standard post objects
240 'post_type' => array( 'give_payment' ),
241 'number' => 30,
242 'paged' => $this->step,
243 'status' => 'publish',
244 'meta_key' => '_give_payment_form_id',
245 'meta_value' => absint( $this->form ),
246 );
247
248 // Check for date option filter
249 if ( ! empty( $this->data['donor_export_start_date'] ) || ! empty( $this->data['donor_export_end_date'] ) ) {
250 $args['start_date'] = ! empty( $this->data['donor_export_start_date'] ) ? date( 'Y-n-d 00:00:00', strtotime( $this->data['donor_export_start_date'] ) ) : date( 'Y-n-d 23:59:59', '1970-1-01 00:00:00' );
251 $args['end_date'] = ! empty( $this->data['donor_export_end_date'] ) ? date( 'Y-n-d 23:59:59', strtotime( $this->data['donor_export_end_date'] ) ) : date( 'Y-n-d 23:59:59', current_time( 'timestamp' ) );
252 }
253
254 // Check for price option.
255 if ( null !== $this->price_id ) {
256 $args['meta_query'] = array(
257 array(
258 'key' => '_give_payment_price_id',
259 'value' => (int) $this->price_id,
260 ),
261 );
262 }
263
264 $payments_query = new Give_Payments_Query( $args );
265 $payments = $payments_query->get_payments();
266
267 if ( $payments ) {
268 /* @var Give_Payment $payment */
269 foreach ( $payments as $payment ) {
270 // Set donation sum.
271 $this->payment_stats[ $payment->customer_id ]['donation_sum'] = isset( $this->payment_stats[ $payment->customer_id ]['donation_sum'] ) ?
272 $this->payment_stats[ $payment->customer_id ]['donation_sum'] :
273 0;
274 $this->payment_stats[ $payment->customer_id ]['donation_sum'] += $payment->total;
275
276 // Set donation count.
277 $this->payment_stats[ $payment->customer_id ]['donations'] = isset( $this->payment_stats[ $payment->customer_id ]['donations'] ) ?
278 ++ $this->payment_stats[ $payment->customer_id ]['donations'] :
279 1;
280
281 // Set donation form name.
282 $this->payment_stats[ $payment->customer_id ]['form_title'] = $payment->form_title;
283
284 // Continue if donor already included.
285 if ( empty( $payment->customer_id ) ||
286 in_array( $payment->customer_id, $cached_donor_ids )
287 ) {
288 continue;
289 }
290
291 $this->donor_ids[] = $cached_donor_ids[] = $payment->customer_id;
292
293 $i ++;
294 }
295
296 if ( ! empty( $this->donor_ids ) ) {
297 foreach ( $this->donor_ids as $donor_id ) {
298 $donor = Give()->donors->get_donor_by( 'id', $donor_id );
299 $donor->purchase_count = $this->payment_stats[ $donor_id ]['donations'];
300 $donor->purchase_value = $this->payment_stats[ $donor_id ]['donation_sum'];
301 $data[] = $this->set_donor_data( $i, $data, $donor );
302 }
303
304 // Cache donor ids only if admin export donor for specific form.
305 $this->cache_donor_ids();
306 }
307 }
308 } else {
309
310 // Export all donors.
311 $offset = 30 * ( $this->step - 1 );
312
313 $args = array(
314 'number' => 30,
315 'offset' => $offset,
316 );
317
318 // Check for date option filter
319 if ( ! empty( $this->data['donor_export_start_date'] ) || ! empty( $this->data['donor_export_end_date'] ) ) {
320 $args['date'] = array(
321 'start' => ! empty( $this->data['donor_export_start_date'] ) ? date( 'Y-n-d 00:00:00', strtotime( $this->data['donor_export_start_date'] ) ) : date( 'Y-n-d 23:59:59', '1970-1-01 00:00:00' ),
322 'end' => ! empty( $this->data['donor_export_end_date'] ) ? date( 'Y-n-d 23:59:59', strtotime( $this->data['donor_export_end_date'] ) ) : date( 'Y-n-d 23:59:59', current_time( 'timestamp' ) ),
323 );
324 }
325
326 $donors = Give()->donors->get_donors( $args );
327
328 foreach ( $donors as $donor ) {
329
330 // Continue if donor already included.
331 if ( empty( $donor->id ) || empty( $donor->payment_ids ) ) {
332 continue;
333 }
334
335 $data[] = $this->set_donor_data( $i, $data, $donor );
336 $i ++;
337 }
338 }// End if().
339
340 $data = apply_filters( 'give_export_get_data', $data );
341 $data = apply_filters( "give_export_get_data_{$this->export_type}", $data );
342
343 return $data;
344 }
345
346 /**
347 * Return the calculated completion percentage.
348 *
349 * @since 1.5
350 * @return int
351 */
352 public function get_percentage_complete() {
353
354 $percentage = 0;
355
356 // We can't count the number when getting them for a specific form.
357 if ( empty( $this->form ) ) {
358
359 $total = Give()->donors->count();
360
361 if ( $total > 0 ) {
362
363 $percentage = ( ( 30 * $this->step ) / $total ) * 100;
364
365 }
366 }
367
368 if ( $percentage > 100 ) {
369 $percentage = 100;
370 }
371
372 return $percentage;
373 }
374
375 /**
376 * Set Donor Data
377 *
378 * @param int $i CSV line.
379 * @param array $data Donor CSV data.
380 * @param object $donor Donor data.
381 *
382 * @return mixed
383 */
384 private function set_donor_data( $i, $data, $donor ) {
385
386 $columns = $this->csv_cols();
387
388 // Set address variable.
389 $address = '';
390 if ( isset( $donor->user_id ) && $donor->user_id > 0 ) {
391 $address = give_get_donor_address( $donor->user_id );
392 }
393
394 // Set columns
395 if ( ! empty( $columns['full_name'] ) ) {
396 $donor_name = give_get_donor_name_by( $donor->id, 'donor' );
397 $data[ $i ]['full_name'] = $donor_name;
398 }
399 if ( ! empty( $columns['email'] ) ) {
400 $data[ $i ]['email'] = $donor->email;
401 }
402 if ( ! empty( $columns['address_line1'] ) ) {
403
404 $data[ $i ]['address_line1'] = isset( $address['line1'] ) ? $address['line1'] : '';
405 $data[ $i ]['address_line2'] = isset( $address['line2'] ) ? $address['line2'] : '';
406 $data[ $i ]['address_city'] = isset( $address['city'] ) ? $address['city'] : '';
407 $data[ $i ]['address_state'] = isset( $address['state'] ) ? $address['state'] : '';
408 $data[ $i ]['address_zip'] = isset( $address['zip'] ) ? $address['zip'] : '';
409 $data[ $i ]['address_country'] = isset( $address['country'] ) ? $address['country'] : '';
410 }
411 if ( ! empty( $columns['userid'] ) ) {
412 $data[ $i ]['userid'] = ! empty( $donor->user_id ) ? $donor->user_id : '';
413 }
414 if ( ! empty( $columns['donor_created_date'] ) ) {
415 $data[ $i ]['donor_created_date'] = date_i18n( give_date_format(), strtotime( $donor->date_created ) );
416 }
417 if ( ! empty( $columns['donations'] ) ) {
418 $data[ $i ]['donations'] = $donor->purchase_count;
419 }
420 if ( ! empty( $columns['donation_sum'] ) ) {
421 $data[ $i ]['donation_sum'] = give_format_amount( $donor->purchase_value, array( 'sanitize' => false ) );
422 }
423
424 $data[ $i ] = apply_filters( 'give_export_set_donor_data', $data[ $i ], $donor );
425
426 return $data[ $i ];
427
428 }
429
430 /**
431 * Unset the properties specific to the donors export.
432 *
433 * @param array $request
434 * @param Give_Batch_Export $export
435 */
436 public function unset_properties( $request, $export ) {
437 if ( $export->done ) {
438 Give_Cache::delete( "give_cache_{$this->query_id}" );
439 }
440 }
441 }