PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.3.2
GiveWP – Donation Plugin and Fundraising Platform v2.3.2
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-forms.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
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, 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 = give_get_formatted_date( $start_date );
235 $args['start_date'] = $start_date;
236 }
237
238 // End date.
239 $end_date = ! empty( $this->data['donor_export_end_date'] ) ? sanitize_text_field( $this->data['donor_export_end_date'] ) : date( give_date_format(), current_time( 'timestamp' ) );
240 $end_date = give_get_formatted_date( $end_date );
241 $args['end_date'] = $end_date;
242 }
243
244 // Check for price option.
245 if ( null !== $this->price_id ) {
246 $args['meta_query'] = array(
247 array(
248 'key' => '_give_payment_price_id',
249 'value' => (int) $this->price_id,
250 ),
251 );
252 }
253
254 $payments_query = new Give_Payments_Query( $args );
255 $payments = $payments_query->get_payments();
256
257 if ( $payments ) {
258 /* @var Give_Payment $payment */
259 foreach ( $payments as $payment ) {
260 // Set donation sum.
261 $this->payment_stats[ $payment->customer_id ]['donation_sum'] = isset( $this->payment_stats[ $payment->customer_id ]['donation_sum'] ) ?
262 $this->payment_stats[ $payment->customer_id ]['donation_sum'] :
263 0;
264 $this->payment_stats[ $payment->customer_id ]['donation_sum'] += $payment->total;
265
266 // Set donation count.
267 $this->payment_stats[ $payment->customer_id ]['donations'] = isset( $this->payment_stats[ $payment->customer_id ]['donations'] ) ?
268 ++ $this->payment_stats[ $payment->customer_id ]['donations'] :
269 1;
270
271 // Set donation form name.
272 $this->payment_stats[ $payment->customer_id ]['form_title'] = $payment->form_title;
273
274 // Continue if donor already included.
275 if ( empty( $payment->customer_id ) ||
276 in_array( $payment->customer_id, $cached_donor_ids )
277 ) {
278 continue;
279 }
280
281 $this->donor_ids[] = $cached_donor_ids[] = $payment->customer_id;
282
283 $i ++;
284 }
285
286 if ( ! empty( $this->donor_ids ) ) {
287 foreach ( $this->donor_ids as $donor_id ) {
288 $donor = Give()->donors->get_donor_by( 'id', $donor_id );
289 $donor->purchase_count = $this->payment_stats[ $donor_id ]['donations'];
290 $donor->purchase_value = $this->payment_stats[ $donor_id ]['donation_sum'];
291 $data[] = $this->set_donor_data( $i, $data, $donor );
292 }
293
294 // Cache donor ids only if admin export donor for specific form.
295 $this->cache_donor_ids();
296 }
297 } // End if().
298 } else {
299
300 // Export all donors.
301 $offset = 30 * ( $this->step - 1 );
302
303 $args = array(
304 'number' => 30,
305 'offset' => $offset,
306 );
307
308 // Check for date option filter.
309 if ( ! empty( $this->data['donor_export_start_date'] ) || ! empty( $this->data['donor_export_end_date'] ) ) {
310
311 // Start date.
312 $start_date = ! empty( $this->data['donor_export_start_date'] ) ? sanitize_text_field( $this->data['donor_export_start_date'] ) : '';
313 if ( ! empty( $start_date ) ) {
314 $start_date = give_get_formatted_date( $start_date );
315 $args['date']['start'] = $start_date;
316 }
317
318 // End date.
319 $end_date = ! empty( $this->data['donor_export_end_date'] ) ? sanitize_text_field( $this->data['donor_export_end_date'] ) : date( give_date_format(), current_time( 'timestamp' ) );
320 $end_date = give_get_formatted_date( $end_date );
321 $args['date']['end'] = $end_date;
322
323 }
324
325 $donors = Give()->donors->get_donors( $args );
326
327 foreach ( $donors as $donor ) {
328
329 // Continue if donor already included.
330 if ( empty( $donor->id ) || empty( $donor->payment_ids ) ) {
331 continue;
332 }
333
334 $data[] = $this->set_donor_data( $i, $data, $donor );
335 $i ++;
336 }
337 }// End if().
338
339 $data = apply_filters( 'give_export_get_data', $data );
340 $data = apply_filters( "give_export_get_data_{$this->export_type}", $data );
341
342 return $data;
343 }
344
345 /**
346 * Return the calculated completion percentage.
347 *
348 * @since 1.5
349 * @return int
350 */
351 public function get_percentage_complete() {
352
353 $percentage = 0;
354
355 // We can't count the number when getting them for a specific form.
356 if ( empty( $this->form ) ) {
357
358 $total = Give()->donors->count();
359
360 if ( $total > 0 ) {
361
362 $percentage = ( ( 30 * $this->step ) / $total ) * 100;
363
364 }
365 }
366
367 if ( $percentage > 100 ) {
368 $percentage = 100;
369 }
370
371 return $percentage;
372 }
373
374 /**
375 * Set Donor Data
376 *
377 * @param int $i CSV line.
378 * @param array $data Donor CSV data.
379 * @param object $donor Donor data.
380 *
381 * @return mixed
382 */
383 private function set_donor_data( $i, $data, $donor ) {
384
385 $columns = $this->csv_cols();
386
387 // Set address variable.
388 $address = '';
389 if ( isset( $donor->id ) && $donor->id > 0 ) {
390 $address = give_get_donor_address( $donor->id );
391 }
392
393 // Set columns.
394 if ( ! empty( $columns['full_name'] ) ) {
395 $donor_name = give_get_donor_name_by( $donor->id, 'donor' );
396 $data[ $i ]['full_name'] = $donor_name;
397 }
398 if ( ! empty( $columns['email'] ) ) {
399 $data[ $i ]['email'] = $donor->email;
400 }
401 if ( ! empty( $columns['address_line1'] ) ) {
402
403 $data[ $i ]['address_line1'] = isset( $address['line1'] ) ? $address['line1'] : '';
404 $data[ $i ]['address_line2'] = isset( $address['line2'] ) ? $address['line2'] : '';
405 $data[ $i ]['address_city'] = isset( $address['city'] ) ? $address['city'] : '';
406 $data[ $i ]['address_state'] = isset( $address['state'] ) ? $address['state'] : '';
407 $data[ $i ]['address_zip'] = isset( $address['zip'] ) ? $address['zip'] : '';
408 $data[ $i ]['address_country'] = isset( $address['country'] ) ? $address['country'] : '';
409 }
410 if ( ! empty( $columns['userid'] ) ) {
411 $data[ $i ]['userid'] = ! empty( $donor->user_id ) ? $donor->user_id : '';
412 }
413 if ( ! empty( $columns['donor_created_date'] ) ) {
414 $data[ $i ]['donor_created_date'] = date_i18n( give_date_format(), strtotime( $donor->date_created ) );
415 }
416 if ( ! empty( $columns['donations'] ) ) {
417 $data[ $i ]['donations'] = $donor->purchase_count;
418 }
419 if ( ! empty( $columns['donation_sum'] ) ) {
420 $data[ $i ]['donation_sum'] = give_format_amount( $donor->purchase_value, array( 'sanitize' => false ) );
421 }
422
423 $data[ $i ] = apply_filters( 'give_export_set_donor_data', $data[ $i ], $donor );
424
425 return $data[ $i ];
426
427 }
428
429 /**
430 * Unset the properties specific to the donors export.
431 *
432 * @param array $request
433 * @param Give_Batch_Export $export
434 */
435 public function unset_properties( $request, $export ) {
436 if ( $export->done ) {
437 Give_Cache::delete( "give_cache_{$this->query_id}" );
438 }
439 }
440 }
441