PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.4.3
GiveWP – Donation Plugin and Fundraising Platform v2.4.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 / 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.php 7 years ago class-core-settings-export.php 7 years ago class-export-earnings.php 7 years ago class-export.php 7 years ago class-give-export-donations.php 7 years ago export-actions.php 7 years ago export-functions.php 7 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
445 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, GiveWP
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 = give_export_donors_get_default_columns();
163 $cols = $this->get_cols( $columns );
164
165 return $cols;
166 }
167
168 /**
169 * CSV file columns.
170 *
171 * @param array $columns
172 *
173 * @return array
174 */
175 private function get_cols( $columns ) {
176
177 $cols = array();
178
179 foreach ( $columns as $key => $value ) {
180
181 switch ( $key ) {
182
183 case 'address' :
184 $cols['address_line1'] = esc_html__( 'Address', 'give' );
185 $cols['address_line2'] = esc_html__( 'Address 2', 'give' );
186 $cols['address_city'] = esc_html__( 'City', 'give' );
187 $cols['address_state'] = esc_html__( 'State', 'give' );
188 $cols['address_zip'] = esc_html__( 'Zip', 'give' );
189 $cols['address_country'] = esc_html__( 'Country', 'give' );
190 break;
191
192 default:
193 $cols[ $key ] = $value;
194 break;
195 }
196 }
197
198 return $cols;
199
200 }
201
202 /**
203 * Get the Export Data
204 *
205 * @access public
206 * @since 1.0
207 *
208 * @return array $data The data for the CSV file.
209 */
210 public function get_data() {
211 $i = 0;
212
213 $data = array();
214 $cached_donor_ids = Give_Cache::get( $this->query_id, true );
215
216 if ( ! empty( $this->form ) ) {
217
218 // Export donors for a specific donation form and also within specified timeframe.
219 $args = array(
220 'output' => 'payments',
221 'post_type' => array( 'give_payment' ),
222 'number' => 30,
223 'paged' => $this->step,
224 'status' => 'publish',
225 'meta_key' => '_give_payment_form_id',
226 'meta_value' => absint( $this->form ),
227 );
228
229 // Check for date option filter.
230 if ( ! empty( $this->data['donor_export_start_date'] ) || ! empty( $this->data['donor_export_end_date'] ) ) {
231 // Start date.
232 $start_date = ! empty( $this->data['donor_export_start_date'] ) ? sanitize_text_field( $this->data['donor_export_start_date'] ) : '';
233 if ( ! empty( $start_date ) ) {
234 $start_date = date( 'Y-m-d', strtotime( $start_date ) );
235 $args['start_date'] = $start_date;
236 }
237
238 // End date.
239 $end_date = ! empty( $this->data['donor_export_end_date'] )
240 ? date( 'Y-m-d', strtotime( sanitize_text_field( $this->data['donor_export_end_date'] ) ))
241 : date( 'Y-m-d', current_time( 'timestamp' ) );
242 $end_date = "{$end_date} 23:59:59";
243 $args['end_date'] = $end_date;
244 }
245
246 // Check for price option.
247 if ( null !== $this->price_id ) {
248 $args['meta_query'] = array(
249 array(
250 'key' => '_give_payment_price_id',
251 'value' => (int) $this->price_id,
252 ),
253 );
254 }
255
256 $payments_query = new Give_Payments_Query( $args );
257 $payments = $payments_query->get_payments();
258
259 if ( $payments ) {
260 /* @var Give_Payment $payment */
261 foreach ( $payments as $payment ) {
262 // Set donation sum.
263 $this->payment_stats[ $payment->customer_id ]['donation_sum'] = isset( $this->payment_stats[ $payment->customer_id ]['donation_sum'] ) ?
264 $this->payment_stats[ $payment->customer_id ]['donation_sum'] :
265 0;
266 $this->payment_stats[ $payment->customer_id ]['donation_sum'] += $payment->total;
267
268 // Set donation count.
269 $this->payment_stats[ $payment->customer_id ]['donations'] = isset( $this->payment_stats[ $payment->customer_id ]['donations'] ) ?
270 ++ $this->payment_stats[ $payment->customer_id ]['donations'] :
271 1;
272
273 // Set donation form name.
274 $this->payment_stats[ $payment->customer_id ]['form_title'] = $payment->form_title;
275
276 // Continue if donor already included.
277 if ( empty( $payment->customer_id ) ||
278 in_array( $payment->customer_id, $cached_donor_ids )
279 ) {
280 continue;
281 }
282
283 $this->donor_ids[] = $cached_donor_ids[] = $payment->customer_id;
284
285 $i ++;
286 }
287
288 if ( ! empty( $this->donor_ids ) ) {
289 foreach ( $this->donor_ids as $donor_id ) {
290 $donor = Give()->donors->get_donor_by( 'id', $donor_id );
291 $donor->purchase_count = $this->payment_stats[ $donor_id ]['donations'];
292 $donor->purchase_value = $this->payment_stats[ $donor_id ]['donation_sum'];
293 $data[] = $this->set_donor_data( $i, $data, $donor );
294 }
295
296 // Cache donor ids only if admin export donor for specific form.
297 $this->cache_donor_ids();
298 }
299 } // End if().
300 } else {
301
302 // Export all donors.
303 $offset = 30 * ( $this->step - 1 );
304
305 $args = array(
306 'number' => 30,
307 'offset' => $offset,
308 );
309
310 // Check for date option filter.
311 if ( ! empty( $this->data['donor_export_start_date'] ) || ! empty( $this->data['donor_export_end_date'] ) ) {
312
313 // Start date.
314 $start_date = ! empty( $this->data['donor_export_start_date'] ) ? sanitize_text_field( $this->data['donor_export_start_date'] ) : '';
315 if ( ! empty( $start_date ) ) {
316 $start_date = date( 'Y-m-d', strtotime( $start_date ) );
317 $args['date']['start'] = $start_date;
318 }
319
320 // End date.
321 $end_date = ! empty( $this->data['donor_export_end_date'] )
322 ? date( 'Y-m-d', strtotime( sanitize_text_field( $this->data['donor_export_end_date'] ) ))
323 : date( 'Y-m-d', current_time( 'timestamp' ) );
324 $end_date = "{$end_date} 23:59:59";
325 $args['date']['end'] = $end_date;
326
327 }
328
329 $donors = Give()->donors->get_donors( $args );
330
331 foreach ( $donors as $donor ) {
332
333 // Continue if donor already included.
334 if ( empty( $donor->id ) || empty( $donor->payment_ids ) ) {
335 continue;
336 }
337
338 $data[] = $this->set_donor_data( $i, $data, $donor );
339 $i ++;
340 }
341 }// End if().
342
343 $data = apply_filters( 'give_export_get_data', $data );
344 $data = apply_filters( "give_export_get_data_{$this->export_type}", $data );
345
346 return $data;
347 }
348
349 /**
350 * Return the calculated completion percentage.
351 *
352 * @since 1.5
353 * @return int
354 */
355 public function get_percentage_complete() {
356
357 $percentage = 0;
358
359 // We can't count the number when getting them for a specific form.
360 if ( empty( $this->form ) ) {
361
362 $total = Give()->donors->count();
363
364 if ( $total > 0 ) {
365
366 $percentage = ( ( 30 * $this->step ) / $total ) * 100;
367
368 }
369 }
370
371 if ( $percentage > 100 ) {
372 $percentage = 100;
373 }
374
375 return $percentage;
376 }
377
378 /**
379 * Set Donor Data
380 *
381 * @param int $i CSV line.
382 * @param array $data Donor CSV data.
383 * @param object $donor Donor data.
384 *
385 * @return mixed
386 */
387 private function set_donor_data( $i, $data, $donor ) {
388
389 $columns = $this->csv_cols();
390
391 // Set address variable.
392 $address = '';
393 if ( isset( $donor->id ) && $donor->id > 0 ) {
394 $address = give_get_donor_address( $donor->id );
395 }
396
397 // Set columns.
398 if ( ! empty( $columns['full_name'] ) ) {
399 $donor_name = give_get_donor_name_by( $donor->id, 'donor' );
400 $data[ $i ]['full_name'] = $donor_name;
401 }
402 if ( ! empty( $columns['email'] ) ) {
403 $data[ $i ]['email'] = $donor->email;
404 }
405 if ( ! empty( $columns['address_line1'] ) ) {
406
407 $data[ $i ]['address_line1'] = isset( $address['line1'] ) ? $address['line1'] : '';
408 $data[ $i ]['address_line2'] = isset( $address['line2'] ) ? $address['line2'] : '';
409 $data[ $i ]['address_city'] = isset( $address['city'] ) ? $address['city'] : '';
410 $data[ $i ]['address_state'] = isset( $address['state'] ) ? $address['state'] : '';
411 $data[ $i ]['address_zip'] = isset( $address['zip'] ) ? $address['zip'] : '';
412 $data[ $i ]['address_country'] = isset( $address['country'] ) ? $address['country'] : '';
413 }
414 if ( ! empty( $columns['userid'] ) ) {
415 $data[ $i ]['userid'] = ! empty( $donor->user_id ) ? $donor->user_id : '';
416 }
417 if ( ! empty( $columns['donor_created_date'] ) ) {
418 $data[ $i ]['donor_created_date'] = date_i18n( give_date_format(), strtotime( $donor->date_created ) );
419 }
420 if ( ! empty( $columns['donations'] ) ) {
421 $data[ $i ]['donations'] = $donor->purchase_count;
422 }
423 if ( ! empty( $columns['donation_sum'] ) ) {
424 $data[ $i ]['donation_sum'] = give_format_amount( $donor->purchase_value, array( 'sanitize' => false ) );
425 }
426
427 $data[ $i ] = apply_filters( 'give_export_set_donor_data', $data[ $i ], $donor );
428
429 return $data[ $i ];
430
431 }
432
433 /**
434 * Unset the properties specific to the donors export.
435 *
436 * @param array $request
437 * @param Give_Batch_Export $export
438 */
439 public function unset_properties( $request, $export ) {
440 if ( $export->done ) {
441 Give_Cache::delete( "give_cache_{$this->query_id}" );
442 }
443 }
444 }
445