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