PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.6.0
GiveWP – Donation Plugin and Fundraising Platform v2.6.0
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 / actions.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
actions.php
491 lines
1 <?php
2 /**
3 * Admin Payment Actions
4 *
5 * @package Give
6 * @subpackage Admin/Payments
7 * @copyright Copyright (c) 2016, GiveWP
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 /**
18 *
19 * Process the payment details edit
20 *
21 * @since 1.0
22 * @access private
23 *
24 * @param array $data Donation data.
25 *
26 * @return void
27 */
28 function give_update_payment_details( $data ) {
29
30 if ( ! current_user_can( 'edit_give_payments', $data['give_payment_id'] ) ) {
31 wp_die( __( 'You do not have permission to edit payments.', 'give' ), __( 'Error', 'give' ), array( 'response' => 403 ) );
32 }
33
34 check_admin_referer( 'give_update_payment_details_nonce' );
35
36 // Retrieve the payment ID.
37 $payment_id = absint( $data['give_payment_id'] );
38
39 /* @var Give_Payment $payment */
40 $payment = new Give_Payment( $payment_id );
41
42 $status = $data['give-payment-status'];
43 $hour = sanitize_text_field( $data['give-payment-time-hour'] );
44
45 // Restrict to our high and low.
46 if ( $hour > 23 ) {
47 $hour = 23;
48 } elseif ( $hour < 0 ) {
49 $hour = 00;
50 }
51
52 $minute = sanitize_text_field( $data['give-payment-time-min'] );
53
54 // Restrict to our high and low.
55 if ( $minute > 59 ) {
56 $minute = 59;
57 } elseif ( $minute < 0 ) {
58 $minute = 00;
59 }
60
61 $address = give_clean( $data['give-payment-address'][0] );
62
63 $curr_total = $payment->total;
64 $new_total = give_maybe_sanitize_amount( ( ! empty( $data['give-payment-total'] ) ? $data['give-payment-total'] : 0 ) );
65 $date = date( 'Y-m-d', strtotime( give_clean( $data['give-payment-date'] ) ) ) . ' ' . $hour . ':' . $minute . ':00';
66
67 $curr_donor_id = sanitize_text_field( $data['give-current-donor'] );
68 $new_donor_id = sanitize_text_field( $data['donor-id'] );
69
70 /**
71 * Fires before updating edited donation.
72 *
73 * @since 1.0
74 * @since 1.8.9 Changes hook name give_update_edited_purchase -> give_update_edited_donation
75 *
76 * @param int $payment_id The ID of the payment.
77 */
78 do_action( 'give_update_edited_donation', $payment_id );
79
80 $payment->date = $date;
81 $payment->anonymous = isset( $data['give_anonymous_donation'] ) ? absint( $data['give_anonymous_donation'] ) : 0;
82
83
84 $updated = $payment->save();
85
86 if ( 0 === $updated ) {
87 wp_die( __( 'Error Updating Donation.', 'give' ), __( 'Error', 'give' ), array( 'response' => 400 ) );
88 }
89
90 $donor_changed = false;
91
92 if ( isset( $data['give-new-donor'] ) && $data['give-new-donor'] == '1' ) {
93
94 $email = ! empty( $data['give-new-donor-email'] ) ? sanitize_text_field( $data['give-new-donor-email'] ) : '';
95 $first_name = ! empty( $data['give-new-donor-first-name'] ) ? sanitize_text_field( $data['give-new-donor-first-name'] ) : '';
96 $last_name = ! empty( $data['give-new-donor-last-name'] ) ? sanitize_text_field( $data['give-new-donor-last-name'] ) : '';
97 $names = strip_tags( wp_unslash( trim( "{$first_name} {$last_name}" ) ) );
98
99 if ( empty( $email ) || empty( $first_name ) ) {
100 wp_die( __( 'New Donor requires first name and email address.', 'give' ), __( 'Error', 'give' ), array( 'response' => 400 ) );
101 }
102
103 $donor = new Give_Donor( $email );
104 if ( empty( $donor->id ) ) {
105 $donor_data = array( 'name' => $names, 'email' => $email );
106 $user_id = email_exists( $email );
107 if ( false !== $user_id ) {
108 $donor_data['user_id'] = $user_id;
109 }
110
111 if ( ! $donor->create( $donor_data ) ) {
112 // Failed to create the new donor, assume the previous donor.
113 $donor_changed = false;
114 $donor = new Give_Donor( $curr_donor_id );
115 give_set_error( 'give-payment-new-donor-fail', __( 'Error creating new donor.', 'give' ) );
116 }
117 }
118
119 // Create and Update Donor First Name and Last Name in Meta Fields.
120 $donor->update_meta( '_give_donor_first_name', $first_name );
121 $donor->update_meta( '_give_donor_last_name', $last_name );
122
123 $new_donor_id = $donor->id;
124
125 $previous_donor = new Give_Donor( $curr_donor_id );
126
127 $donor_changed = true;
128
129 } elseif ( $curr_donor_id !== $new_donor_id ) {
130
131 $donor = new Give_Donor( $new_donor_id );
132 $email = $donor->email;
133 $names = $donor->name;
134
135 $previous_donor = new Give_Donor( $curr_donor_id );
136
137 $donor_changed = true;
138
139 } else {
140 $donor = new Give_Donor( $curr_donor_id );
141 $email = $donor->email;
142 $names = $donor->name;
143 }
144
145 if ( $donor_changed ) {
146
147 // Setup first and last name from input values.
148 $first_name = $donor->get_first_name();
149 $last_name = $donor->get_last_name();
150
151 $payment->first_name = $first_name;
152 $payment->last_name = $last_name;
153
154 // Remove the stats and payment from the previous donor and attach it to the new donor.
155 $previous_donor->remove_payment( $payment_id, false );
156 $donor->attach_payment( $payment_id, false );
157
158 if ( 'publish' == $status ) {
159
160 // Reduce previous user donation count and amount.
161 $previous_donor->decrease_donation_count();
162 $previous_donor->decrease_value( $curr_total );
163
164 // If donation was completed adjust stats of new donors.
165 $donor->increase_purchase_count();
166 $donor->increase_value( $new_total );
167 }
168
169 $payment->customer_id = $donor->id;
170 } else {
171
172 if ( 'publish' === $status ) {
173 // Update user donation stat.
174 $donor->update_donation_value( $curr_total, $new_total );
175 }
176 }
177
178 // Set new meta values.
179 $payment->user_id = $donor->user_id;
180 $payment->email = $donor->email;
181 $payment->address = $address;
182 $payment->total = $new_total;
183
184 // Check for payment notes.
185 if ( ! empty( $data['give-payment-note'] ) ) {
186
187 $note = wp_kses( $data['give-payment-note'], array() );
188 give_insert_payment_note( $payment_id, $note );
189
190 }
191
192 // Set new status.
193 $payment->status = $status;
194
195 // Adjust total store earnings if the payment total has been changed.
196 if ( $new_total !== $curr_total && 'publish' == $status ) {
197
198 if ( $new_total > $curr_total ) {
199 // Increase if our new total is higher.
200 $difference = $new_total - $curr_total;
201 give_increase_total_earnings( $difference );
202
203 // Increase form earnings.
204 give_increase_earnings( $payment->form_id, $difference, $payment->ID );
205 } elseif ( $curr_total > $new_total ) {
206 // Decrease if our new total is lower.
207 $difference = $curr_total - $new_total;
208 give_decrease_total_earnings( $difference );
209
210 // Decrease form earnings.
211 give_decrease_form_earnings( $payment->form_id, $difference, $payment->ID );
212 }
213 }
214
215 $payment->save();
216
217 // Get new give form ID.
218 $new_form_id = absint( $data['give-payment-form-select'] );
219 $current_form_id = absint( $payment->get_meta( '_give_payment_form_id' ) );
220
221 // We are adding payment transfer code in last to remove any conflict with above functionality.
222 // For example: above code will automatically handle form stat (increase/decrease) when payment status changes.
223 // Check if user want to transfer current payment to new give form id.
224 if ( $new_form_id && $new_form_id != $current_form_id ) {
225
226 // Get new give form title.
227 $new_form_title = get_the_title( $new_form_id );
228
229 // Update payment give form meta data.
230 $payment->update_meta( '_give_payment_form_id', $new_form_id );
231 $payment->update_meta( '_give_payment_form_title', $new_form_title );
232
233 // Update price id payment metadata.
234 if ( ! give_has_variable_prices( $new_form_id ) ) {
235 $payment->update_meta( '_give_payment_price_id', '' );
236 }
237
238 // If donation was completed, adjust stats of forms.
239 if ( 'publish' == $status ) {
240
241 // Decrease sale of old give form. For other payment status.
242 $current_form = new Give_Donate_Form( $current_form_id );
243 $current_form->decrease_sales();
244 $current_form->decrease_earnings( $curr_total, $payment->ID );
245
246 // Increase sale of new give form.
247 $new_form = new Give_Donate_Form( $new_form_id );
248 $new_form->increase_sales();
249 $new_form->increase_earnings( $new_total, $payment->ID );
250 }
251
252 // Re setup payment to update new meta value in object.
253 $payment->update_payment_setup( $payment->ID );
254
255 // Update form id in payment logs.
256 Give()->async_process->data( array(
257 'data' => array( $new_form_id, $payment_id ),
258 'hook' => 'give_update_log_form_id',
259 ) )->dispatch();
260 }
261
262 // Update price id if current form is variable form.
263 /* @var Give_Donate_Form $form */
264 $form = new Give_Donate_Form( $payment->form_id );
265
266 if ( isset( $data['give-variable-price'] ) && $form->has_variable_prices() ) {
267
268 // Get payment meta data.
269 $payment_meta = $payment->get_meta();
270
271 $price_info = array();
272 $price_id = '';
273
274 // Get price info
275 if( 0 <= $data['give-variable-price'] ) {
276 foreach ( $form->prices as $variable_price ) {
277 if( $new_total === give_maybe_sanitize_amount( $variable_price['_give_amount'] ) ) {
278 $price_info = $variable_price;
279 break;
280 }
281 }
282 }
283
284 // Set price id.
285 if( ! empty( $price_info ) ) {
286 $price_id = $data['give-variable-price'];
287
288 if( $data['give-variable-price'] !== $price_info['_give_id']['level_id'] ) {
289 // Set price id to amount match.
290 $price_id = $price_info['_give_id']['level_id'];
291 }
292
293 } elseif( $form->is_custom_price_mode() ){
294 $price_id = 'custom';
295 }
296
297 // Update payment meta data.
298 $payment_meta['price_id'] = $price_id;
299
300 // Update payment give form meta data.
301 $payment->update_meta( '_give_payment_price_id', $price_id );
302 $payment->update_meta( '_give_payment_meta', $payment_meta );
303
304 // Re setup payment to update new meta value in object.
305 $payment->update_payment_setup( $payment->ID );
306 }
307
308 $comment_id = isset( $data['give_comment_id'] ) ? absint( $data['give_comment_id'] ) : 0;
309 $has_anonymous_setting_field = give_is_anonymous_donation_field_enabled( $payment->form_id );
310
311 if ( $has_anonymous_setting_field ) {
312 give_update_meta( $payment->ID, '_give_anonymous_donation', $payment->anonymous );
313 }
314
315 // Update comment.
316 if ( give_is_donor_comment_field_enabled( $payment->form_id ) ) {
317 // We are access comment directly from $_POST because comment formatting remove because of give_clean in give_post_actions.
318 $data['give_comment'] = trim( $_POST['give_comment'] );
319
320 if ( empty( $data['give_comment'] ) ) {
321 // Delete comment if empty
322 Give_Comment::delete( $comment_id, $payment_id, 'payment' );
323 $comment_id = 0;
324
325 } else {
326 $comment_args = array(
327 'comment_author_email' => $payment->email
328 );
329
330 if ( $comment_id ) {
331 $comment_args['comment_ID'] = $comment_id;
332 }
333
334 $comment_id = give_insert_donor_donation_comment(
335 $payment->ID,
336 $payment->donor_id,
337 $data['give_comment'],
338 $comment_args
339 );
340 }
341 }
342
343 // Check if payment status is not completed then update the goal progress for donation form.
344 if ( 'publish' !== $status ) {
345 give_update_goal_progress( $form->ID );
346 }
347
348 /**
349 * Fires after updating edited donation.
350 *
351 * @since 1.0
352 * @since 1.8.9 Changes hook name give_updated_edited_purchase -> give_updated_edited_donation
353 *
354 * @param int $payment_id The ID of the payment.
355 */
356 do_action( 'give_updated_edited_donation', $payment_id );
357
358 wp_safe_redirect( admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&view=view-payment-details&give-messages[]=payment-updated&id=' . $payment_id ) );
359 exit;
360 }
361
362 add_action( 'give_update_payment_details', 'give_update_payment_details' );
363
364 /**
365 * Trigger a Donation Deletion.
366 *
367 * @since 1.0
368 *
369 * @param array $data Arguments passed.
370 *
371 * @return void
372 */
373 function give_trigger_donation_delete( $data ) {
374 if ( wp_verify_nonce( $data['_wpnonce'], 'give_donation_nonce' ) ) {
375
376 $payment_id = absint( $data['purchase_id'] );
377
378 if ( ! current_user_can( 'edit_give_payments', $payment_id ) ) {
379 wp_die( __( 'You do not have permission to edit payments.', 'give' ), __( 'Error', 'give' ), array( 'response' => 403 ) );
380 }
381
382 give_delete_donation( $payment_id );
383 wp_redirect( admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&give-messages[]=donation-deleted' ) );
384 give_die();
385 }
386 }
387
388 add_action( 'give_delete_payment', 'give_trigger_donation_delete' );
389
390 /**
391 * AJAX Store Donation Note
392 */
393 function give_ajax_store_payment_note() {
394 $payment_id = absint( $_POST['payment_id'] );
395 $note = wp_kses( $_POST['note'], array() );
396 $note_type = give_clean( $_POST['type'] );
397
398 if ( ! current_user_can( 'edit_give_payments', $payment_id ) ) {
399 wp_die( __( 'You do not have permission to edit payments.', 'give' ), __( 'Error', 'give' ), array( 'response' => 403 ) );
400 }
401
402 if ( empty( $payment_id ) || empty( $note ) ) {
403 die( '-1' );
404 }
405
406 if ( ! give_has_upgrade_completed( 'v230_move_donor_note' ) ) {
407 // Backward compatibility.
408 $note_id = give_insert_payment_note( $payment_id, $note );
409 } else {
410 $note_id = Give()->comment->db->add(
411 array(
412 'comment_parent' => $payment_id,
413 'user_id' => get_current_user_id(),
414 'comment_content' => $note,
415 'comment_type' => 'donation',
416 )
417 );
418 }
419
420 if( $note_id && $note_type ) {
421
422 if( ! give_has_upgrade_completed('v230_move_donor_note' ) ) {
423 add_comment_meta( $note_id, 'note_type', $note_type, true );
424 } else{
425 Give()->comment->db_meta->update_meta( $note_id, 'note_type', $note_type );
426 }
427
428 /**
429 * Fire the action
430 *
431 * @since 2.3.0
432 */
433 do_action( 'give_donor-note_email_notification', $note_id, $payment_id );
434 }
435
436 die( give_get_payment_note_html( $note_id ) );
437 }
438
439 add_action( 'wp_ajax_give_insert_payment_note', 'give_ajax_store_payment_note' );
440
441 /**
442 * Triggers a donation note deletion without ajax
443 *
444 * @since 1.0
445 *
446 * @param array $data Arguments passed
447 *
448 * @return void
449 */
450 function give_trigger_payment_note_deletion( $data ) {
451
452 if ( ! wp_verify_nonce( $data['_wpnonce'], 'give_delete_payment_note_' . $data['note_id'] ) ) {
453 return;
454 }
455
456 if ( ! current_user_can( 'edit_give_payments', $data['payment_id'] ) ) {
457 wp_die( __( 'You do not have permission to edit payments.', 'give' ), __( 'Error', 'give' ), array( 'response' => 403 ) );
458 }
459
460 $edit_order_url = admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&view=view-payment-details&give-messages[]=donation-note-deleted&id=' . absint( $data['payment_id'] ) );
461
462 give_delete_payment_note( $data['note_id'], $data['payment_id'] );
463
464 wp_redirect( $edit_order_url );
465 }
466
467 add_action( 'give_delete_payment_note', 'give_trigger_payment_note_deletion' );
468
469 /**
470 * Delete a payment note deletion with ajax
471 *
472 * @since 1.0
473 *
474 * @return void
475 */
476 function give_ajax_delete_payment_note() {
477
478 if ( ! current_user_can( 'edit_give_payments', $_POST['payment_id'] ) ) {
479 wp_die( __( 'You do not have permission to edit payments.', 'give' ), __( 'Error', 'give' ), array( 'response' => 403 ) );
480 }
481
482 if ( give_delete_payment_note( $_POST['note_id'], $_POST['payment_id'] ) ) {
483 die( '1' );
484 } else {
485 die( '-1' );
486 }
487
488 }
489
490 add_action( 'wp_ajax_give_delete_payment_note', 'give_ajax_delete_payment_note' );
491