PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.8
4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 All 139 releases
learnpress / inc / Ajax / Order / RefundOrderAjax.php

RefundOrderAjax.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.8, at inc/Ajax/Order/RefundOrderAjax.php

167 lines 5.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace LearnPress\Ajax\Order;
4 use LearnPress\Ajax\AbstractAjax;
5 use LearnPress\Helpers\Response;
6 use LearnPress\Models\UserModel;
7 use LP_Datetime;
8 use LP_Helper;
9 use LP_Order;
10 use LP_Request;
11 use WP_Error;
12 use Exception;
13 use Throwable;
14
15 defined( 'ABSPATH' ) || exit;
16
17 /**
18 * class RefundOrderAjax
19 *
20 * @since 4.4.0
21 * @version 1.0.0
22 */
23 class RefundOrderAjax extends AbstractAjax {
24 /**
25 * Customer request refund order from profile page.
26 *
27 * @since 4.4.0
28 * @version 1.0.0
29 *
30 * @return void
31 */
32 public function request_refund_order() {
33 $response = new Response();
34
35 try {
36 $userModel = UserModel::find( get_current_user_id(), true );
37 if ( ! $userModel ) {
38 throw new Exception( __( 'Invalid user.', 'learnpress' ) );
39 }
40
41 $params = LP_Helper::json_decode( LP_Request::get_param( 'data' ), true );
42 $order_id = absint( $params['order_id'] ?? 0 );
43 $reason = LP_Helper::sanitize_params_submitted( $params['reason'] ?? '' );
44
45 $lp_order = learn_press_get_order( $order_id );
46 if ( ! $lp_order ) {
47 throw new Exception( __( 'Invalid order.', 'learnpress' ) );
48 }
49
50 $order_users = $lp_order->get_users();
51 if ( ! in_array( $userModel->get_id(), $order_users ) ) {
52 throw new Exception( __( 'Invalid order.', 'learnpress' ) );
53 }
54
55 // Check valid refund request
56 $lp_order->can_send_request_refund( $userModel );
57
58 $can_refund = $lp_order->can_refund();
59 if ( $can_refund instanceof WP_Error ) {
60 throw new Exception( $can_refund->get_error_message() );
61 }
62
63 if ( ! empty( $reason ) ) {
64 update_post_meta( $order_id, LP_Order::META_KEY_REFUND_REQUEST_REASON, $reason );
65 }
66
67 $request_time = gmdate( LP_Datetime::$format, time() );
68 update_post_meta( $order_id, '_lp_refund_requested_at', $request_time );
69
70 $auto_refund = learn_press_get_refund_setting( 'auto_refund', 'no' ) === 'yes';
71 if ( $auto_refund ) {
72 $lp_order->refund( $lp_order->get_total() );
73 update_post_meta( $order_id, '_lp_refund_request', 'auto-approved' );
74 $response->message = sprintf( __( 'Order #%s has been refunded.', 'learnpress' ), $lp_order->get_order_number() );
75 } else {
76 update_post_meta( $order_id, '_lp_refund_request', 'pending' );
77 $lp_order->add_note(
78 sprintf(
79 __( 'Refund request submitted by customer %1$s(#%2$d) and waiting for admin review. %3$s', 'learnpress' ),
80 $userModel->get_display_name(),
81 $userModel->get_id(),
82 sprintf( __( 'Reason: %s', 'learnpress' ), $reason )
83 )
84 );
85 $response->message = __( 'Your refund request has been sent to the admin for review.', 'learnpress' );
86 do_action( 'learn-press/order/refund-requested', $order_id );
87 }
88
89 $response->status = Response::STATUS_SUCCESS;
90 } catch ( Throwable $e ) {
91 $response->message = $e->getMessage();
92 }
93
94 wp_send_json( $response );
95 }
96
97 /**
98 * Process admin approve/deny refund request via AJAX.
99 *
100 * @since 4.3.5
101 * @version 1.0.1
102 *
103 * @return void
104 */
105 public function admin_handle_request_refund() {
106 $response = new Response();
107
108 try {
109 if ( ! current_user_can( UserModel::ROLE_ADMINISTRATOR ) ) {
110 throw new Exception( __( 'You do not have permission to refund this order.', 'learnpress' ) );
111 }
112
113 $params = LP_Helper::json_decode( LP_Request::get_param( 'data' ), true );
114 if ( ! is_array( $params ) ) {
115 throw new Exception( __( 'Invalid refund review request.', 'learnpress' ) );
116 }
117
118 $order_id = absint( $params['order_id'] ?? 0 );
119 $action = sanitize_key( $params['refund_action'] ?? '' );
120 $refund_amount = round( floatval( $params['refund_amount'] ?? 0 ), 2 );
121 $note = sanitize_textarea_field( $params['note'] ?? '' );
122
123 $lp_order = learn_press_get_order( $order_id );
124 if ( ! $lp_order ) {
125 throw new Exception( __( 'Order not found.', 'learnpress' ) );
126 }
127
128 $request_status = $lp_order->get_refund_request();
129 if ( 'pending' !== $request_status ) {
130 throw new Exception( __( 'Refund invalid!.', 'learnpress' ) );
131 }
132
133 $admin_id = get_current_user_id();
134 update_post_meta( $order_id, '_lp_refund_reviewed_by', $admin_id );
135 if ( ! empty( $note ) ) {
136 $lp_order->add_note( sprintf( '%s %s', __( 'Reason', 'learnpress' ), $note ) );
137 }
138
139 if ( 'approve' === $action ) {
140 $lp_order->refund( $refund_amount );
141 update_post_meta( $order_id, '_lp_refund_request', 'approved' );
142 $response->message = __( 'Refund approved successfully.', 'learnpress' );
143 } elseif ( 'reject' === $action ) {
144 update_post_meta( $order_id, '_lp_refund_request', 'rejected' );
145 update_post_meta( $order_id, '_lp_refund_reviewed_at', current_time( 'mysql' ) );
146
147 $lp_order->add_note(
148 sprintf(
149 __( 'Refund request rejected by admin(#%d).', 'learnpress' ),
150 $admin_id
151 )
152 );
153
154 $response->message = __( 'Refund request rejected.', 'learnpress' );
155 } else {
156 throw new Exception( __( 'Invalid refund review action.', 'learnpress' ) );
157 }
158
159 $response->status = Response::STATUS_SUCCESS;
160 } catch ( Throwable $e ) {
161 $response->message = $e->getMessage();
162 }
163
164 wp_send_json( $response );
165 }
166 }
167