PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.9.10
Tutor LMS – eLearning and online course solution v3.9.10
3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / classes / Withdraw.php
tutor / classes Last commit date
Addons.php 11 months ago Admin.php 2 months ago Ajax.php 9 months ago Announcements.php 1 year ago Assets.php 2 months ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Config.php 11 months ago Container.php 11 months ago Course.php 2 months ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 5 months ago Course_Settings_Tabs.php 1 year ago Course_Widget.php 1 year ago Custom_Validation.php 3 years ago Dashboard.php 1 year ago Earnings.php 9 months ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Icon.php 8 months ago Input.php 1 year ago Instructor.php 2 months ago Instructors_List.php 2 months ago Lesson.php 8 months ago Options_V2.php 7 months ago Permalink.php 2 years ago Post_types.php 1 year ago Private_Course_Access.php 1 year ago Q_And_A.php 10 months ago Question_Answers_List.php 11 months ago Quiz.php 5 months ago QuizBuilder.php 3 months ago Quiz_Attempts_List.php 9 months ago RestAPI.php 2 years ago Reviews.php 9 months ago Rewrite_Rules.php 2 years ago Shortcode.php 9 months ago Singleton.php 1 year ago Student.php 2 months ago Students_List.php 1 year ago Taxonomies.php 1 year ago Template.php 9 months ago Theme_Compatibility.php 3 years ago Tools.php 1 year ago Tools_V2.php 1 year ago Tutor.php 2 months ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 8 months ago Upgrader.php 9 months ago User.php 4 months ago Utils.php 2 months ago Video_Stream.php 3 years ago WhatsNew.php 9 months ago Withdraw.php 1 year ago Withdraw_Requests_List.php 11 months ago WooCommerce.php 7 months ago
Withdraw.php
324 lines
1 <?php
2 /**
3 * Withdraw class
4 *
5 * @package Tutor\Withdraw
6 * @author Themeum <support@themeum.com>
7 * @link https://themeum.com
8 * @since 1.0.0
9 */
10
11 namespace TUTOR;
12
13 use Tutor\Models\WithdrawModel;
14
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit;
17 }
18
19 /**
20 * Withdraw class
21 *
22 * @since 1.0.0
23 */
24 class Withdraw {
25
26 /**
27 * Withdraw method
28 *
29 * @since 1.0.0
30 *
31 * @var mixed
32 */
33 public $withdraw_methods;
34
35 /**
36 * Register hooks
37 *
38 * @since 1.0.0
39 */
40 public function __construct() {
41 add_action( 'wp_ajax_tutor_save_withdraw_account', array( $this, 'tutor_save_withdraw_account' ) );
42 add_action( 'wp_ajax_tutor_make_an_withdraw', array( $this, 'tutor_make_an_withdraw' ) );
43 add_filter( 'tutor_withdrawal_methods_all', array( $this, 'withdraw_methods_all' ) );
44 add_filter( 'tutor_withdrawal_methods_available', array( $this, 'withdraw_methods_available' ) );
45 }
46
47 /**
48 * Available withdraw methods
49 *
50 * @since 1.0.0
51 *
52 * @return array
53 */
54 public function withdraw_methods_all() {
55
56 $this->migrate_withdrawal_method_data();
57
58 $methods = array(
59 'bank_transfer_withdraw' => array(
60 'method_name' => __( 'Bank Transfer', 'tutor' ),
61 'image' => tutor()->url . 'assets/images/payment-bank.png',
62 'desc' => __( 'Get your payment directly into your bank account', 'tutor' ),
63
64 'form_fields' => array(
65 'account_name' => array(
66 'type' => 'text',
67 'label' => __( 'Account Name', 'tutor' ),
68 ),
69 'account_number' => array(
70 'type' => 'text',
71 'label' => __( 'Account Number', 'tutor' ),
72 ),
73 'bank_name' => array(
74 'type' => 'text',
75 'label' => __( 'Bank Name', 'tutor' ),
76 ),
77 'iban' => array(
78 'type' => 'text',
79 'label' => __( 'IBAN', 'tutor' ),
80 ),
81 'swift' => array(
82 'type' => 'text',
83 'label' => __( 'BIC / SWIFT', 'tutor' ),
84 ),
85
86 ),
87 ),
88
89 'echeck_withdraw' => array(
90 'method_name' => __( 'E-Check', 'tutor' ),
91 'image' => tutor()->url . 'assets/images/payment-echeck.png',
92 'form_fields' => array(
93 'physical_address' => array(
94 'type' => 'text',
95 'label' => __( 'Your Physical Address', 'tutor' ),
96 'desc' => __( 'We will send you an E-Check to this address directly.', 'tutor' ),
97 ),
98 ),
99 ),
100
101 'paypal_withdraw' => array(
102 'method_name' => __( 'PayPal', 'tutor' ),
103 'image' => tutor()->url . 'assets/images/payment-paypal.png',
104 'form_fields' => array(
105 'paypal_email' => array(
106 'type' => 'email',
107 'label' => __( 'PayPal E-Mail Address', 'tutor' ),
108 'desc' => __( 'We will use this email address to send the money to your Paypal account', 'tutor' ),
109 ),
110
111 ),
112 ),
113 );
114
115 $saved_options = (array) get_option( 'tutor_option', array() );
116 $withdrawal_payment_methods = $saved_options['tutor_withdrawal_methods'] ?? array();
117 foreach ( $methods as $key => $method ) {
118 $methods[ $key ]['enabled'] = in_array( $key, $withdrawal_payment_methods, true );
119 }
120
121 return apply_filters( 'tutor_withdraw_methods', $methods );
122 }
123
124 /**
125 * Withdraw method's tab
126 *
127 * @return void
128 */
129 private function migrate_withdrawal_method_data() {
130 $old_data = get_option( 'tutor_withdraw_options', null );
131
132 if ( ! $old_data ) {
133 // Return if already migrated.
134 return;
135 }
136
137 $withdraw_options = (array) maybe_unserialize( $old_data );
138 $new_methods_array = array();
139
140 foreach ( $withdraw_options as $key => $option ) {
141 if ( is_array( $option ) ) {
142
143 // Set enable state.
144 if ( isset( $option['enabled'] ) ) {
145 $option['enabled'] ? $new_methods_array[] = $key : 0;
146 }
147
148 // Set instruction.
149 if ( isset( $option['instruction'] ) ) {
150 tutor_utils()->update_option( 'tutor_' . $key . '_instruction', $option['instruction'] );
151 }
152 }
153 }
154
155 // Update new.
156 tutor_utils()->update_option( 'tutor_withdrawal_methods', $new_methods_array );
157
158 // Delete old.
159 delete_option( 'tutor_withdraw_options' );
160 }
161
162 /**
163 * Return only enabled methods
164 *
165 * @since 1.0.0
166 *
167 * @return mixed|array
168 */
169 public function withdraw_methods_available() {
170 $methods = $this->withdraw_methods_all();
171 $withdraw_options = tutor_utils()->get_option( 'tutor_withdrawal_methods', array() );
172
173 foreach ( $methods as $method_id => $method ) {
174 if ( ! in_array( $method_id, $withdraw_options ) ) {
175 // Remove the unavailable methods from array.
176 unset( $methods[ $method_id ] );
177 }
178 }
179
180 return $methods;
181 }
182
183 /**
184 * Save Withdraw Method Data
185 *
186 * @since 1.2.0
187 *
188 * @return void send wp_json response
189 */
190 public function tutor_save_withdraw_account() {
191 // Checking nonce.
192 tutor_utils()->checking_nonce();
193
194 //phpcs:disable WordPress.Security.NonceVerification.Missing -- nonce already verified
195 $user_id = get_current_user_id();
196 $method = sanitize_text_field( tutor_utils()->avalue_dot( 'tutor_selected_withdraw_method', $_POST ) );
197 if ( ! $method ) {
198 wp_send_json_error();
199 }
200
201 $method_data = tutor_utils()->avalue_dot( 'withdraw_method_field.' . $method, $_POST );
202 $available_withdraw_method = $this->withdraw_methods_all();
203
204 if ( tutor_utils()->count( $method_data ) ) {
205 $saved_data = array();
206 $saved_data['withdraw_method_key'] = $method;
207 $saved_data['withdraw_method_name'] = tutor_utils()->avalue_dot( $method . '.method_name', $available_withdraw_method );
208
209 foreach ( $method_data as $input_name => $value ) {
210 $saved_data[ $input_name ]['value'] = esc_sql( sanitize_text_field( $value ) );
211 $saved_data[ $input_name ]['label'] = tutor_utils()->avalue_dot( $method . ".form_fields.{$input_name}.label", $available_withdraw_method );
212 }
213
214 update_user_meta( $user_id, '_tutor_withdraw_method_data', $saved_data );
215 update_user_meta( $user_id, '_tutor_withdraw_selected_method', $method );
216 update_user_meta( $user_id, '_tutor_withdraw_method_data_' . $method, $saved_data );
217 }
218
219 $msg = apply_filters( 'tutor_withdraw_method_set_success_msg', __( 'Withdrawal information saved!', 'tutor' ) );
220 wp_send_json_success( array( 'msg' => $msg ) );
221 }
222
223 /**
224 * Handle withdraw request form submit
225 *
226 * @since 1.0.0
227 *
228 * @return void
229 */
230 public function tutor_make_an_withdraw() {
231 global $wpdb;
232
233 tutor_utils()->checking_nonce();
234
235 $user_id = get_current_user_id();
236 $withdraw_amount = Input::post( 'tutor_withdraw_amount' );
237
238 $earning_summary = WithdrawModel::get_withdraw_summary( $user_id );
239 $min_withdraw = tutor_utils()->get_option( 'min_withdraw_amount' );
240
241 if ( ( $earning_summary->total_pending + $withdraw_amount ) > $earning_summary->available_for_withdraw ) {
242 wp_send_json_error(
243 array(
244 'msg' => wp_sprintf(
245 /* translators: 1: total pending withdraw request 2: available for withdraw */
246 __( "You have total %1\$s pending withdraw request. You can't make more than %2\$s withdraw request at a time", 'tutor' ),
247 $earning_summary->total_pending,
248 $earning_summary->available_for_withdraw
249 ),
250 )
251 );
252 }
253
254 $saved_withdraw_account = WithdrawModel::get_user_withdraw_method();
255 $formatted_min_withdraw_amount = tutor_utils()->tutor_price( $min_withdraw );
256
257 if ( ! tutor_utils()->count( $saved_withdraw_account ) ) {
258 $no_withdraw_method = apply_filters( 'tutor_no_withdraw_method_msg', __( 'Please save withdraw method ', 'tutor' ) );
259 wp_send_json_error( array( 'msg' => $no_withdraw_method ) );
260 }
261
262 if ( ( ! is_numeric( $withdraw_amount ) && ! is_float( $withdraw_amount ) ) || $withdraw_amount < $min_withdraw ) {
263 /* translators: 1: strong tag start 2: min withdrawal amount 3: strong tag end */
264 $required_min_withdraw = apply_filters( 'tutor_required_min_amount_msg', sprintf( __( 'Minimum withdrawal amount is %1$s %2$s %3$s ', 'tutor' ), '<strong>', $formatted_min_withdraw_amount, '</strong>' ) );
265 wp_send_json_error( array( 'msg' => $required_min_withdraw ) );
266 }
267
268 if ( $earning_summary->available_for_withdraw < $withdraw_amount ) {
269 $insufficient_balence = apply_filters( 'tutor_withdraw_insufficient_balance_msg', __( 'Insufficient balance.', 'tutor' ) );
270
271 wp_send_json_error( array( 'msg' => $insufficient_balence ) );
272 }
273
274 $date = gmdate( 'Y-m-d H:i:s', tutor_time() );
275
276 $withdraw_data = apply_filters(
277 'tutor_pre_withdraw_data',
278 array(
279 'user_id' => $user_id,
280 'amount' => $withdraw_amount,
281 'method_data' => maybe_serialize( $saved_withdraw_account ),
282 'status' => 'pending',
283 'created_at' => $date,
284 )
285 );
286
287 $date = gmdate( 'Y-m-d H:i:s', tutor_time() );
288
289 $withdraw_data = apply_filters(
290 'tutor_pre_withdraw_data',
291 array(
292 'user_id' => $user_id,
293 'amount' => $withdraw_amount,
294 'method_data' => maybe_serialize( $saved_withdraw_account ),
295 'status' => 'pending',
296 'created_at' => $date,
297 )
298 );
299
300 do_action( 'tutor_insert_withdraw_before', $withdraw_data );
301
302 $wpdb->insert( $wpdb->prefix . 'tutor_withdraws', $withdraw_data );
303 $withdraw_id = $wpdb->insert_id;
304
305 do_action( 'tutor_insert_withdraw_after', $withdraw_id, $withdraw_data );
306
307 /**
308 * Getting earning and balance data again
309 */
310 $earning = WithdrawModel::get_withdraw_summary( $user_id );
311 $new_available_balance = tutor_utils()->tutor_price( $earning->available_for_withdraw );
312
313 do_action( 'tutor_withdraw_after' );
314
315 $withdraw_successfull_msg = apply_filters( 'tutor_withdraw_successful_msg', __( 'Withdrawal Request Sent!', 'tutor' ) );
316 wp_send_json_success(
317 array(
318 'msg' => $withdraw_successfull_msg,
319 'available_balance' => $new_available_balance,
320 )
321 );
322 }
323 }
324