PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.4.0
GiveWP – Donation Plugin and Fundraising Platform v2.4.0
4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 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 / payments / class-payments-table.php
give / includes / admin / payments Last commit date
actions.php 7 years ago class-payments-table.php 7 years ago payments-history.php 7 years ago view-payment-details.php 7 years ago
class-payments-table.php
1036 lines
1 <?php
2 /**
3 * Payment History Table Class
4 *
5 * @package Give
6 * @subpackage Admin/Payments
7 * @copyright Copyright (c) 2016, Give
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 1.0
10 */
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 // Load WP_List_Table if not loaded.
18 if ( ! class_exists( 'WP_List_Table' ) ) {
19 require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
20 }
21
22 /**
23 * Give_Payment_History_Table Class
24 *
25 * Renders the Payment History table on the Payment History page
26 *
27 * @since 1.0
28 */
29 class Give_Payment_History_Table extends WP_List_Table {
30
31 /**
32 * Number of results to show per page
33 *
34 * @var string
35 * @since 1.0
36 */
37 public $per_page = 30;
38
39 /**
40 * URL of this page
41 *
42 * @var string
43 * @since 1.0.1
44 */
45 public $base_url;
46
47 /**
48 * Total number of payments
49 *
50 * @var int
51 * @since 1.0
52 */
53 public $total_count;
54
55 /**
56 * Total number of complete payments
57 *
58 * @var int
59 * @since 1.0
60 */
61 public $complete_count;
62
63 /**
64 * Total number of pending payments
65 *
66 * @var int
67 * @since 1.0
68 */
69 public $pending_count;
70
71 /**
72 * Total number of processing payments
73 *
74 * @var int
75 * @since 1.8.9
76 */
77 public $processing_count;
78
79 /**
80 * Total number of refunded payments
81 *
82 * @var int
83 * @since 1.0
84 */
85 public $refunded_count;
86
87 /**
88 * Total number of failed payments
89 *
90 * @var int
91 * @since 1.0
92 */
93 public $failed_count;
94
95 /**
96 * Total number of revoked payments
97 *
98 * @var int
99 * @since 1.0
100 */
101 public $revoked_count;
102
103 /**
104 * Total number of cancelled payments
105 *
106 * @var int
107 * @since 1.4
108 */
109 public $cancelled_count;
110
111 /**
112 * Total number of abandoned payments
113 *
114 * @var int
115 * @since 1.6
116 */
117 public $abandoned_count;
118
119 /**
120 * Total number of pre-approved payments
121 *
122 * @var int
123 * @since 1.8.13
124 */
125 public $preapproval_count;
126
127 /**
128 * Get things started.
129 *
130 * @since 1.0
131 * @uses Give_Payment_History_Table::get_payment_counts()
132 * @see WP_List_Table::__construct()
133 */
134 public function __construct() {
135
136 // Set parent defaults.
137 parent::__construct(
138 array(
139 'singular' => give_get_forms_label_singular(), // Singular name of the listed records.
140 'plural' => give_get_forms_label_plural(), // Plural name of the listed records.
141 'ajax' => false, // Does this table support ajax?
142 )
143 );
144
145 $this->process_bulk_action();
146 $this->get_payment_counts();
147 $this->base_url = admin_url( 'edit.php?post_type=give_forms&page=give-payment-history' );
148 }
149
150 /**
151 * Add donation search filter.
152 *
153 * @return void
154 */
155 public function advanced_filters() {
156 $start_date = isset( $_GET['start-date'] ) ? give_clean( $_GET['start-date'] ) : null;
157 $end_date = isset( $_GET['end-date'] ) ? give_clean( $_GET['end-date'] ) : null;
158 $status = isset( $_GET['status'] ) ? give_clean( $_GET['status'] ) : '';
159 $donor = isset( $_GET['donor'] ) ? absint( $_GET['donor'] ) : '';
160 $search = isset( $_GET['s'] ) ? give_clean( $_GET['s'] ) : '';
161 $form_id = ! empty( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : 0;
162 $date_format = give_date_format();
163 ?>
164 <div id="give-payment-filters" class="give-filters">
165 <?php $this->search_box( __( 'Search', 'give' ), 'give-payments' ); ?>
166 <div id="give-payment-date-filters">
167 <div class="give-filter give-filter-half">
168 <label for="start-date"
169 class="give-start-date-label"><?php _e( 'Start Date', 'give' ); ?></label>
170 <input type="text" id="start-date" name="start-date" class="give_datepicker" autocomplete="off"
171 value="<?php printf( esc_attr( $start_date ) ); ?>" placeholder="<?php _e( 'Start Date', 'give' ); ?>" />
172 </div>
173 <div class="give-filter give-filter-half">
174 <label for="end-date" class="give-end-date-label"><?php _e( 'End Date', 'give' ); ?></label>
175 <input type="text" id="end-date" name="end-date" class="give_datepicker" autocomplete="off"
176 value="<?php printf( esc_attr( $end_date ) ); ?>" placeholder="<?php _e( 'End Date', 'give' ); ?>" />
177 </div>
178 </div>
179 <div id="give-payment-form-filter" class="give-filter">
180 <label for="give-donation-forms-filter"
181 class="give-donation-forms-filter-label"><?php _e( 'Form', 'give' ); ?></label>
182 <?php
183 // Filter Donations by Donation Forms.
184 echo Give()->html->forms_dropdown(
185 array(
186 'name' => 'form_id',
187 'id' => 'give-donation-forms-filter',
188 'class' => 'give-donation-forms-filter',
189 'selected' => $form_id, // Make sure to have $form_id set to 0, if there is no selection.
190 'chosen' => true,
191 'number' => 30,
192 )
193 );
194 ?>
195 </div>
196
197 <?php
198 /**
199 * Action to add hidden fields and HTML in Payment search.
200 *
201 * @since 1.8.18
202 */
203 do_action( 'give_payment_table_advanced_filters' );
204
205
206 if ( ! empty( $status ) ) {
207 echo sprintf( '<input type="hidden" name="status" value="%s"/>', esc_attr( $status ) );
208 }
209
210 if ( ! empty( $donor ) ) {
211 echo sprintf( '<input type="hidden" name="donor" value="%s"/>', absint( $donor ) );
212 }
213 ?>
214
215 <div class="give-filter">
216 <?php submit_button( __( 'Apply', 'give' ), 'secondary', '', false ); ?>
217 <?php
218 // Clear active filters button.
219 if ( ! empty( $start_date ) || ! empty( $end_date ) || ! empty( $donor ) || ! empty( $search ) || ! empty( $status ) || ! empty( $form_id ) ) :
220 ?>
221 <a href="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-payment-history' ); ?>"
222 class="button give-clear-filters-button"><?php _e( 'Clear Filters', 'give' ); ?></a>
223 <?php endif; ?>
224 </div>
225 </div>
226
227 <?php
228 }
229
230 /**
231 * Show the search field
232 *
233 * @param string $text Label for the search box.
234 * @param string $input_id ID of the search box.
235 *
236 * @since 1.0
237 * @access public
238 *
239 * @return void
240 */
241 public function search_box( $text, $input_id ) {
242 $input_id = $input_id . '-search-input';
243
244 if ( ! empty( $_REQUEST['orderby'] ) ) {
245 echo '<input type="hidden" name="orderby" value="' . esc_attr( $_REQUEST['orderby'] ) . '" />';
246 }
247 if ( ! empty( $_REQUEST['order'] ) ) {
248 echo '<input type="hidden" name="order" value="' . esc_attr( $_REQUEST['order'] ) . '" />';
249 }
250 ?>
251 <div class="give-filter give-filter-search" role="search">
252 <?php
253 /**
254 * Fires in the payment history search box.
255 *
256 * Allows you to add new elements before the search box.
257 *
258 * @since 1.7
259 */
260 do_action( 'give_payment_history_search' );
261 ?>
262 <label class="screen-reader-text" for="<?php echo $input_id ?>"><?php echo $text; ?>:</label>
263 <input type="search" id="<?php echo $input_id ?>" name="s"
264 value="<?php _admin_search_query(); ?>"
265 placeholder="<?php _e( 'Name, Email, or Donation ID', 'give' ); ?>" />
266 <?php submit_button( $text, 'button', false, false, array(
267 'ID' => 'search-submit',
268 ) ); ?><br />
269 </div>
270 <?php
271 }
272
273 /**
274 * Retrieve the view types
275 *
276 * @access public
277 * @since 1.0
278 *
279 * @return array $views All the views available
280 */
281 public function get_views() {
282
283 $current = isset( $_GET['status'] ) ? $_GET['status'] : '';
284 $views = array();
285 $tabs = array(
286 'all' => array(
287 'total_count',
288 __( 'All', 'give' ),
289 ),
290 'publish' => array(
291 'complete_count',
292 __( 'Completed', 'give' ),
293 ),
294 'pending' => array(
295 'pending_count',
296 __( 'Pending', 'give' ),
297 ),
298 'processing' => array(
299 'processing_count',
300 __( 'Processing', 'give' ),
301 ),
302 'refunded' => array(
303 'refunded_count',
304 __( 'Refunded', 'give' ),
305 ),
306 'revoked' => array(
307 'revoked_count',
308 __( 'Revoked', 'give' ),
309 ),
310 'failed' => array(
311 'failed_count',
312 __( 'Failed', 'give' ),
313 ),
314 'cancelled' => array(
315 'cancelled_count',
316 __( 'Cancelled', 'give' ),
317 ),
318 'abandoned' => array(
319 'abandoned_count',
320 __( 'Abandoned', 'give' ),
321 ),
322 'preapproval' => array(
323 'preapproval_count',
324 __( 'Preapproval Pending', 'give' ),
325 ),
326 );
327
328 /**
329 * Remove Query from Args of the URL that are being pass to Donation Status.
330 *
331 * @since 1.8.18
332 */
333 $args = (array) apply_filters( 'give_payments_table_status_remove_query_arg', array( 'paged', '_wpnonce', '_wp_http_referer' ) );
334
335 // Build URL.
336 $staus_url = remove_query_arg( $args );
337
338 foreach ( $tabs as $key => $tab ) {
339 $count_key = $tab[0];
340 $name = $tab[1];
341 $count = $this->$count_key;
342
343 /**
344 * Filter can be used to show all the status inside the donation tabs.
345 *
346 * Filter can be used to show all the status inside the donation submenu tabs return true to show all the tab.
347 *
348 * @param string $key Current view tab value.
349 * @param int $count Number of donation inside the tab.
350 *
351 * @since 1.8.12
352 */
353 if ( 'all' === $key || $key === $current || apply_filters( 'give_payments_table_show_all_status', 0 < $count, $key, $count ) ) {
354
355 $staus_url = 'all' === $key ?
356 add_query_arg( array( 'status' => false ), $staus_url ) :
357 add_query_arg( array( 'status' => $key ), $staus_url );
358
359 $views[ $key ] = sprintf(
360 '<a href="%s"%s>%s&nbsp;<span class="count">(%s)</span></a>',
361 esc_url( $staus_url ),
362 ( ( 'all' === $key && empty( $current ) ) ) ? ' class="current"' : ( $current == $key ? 'class="current"' : '' ),
363 $name,
364 $count
365 );
366 }
367 }
368
369 /**
370 * Filter the donation listing page views.
371 *
372 * @since 1.0
373 *
374 * @param array $views
375 * @param Give_Payment_History_Table
376 */
377 return apply_filters( 'give_payments_table_views', $views, $this );
378 }
379
380 /**
381 * Retrieve the table columns
382 *
383 * @access public
384 * @since 1.0
385 *
386 * @return array $columns Array of all the list table columns
387 */
388 public function get_columns() {
389 $columns = array(
390 'cb' => '<input type="checkbox" />', // Render a checkbox instead of text.
391 'donation' => __( 'Donation', 'give' ),
392 'donation_form' => __( 'Donation Form', 'give' ),
393 'status' => __( 'Status', 'give' ),
394 'date' => __( 'Date', 'give' ),
395 'amount' => __( 'Amount', 'give' ),
396 );
397
398 if ( current_user_can( 'view_give_payments' ) ) {
399 $columns['details'] = __( 'Details', 'give' );
400 }
401
402 return apply_filters( 'give_payments_table_columns', $columns );
403 }
404
405 /**
406 * Retrieve the table's sortable columns
407 *
408 * @access public
409 * @since 1.0
410 *
411 * @return array Array of all the sortable columns
412 */
413 public function get_sortable_columns() {
414 $columns = array(
415 'donation' => array( 'ID', true ),
416 'donation_form' => array( 'donation_form', false ),
417 'status' => array( 'status', false ),
418 'amount' => array( 'amount', false ),
419 'date' => array( 'date', false ),
420 );
421
422 return apply_filters( 'give_payments_table_sortable_columns', $columns );
423 }
424
425 /**
426 * Gets the name of the primary column.
427 *
428 * @since 1.5
429 * @access protected
430 *
431 * @return string Name of the primary column.
432 */
433 protected function get_primary_column_name() {
434 return 'donation';
435 }
436
437 /**
438 * This function renders most of the columns in the list table.
439 *
440 * @param Give_Payment $payment Payment ID.
441 * @param string $column_name The name of the column.
442 *
443 * @access public
444 * @since 1.0
445 *
446 * @return string Column Name
447 */
448 public function column_default( $payment, $column_name ) {
449
450 $single_donation_url = esc_url( add_query_arg( 'id', $payment->ID, admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&view=view-payment-details' ) ) );
451 $row_actions = $this->get_row_actions( $payment );
452 $value = '';
453
454 switch ( $column_name ) {
455 case 'donation' :
456 $serial_code = Give()->seq_donation_number->get_serial_code( $payment );
457 if ( current_user_can( 'view_give_payments' ) ) {
458 $value = Give()->tooltips->render_link( array(
459 'label' => sprintf( __( 'View Donation %s', 'give' ), $serial_code ),
460 'tag_content' => $serial_code,
461 'link' => $single_donation_url,
462 ) );
463 } else {
464 $value = $serial_code;
465 }
466
467 $value .= sprintf(
468 '&nbsp;%1$s&nbsp;%2$s<br>',
469 __( 'by', 'give' ),
470 $this->get_donor( $payment )
471 );
472
473 $value .= $this->get_donor_email( $payment );
474 $value .= $this->row_actions( $row_actions );
475 break;
476
477 case 'amount':
478 $value = give_donation_amount( $payment, true );
479 $value .= sprintf( '<br><small>%1$s %2$s</small>', __( 'via', 'give' ), give_get_gateway_admin_label( $payment->gateway ) );
480 break;
481
482 case 'donation_form':
483 $form_title = empty( $payment->form_title ) ? sprintf( __( 'Untitled (#%s)', 'give' ), $payment->form_id ) : $payment->form_title;
484 $value = '<a href="' . admin_url( 'post.php?post=' . $payment->form_id . '&action=edit' ) . '">' . $form_title . '</a>';
485 $level = give_get_donation_form_title(
486 $payment,
487 array(
488 'only_level' => true,
489 )
490 );
491
492 if ( ! empty( $level ) ) {
493 $value .= $level;
494 }
495
496 break;
497
498 case 'date':
499 $date = strtotime( $payment->date );
500 $value = date_i18n( give_date_format(), $date );
501 break;
502
503 case 'status':
504 $value = $this->get_payment_status( $payment );
505 break;
506
507
508 case 'details' :
509 if ( current_user_can( 'view_give_payments' ) ) {
510 $value = Give()->tooltips->render_link( array(
511 'label' => sprintf( __( 'View Donation #%s', 'give' ), $payment->ID ),
512 'tag_content' => '<span class="dashicons dashicons-visibility"></span>',
513 'link' => $single_donation_url,
514 'attributes' => array(
515 'class' => 'give-payment-details-link button button-small',
516 ),
517 ) );
518
519 $value = "<div class=\"give-payment-details-link-wrap\">{$value}</div>";
520 }
521 break;
522
523 default:
524 $value = isset( $payment->$column_name ) ? $payment->$column_name : '';
525 break;
526
527 }// End switch().
528
529 return apply_filters( 'give_payments_table_column', $value, $payment->ID, $column_name );
530 }
531
532 /**
533 * Get donor email html.
534 *
535 * @param object $payment Contains all the data of the payment.
536 *
537 * @access public
538 * @since 1.0
539 *
540 * @return string Data shown in the Email column
541 */
542 public function get_donor_email( $payment ) {
543
544 $email = give_get_payment_user_email( $payment->ID );
545
546 if ( empty( $email ) ) {
547 $email = __( '(unknown)', 'give' );
548 }
549
550
551 $value = Give()->tooltips->render_link( array(
552 'link' => "mailto:{$email}",
553 'label' => __( 'Email donor', 'give' ),
554 'tag_content' => $email,
555 ) );
556
557 return apply_filters( 'give_payments_table_column', $value, $payment->ID, 'email' );
558 }
559
560 /**
561 * Get Row Actions
562 *
563 * @param object $payment Payment Data.
564 *
565 * @since 1.6
566 *
567 * @return array $actions
568 */
569 function get_row_actions( $payment ) {
570
571 $actions = array();
572 $email = give_get_payment_user_email( $payment->ID );
573
574 // Add search term string back to base URL.
575 $search_terms = ( isset( $_GET['s'] ) ? trim( $_GET['s'] ) : '' );
576 if ( ! empty( $search_terms ) ) {
577 $this->base_url = add_query_arg( 's', $search_terms, $this->base_url );
578 }
579
580 if ( give_is_payment_complete( $payment->ID ) && ! empty( $email ) ) {
581
582 $actions['email_links'] = sprintf(
583 '<a class="resend-single-donation-receipt" href="%1$s" aria-label="%2$s">%3$s</a>', wp_nonce_url(
584 add_query_arg(
585 array(
586 'give-action' => 'email_links',
587 'purchase_id' => $payment->ID,
588 ), $this->base_url
589 ), 'give_payment_nonce'
590 ), sprintf( __( 'Resend Donation %s Receipt', 'give' ), $payment->ID ), __( 'Resend Receipt', 'give' )
591 );
592
593 }
594
595 if ( current_user_can( 'view_give_payments' ) ) {
596 $actions['delete'] = sprintf(
597 '<a class="delete-single-donation" href="%1$s" aria-label="%2$s">%3$s</a>',
598 wp_nonce_url(
599 add_query_arg(
600 array(
601 'give-action' => 'delete_payment',
602 'purchase_id' => $payment->ID,
603 ), $this->base_url
604 ), 'give_donation_nonce'
605 ), sprintf( __( 'Delete Donation %s', 'give' ), $payment->ID ), __( 'Delete', 'give' )
606 );
607 }
608
609 return apply_filters( 'give_payment_row_actions', $actions, $payment );
610 }
611
612
613 /**
614 * Get payment status html.
615 *
616 * @since 1.0
617 * @access public
618 *
619 * @param Give_Payment $payment Contains all the data of the payment.
620 *
621 * @return string Data shown in the Email column
622 */
623 function get_payment_status( $payment ) {
624 $value = sprintf(
625 '<div class="give-donation-status status-%1$s"><span class="give-donation-status-icon"></span>&nbsp;%2$s</div>',
626 $payment->status,
627 give_get_payment_status( $payment, true )
628 );
629
630 if ( $payment->mode == 'test' ) {
631 $value .= Give()->tooltips->render_span( array(
632 'label' => __( 'This donation was made in test mode.', 'give' ),
633 'tag_content' => __( 'Test', 'give' ),
634 'attributes' => array(
635 'class' => 'give-item-label give-item-label-orange give-test-mode-transactions-label',
636 ),
637
638
639 ) );
640 }
641
642 if ( true === $payment->import && true === (bool) apply_filters( 'give_payment_show_importer_label', false ) ) {
643 $value .= sprintf(
644 '&nbsp;<span class="give-item-label give-item-label-orange give-test-mode-transactions-label" data-tooltip="%1$s">%2$s</span>',
645 __( 'This donation was imported.', 'give' ),
646 __( 'Import', 'give' )
647 );
648 }
649
650 return $value;
651 }
652
653 /**
654 * Get checkbox html.
655 *
656 * @param object $payment Contains all the data for the checkbox column.
657 *
658 * @access public
659 * @since 1.0
660 *
661 * @return string Displays a checkbox.
662 */
663 public function column_cb( $payment ) {
664 return sprintf( '<input type="checkbox" name="%1$s[]" value="%2$s" />', 'payment', $payment->ID );
665 }
666
667 /**
668 * Get payment ID html.
669 *
670 * @param object $payment Contains all the data for the checkbox column.
671 *
672 * @access public
673 * @since 1.0
674 *
675 * @return string Displays a checkbox.
676 */
677 public function get_payment_id( $payment ) {
678 return '<span class="give-payment-id">' . give_get_payment_number( $payment->ID ) . '</span>';
679 }
680
681 /**
682 * Get donor html.
683 *
684 * @param object $payment Contains all the data of the payment.
685 *
686 * @access public
687 * @since 1.0
688 *
689 * @return string Data shown in the User column
690 */
691 public function get_donor( $payment ) {
692
693 $donor_id = give_get_payment_donor_id( $payment->ID );
694 $donor_billing_name = give_get_donor_name_by( $payment->ID, 'donation' );
695 $donor_name = give_get_donor_name_by( $donor_id, 'donor' );
696
697 $value = '';
698 if ( ! empty( $donor_id ) ) {
699
700 // Check whether the donor name and WP_User name is same or not.
701 if ( sanitize_title( $donor_billing_name ) !== sanitize_title( $donor_name ) ) {
702 $value .= $donor_billing_name . ' (';
703 }
704
705 $value .= '<a href="' . esc_url( admin_url( "edit.php?post_type=give_forms&page=give-donors&view=overview&id=$donor_id" ) ) . '">' . $donor_name . '</a>';
706
707 // Check whether the donor name and WP_User name is same or not.
708 if ( sanitize_title( $donor_billing_name ) != sanitize_title( $donor_name ) ) {
709 $value .= ')';
710 }
711 } else {
712 $email = give_get_payment_user_email( $payment->ID );
713 $value .= '<a href="' . esc_url( admin_url( "edit.php?post_type=give_forms&page=give-payment-history&s=$email" ) ) . '">' . __( '(donor missing)', 'give' ) . '</a>';
714 }
715
716 return apply_filters( 'give_payments_table_column', $value, $payment->ID, 'donor' );
717 }
718
719 /**
720 * Retrieve the bulk actions
721 *
722 * @access public
723 * @since 1.0
724 *
725 * @return array $actions Array of the bulk actions
726 */
727 public function get_bulk_actions() {
728 $actions = array(
729 'delete' => __( 'Delete', 'give' ),
730 'set-status-publish' => __( 'Set To Completed', 'give' ),
731 'set-status-pending' => __( 'Set To Pending', 'give' ),
732 'set-status-processing' => __( 'Set To Processing', 'give' ),
733 'set-status-refunded' => __( 'Set To Refunded', 'give' ),
734 'set-status-revoked' => __( 'Set To Revoked', 'give' ),
735 'set-status-failed' => __( 'Set To Failed', 'give' ),
736 'set-status-cancelled' => __( 'Set To Cancelled', 'give' ),
737 'set-status-abandoned' => __( 'Set To Abandoned', 'give' ),
738 'set-status-preapproval' => __( 'Set To Preapproval', 'give' ),
739 'resend-receipt' => __( 'Resend Email Receipts', 'give' ),
740 );
741
742 return apply_filters( 'give_payments_table_bulk_actions', $actions );
743 }
744
745 /**
746 * Process the bulk actions
747 *
748 * @access public
749 * @since 1.0
750 *
751 * @return void
752 */
753 public function process_bulk_action() {
754 $ids = isset( $_GET['payment'] ) ? $_GET['payment'] : false;
755 $action = $this->current_action();
756
757 if ( ! is_array( $ids ) ) {
758 $ids = array( $ids );
759 }
760
761 if ( empty( $action ) ) {
762 return;
763 }
764
765 foreach ( $ids as $id ) {
766
767 // Detect when a bulk action is being triggered.
768 switch ( $this->current_action() ) {
769
770 case 'delete':
771 give_delete_donation( $id );
772 break;
773
774 case 'set-status-publish':
775 give_update_payment_status( $id, 'publish' );
776 break;
777
778 case 'set-status-pending':
779 give_update_payment_status( $id, 'pending' );
780 break;
781
782 case 'set-status-processing':
783 give_update_payment_status( $id, 'processing' );
784 break;
785
786 case 'set-status-refunded':
787 give_update_payment_status( $id, 'refunded' );
788 break;
789 case 'set-status-revoked':
790 give_update_payment_status( $id, 'revoked' );
791 break;
792
793 case 'set-status-failed':
794 give_update_payment_status( $id, 'failed' );
795 break;
796
797 case 'set-status-cancelled':
798 give_update_payment_status( $id, 'cancelled' );
799 break;
800
801 case 'set-status-abandoned':
802 give_update_payment_status( $id, 'abandoned' );
803 break;
804
805 case 'set-status-preapproval':
806 give_update_payment_status( $id, 'preapproval' );
807 break;
808
809 case 'resend-receipt':
810 /**
811 * Fire the action
812 *
813 * @since 2.0
814 */
815 do_action( 'give_donation-receipt_email_notification', $id );
816 break;
817 }// End switch().
818
819 /**
820 * Fires after triggering bulk action on payments table.
821 *
822 * @param int $id The ID of the payment.
823 * @param string $current_action The action that is being triggered.
824 *
825 * @since 1.7
826 */
827 do_action( 'give_payments_table_do_bulk_action', $id, $this->current_action() );
828 }// End foreach().
829
830 }
831
832 /**
833 * Retrieve the payment counts
834 *
835 * @access public
836 * @since 1.0
837 *
838 * @return object
839 */
840 public function get_payment_counts() {
841
842 $args = array();
843
844 if ( isset( $_GET['user'] ) ) {
845 $args['user'] = urldecode( $_GET['user'] );
846 } elseif ( isset( $_GET['donor'] ) ) {
847 $args['donor'] = absint( $_GET['donor'] );
848 } elseif ( isset( $_GET['s'] ) ) {
849 $is_user = strpos( $_GET['s'], strtolower( 'user:' ) ) !== false;
850 if ( $is_user ) {
851 $args['user'] = absint( trim( str_replace( 'user:', '', strtolower( $_GET['s'] ) ) ) );
852 unset( $args['s'] );
853 } else {
854 $args['s'] = sanitize_text_field( $_GET['s'] );
855 }
856 }
857
858 if ( ! empty( $_GET['start-date'] ) ) {
859 $args['start-date'] = urldecode( $_GET['start-date'] );
860 }
861
862 if ( ! empty( $_GET['end-date'] ) ) {
863 $args['end-date'] = urldecode( $_GET['end-date'] );
864 }
865
866 $args['form_id'] = ! empty( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : null;
867 $args['gateway'] = ! empty( $_GET['gateway'] ) ? give_clean( $_GET['gateway'] ) : null;
868
869 $payment_count = give_count_payments( $args );
870 $this->complete_count = $payment_count->publish;
871 $this->pending_count = $payment_count->pending;
872 $this->processing_count = $payment_count->processing;
873 $this->refunded_count = $payment_count->refunded;
874 $this->failed_count = $payment_count->failed;
875 $this->revoked_count = $payment_count->revoked;
876 $this->cancelled_count = $payment_count->cancelled;
877 $this->abandoned_count = $payment_count->abandoned;
878 $this->preapproval_count = $payment_count->preapproval;
879
880 foreach ( $payment_count as $count ) {
881 $this->total_count += $count;
882 }
883
884 return $payment_count;
885 }
886
887 /**
888 * Retrieve all the data for all the payments.
889 *
890 * @access public
891 * @since 1.0
892 *
893 * @return array objects in array containing all the data for the payments
894 */
895 public function payments_data() {
896 $per_page = $this->per_page;
897 $orderby = isset( $_GET['orderby'] ) ? urldecode( $_GET['orderby'] ) : 'ID';
898 $order = isset( $_GET['order'] ) ? $_GET['order'] : 'DESC';
899 $user = isset( $_GET['user'] ) ? $_GET['user'] : null;
900 $donor = isset( $_GET['donor'] ) ? $_GET['donor'] : null;
901 $status = isset( $_GET['status'] ) ? $_GET['status'] : give_get_payment_status_keys();
902 $meta_key = isset( $_GET['meta_key'] ) ? $_GET['meta_key'] : null;
903 $year = isset( $_GET['year'] ) ? $_GET['year'] : null;
904 $month = isset( $_GET['m'] ) ? $_GET['m'] : null;
905 $day = isset( $_GET['day'] ) ? $_GET['day'] : null;
906 $search = isset( $_GET['s'] ) ? sanitize_text_field( $_GET['s'] ) : null;
907 $start_date = ! empty ( $_GET['start-date'] ) ? sanitize_text_field( $_GET['start-date'] ) : date( give_date_format(), 0 );
908 $end_date = ! empty( $_GET['end-date'] )
909 ? sanitize_text_field( $_GET['end-date'] )
910 : date( give_date_format(), current_time( 'timestamp' ) );
911 $form_id = ! empty( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : null;
912 $gateway = ! empty( $_GET['gateway'] ) ? give_clean( $_GET['gateway'] ) : null;
913
914 $args = array(
915 'output' => 'payments',
916 'number' => $per_page,
917 'page' => isset( $_GET['paged'] ) ? $_GET['paged'] : null,
918 'orderby' => $orderby,
919 'order' => $order,
920 'user' => $user,
921 'donor' => $donor,
922 'status' => $status,
923 'meta_key' => $meta_key,
924 'year' => $year,
925 'month' => $month,
926 'day' => $day,
927 's' => $search,
928 'start_date' => $start_date,
929 'gateway' => $gateway,
930 'end_date' => $end_date,
931 'give_forms' => $form_id,
932 );
933
934 if ( is_string( $search ) && false !== strpos( $search, 'txn:' ) ) {
935 $args['search_in_notes'] = true;
936 $args['s'] = trim( str_replace( 'txn:', '', $args['s'] ) );
937 }
938
939 /**
940 * Filter to modify payment table argument.
941 *
942 * @since 1.8.18
943 */
944 $args = (array) apply_filters( 'give_payment_table_payments_query', $args );
945
946 $p_query = new Give_Payments_Query( $args );
947
948 return $p_query->get_payments();
949
950 }
951
952 /**
953 * Setup the final data for the table
954 *
955 * @access public
956 * @since 1.0
957 * @uses Give_Payment_History_Table::get_columns()
958 * @uses Give_Payment_History_Table::get_sortable_columns()
959 * @uses Give_Payment_History_Table::payments_data()
960 * @uses WP_List_Table::get_pagenum()
961 * @uses WP_List_Table::set_pagination_args()
962 *
963 * @return void
964 */
965 public function prepare_items() {
966
967 wp_reset_vars( array( 'action', 'payment', 'orderby', 'order', 's' ) );
968
969 $columns = $this->get_columns();
970 $hidden = array(); // No hidden columns.
971 $sortable = $this->get_sortable_columns();
972 $data = $this->payments_data();
973 $status = isset( $_GET['status'] ) ? $_GET['status'] : 'any';
974
975 $this->_column_headers = array( $columns, $hidden, $sortable );
976
977 switch ( $status ) {
978 case 'publish':
979 $total_items = $this->complete_count;
980 break;
981 case 'pending':
982 $total_items = $this->pending_count;
983 break;
984 case 'processing':
985 $total_items = $this->processing_count;
986 break;
987 case 'refunded':
988 $total_items = $this->refunded_count;
989 break;
990 case 'failed':
991 $total_items = $this->failed_count;
992 break;
993 case 'revoked':
994 $total_items = $this->revoked_count;
995 break;
996 case 'cancelled':
997 $total_items = $this->cancelled_count;
998 break;
999 case 'abandoned':
1000 $total_items = $this->abandoned_count;
1001 break;
1002 case 'preapproval':
1003 $total_items = $this->preapproval_count;
1004 break;
1005 case 'any':
1006 $total_items = $this->total_count;
1007 break;
1008 default:
1009 // Retrieve the count of the non-default-Give status.
1010 $count = wp_count_posts( 'give_payment' );
1011 $total_items = isset( $count->{$status} ) ? $count->{$status} : 0;
1012 break;
1013 }
1014
1015 $this->items = $data;
1016
1017 /**
1018 * Filter to modify total count of the pagination.
1019 *
1020 * @since 1.8.19
1021 */
1022 $total_items = (int) apply_filters( 'give_payment_table_pagination_total_count', $total_items, $this );
1023
1024 $this->set_pagination_args(
1025 array(
1026 'total_items' => $total_items,
1027 // We have to calculate the total number of items.
1028 'per_page' => $this->per_page,
1029 // We have to determine how many items to show on a page.
1030 'total_pages' => ceil( $total_items / $this->per_page ),
1031 // We have to calculate the total number of pages.
1032 )
1033 );
1034 }
1035 }
1036