PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.4.0
Tutor LMS – eLearning and online course solution v3.4.0
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 1 year ago Admin.php 1 year ago Ajax.php 1 year ago Announcements.php 1 year ago Assets.php 1 year ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Course.php 1 year ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 1 year 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 1 year ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Input.php 1 year ago Instructor.php 1 year ago Instructors_List.php 1 year ago Lesson.php 1 year ago Options_V2.php 1 year ago Permalink.php 2 years ago Post_types.php 1 year ago Private_Course_Access.php 1 year ago Q_And_A.php 1 year ago Question_Answers_List.php 3 years ago Quiz.php 1 year ago QuizBuilder.php 1 year ago Quiz_Attempts_List.php 1 year ago RestAPI.php 2 years ago Reviews.php 3 years ago Rewrite_Rules.php 2 years ago Shortcode.php 1 year ago Singleton.php 1 year ago Student.php 1 year ago Students_List.php 1 year ago Taxonomies.php 1 year ago Template.php 1 year ago Theme_Compatibility.php 3 years ago Tools.php 1 year ago Tools_V2.php 1 year ago Tutor.php 1 year ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 1 year ago Upgrader.php 1 year ago User.php 1 year ago Utils.php 1 year ago Video_Stream.php 3 years ago WhatsNew.php 2 years ago Withdraw.php 1 year ago Withdraw_Requests_List.php 1 year ago WooCommerce.php 1 year 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