PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.2.4
Tutor LMS – eLearning and online course solution v2.2.4
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 2 years ago Admin.php 2 years ago Ajax.php 3 years ago Announcements.php 3 years ago Assets.php 3 years ago Backend_Page_Trait.php 3 years ago Course.php 3 years ago Course_Embed.php 3 years ago Course_Filter.php 3 years ago Course_List.php 2 years ago Course_Settings_Tabs.php 3 years ago Course_Widget.php 3 years ago Custom_Validation.php 3 years ago Dashboard.php 3 years ago FormHandler.php 2 years ago Frontend.php 3 years ago Gutenberg.php 3 years ago Input.php 3 years ago Instructor.php 2 years ago Instructors_List.php 3 years ago Lesson.php 2 years ago Options_V2.php 2 years ago Post_types.php 3 years ago Private_Course_Access.php 3 years ago Q_and_A.php 3 years ago Question_Answers_List.php 3 years ago Quiz.php 2 years ago Quiz_Attempts_List.php 2 years ago RestAPI.php 3 years ago Reviews.php 3 years ago Rewrite_Rules.php 3 years ago Shortcode.php 2 years ago Student.php 2 years ago Students_List.php 3 years ago Taxonomies.php 3 years ago Template.php 2 years ago Theme_Compatibility.php 3 years ago Tools.php 3 years ago Tools_V2.php 3 years ago Tutor.php 3 years ago TutorEDD.php 2 years ago Tutor_Base.php 3 years ago Tutor_Setup.php 3 years ago Upgrader.php 3 years ago User.php 3 years ago Utils.php 2 years ago Video_Stream.php 3 years ago Withdraw.php 2 years ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 2 years ago
Withdraw.php
317 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 return apply_filters( 'tutor_withdraw_methods', $methods );
116 }
117
118 /**
119 * Withdraw method's tab
120 *
121 * @return void
122 */
123 private function migrate_withdrawal_method_data() {
124 $old_data = get_option( 'tutor_withdraw_options', null );
125
126 if ( ! $old_data ) {
127 // Return if already migrated.
128 return;
129 }
130
131 $withdraw_options = (array) maybe_unserialize( $old_data );
132 $new_methods_array = array();
133
134 foreach ( $withdraw_options as $key => $option ) {
135 if ( is_array( $option ) ) {
136
137 // Set enable state.
138 if ( isset( $option['enabled'] ) ) {
139 $option['enabled'] ? $new_methods_array[] = $key : 0;
140 }
141
142 // Set instruction.
143 if ( isset( $option['instruction'] ) ) {
144 tutor_utils()->update_option( 'tutor_' . $key . '_instruction', $option['instruction'] );
145 }
146 }
147 }
148
149 // Update new.
150 tutor_utils()->update_option( 'tutor_withdrawal_methods', $new_methods_array );
151
152 // Delete old.
153 delete_option( 'tutor_withdraw_options' );
154 }
155
156 /**
157 * Return only enabled methods
158 *
159 * @since 1.0.0
160 *
161 * @return mixed|array
162 */
163 public function withdraw_methods_available() {
164 $methods = $this->withdraw_methods_all();
165 $withdraw_options = tutor_utils()->get_option( 'tutor_withdrawal_methods', array() );
166
167 foreach ( $methods as $method_id => $method ) {
168 if ( ! in_array( $method_id, $withdraw_options ) ) {
169 // Remove the unavailable methods from array.
170 unset( $methods[ $method_id ] );
171 }
172 }
173
174 return $methods;
175 }
176
177 /**
178 * Save Withdraw Method Data
179 *
180 * @since 1.2.0
181 *
182 * @return void send wp_json response
183 */
184 public function tutor_save_withdraw_account() {
185 // Checking nonce.
186 tutor_utils()->checking_nonce();
187
188 //phpcs:disable WordPress.Security.NonceVerification.Missing -- nonce already verified
189 $user_id = get_current_user_id();
190 $method = sanitize_text_field( tutor_utils()->avalue_dot( 'tutor_selected_withdraw_method', $_POST ) );
191 if ( ! $method ) {
192 wp_send_json_error();
193 }
194
195 $method_data = tutor_utils()->avalue_dot( 'withdraw_method_field.' . $method, $_POST );
196 $available_withdraw_method = $this->withdraw_methods_all();
197
198 if ( tutor_utils()->count( $method_data ) ) {
199 $saved_data = array();
200 $saved_data['withdraw_method_key'] = $method;
201 $saved_data['withdraw_method_name'] = tutor_utils()->avalue_dot( $method . '.method_name', $available_withdraw_method );
202
203 foreach ( $method_data as $input_name => $value ) {
204 $saved_data[ $input_name ]['value'] = esc_sql( sanitize_text_field( $value ) );
205 $saved_data[ $input_name ]['label'] = tutor_utils()->avalue_dot( $method . ".form_fields.{$input_name}.label", $available_withdraw_method );
206 }
207
208 update_user_meta( $user_id, '_tutor_withdraw_method_data', $saved_data );
209 update_user_meta( $user_id, '_tutor_withdraw_selected_method', $method );
210 update_user_meta( $user_id, '_tutor_withdraw_method_data_' . $method, $saved_data );
211 }
212
213 $msg = apply_filters( 'tutor_withdraw_method_set_success_msg', __( 'Withdrawal information saved!', 'tutor' ) );
214 wp_send_json_success( array( 'msg' => $msg ) );
215 }
216
217 /**
218 * Handle withdraw request form submit
219 *
220 * @since 1.0.0
221 *
222 * @return void
223 */
224 public function tutor_make_an_withdraw() {
225 global $wpdb;
226
227 tutor_utils()->checking_nonce();
228
229 $user_id = get_current_user_id();
230 $withdraw_amount = Input::post( 'tutor_withdraw_amount' );
231
232 $earning_summary = WithdrawModel::get_withdraw_summary( $user_id );
233 $min_withdraw = tutor_utils()->get_option( 'min_withdraw_amount' );
234
235 if ( ( $earning_summary->total_pending + $withdraw_amount ) > $earning_summary->available_for_withdraw ) {
236 wp_send_json_error(
237 array(
238 'msg' => wp_sprintf(
239 __( "You have total %1\$s pending withdraw request. You can't make more than %2\$s withdraw request at a time", 'tutor' ),
240 $earning_summary->total_pending,
241 $earning_summary->available_for_withdraw
242 ),
243 )
244 );
245 }
246
247 $saved_withdraw_account = WithdrawModel::get_user_withdraw_method();
248 $formatted_min_withdraw_amount = tutor_utils()->tutor_price( $min_withdraw );
249
250 if ( ! tutor_utils()->count( $saved_withdraw_account ) ) {
251 $no_withdraw_method = apply_filters( 'tutor_no_withdraw_method_msg', __( 'Please save withdraw method ', 'tutor' ) );
252 wp_send_json_error( array( 'msg' => $no_withdraw_method ) );
253 }
254
255 if ( ( ! is_numeric( $withdraw_amount ) && ! is_float( $withdraw_amount ) ) || $withdraw_amount < $min_withdraw ) {
256 //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment
257 $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>' ) );
258 wp_send_json_error( array( 'msg' => $required_min_withdraw ) );
259 }
260
261 if ( $earning_summary->available_for_withdraw < $withdraw_amount ) {
262 $insufficient_balence = apply_filters( 'tutor_withdraw_insufficient_balance_msg', __( 'Insufficient balance.', 'tutor' ) );
263
264 wp_send_json_error( array( 'msg' => $insufficient_balence ) );
265 }
266
267 $date = gmdate( 'Y-m-d H:i:s', tutor_time() );
268
269 $withdraw_data = apply_filters(
270 'tutor_pre_withdraw_data',
271 array(
272 'user_id' => $user_id,
273 'amount' => $withdraw_amount,
274 'method_data' => maybe_serialize( $saved_withdraw_account ),
275 'status' => 'pending',
276 'created_at' => $date,
277 )
278 );
279
280 $date = gmdate( 'Y-m-d H:i:s', tutor_time() );
281
282 $withdraw_data = apply_filters(
283 'tutor_pre_withdraw_data',
284 array(
285 'user_id' => $user_id,
286 'amount' => $withdraw_amount,
287 'method_data' => maybe_serialize( $saved_withdraw_account ),
288 'status' => 'pending',
289 'created_at' => $date,
290 )
291 );
292
293 do_action( 'tutor_insert_withdraw_before', $withdraw_data );
294
295 $wpdb->insert( $wpdb->prefix . 'tutor_withdraws', $withdraw_data );
296 $withdraw_id = $wpdb->insert_id;
297
298 do_action( 'tutor_insert_withdraw_after', $withdraw_id, $withdraw_data );
299
300 /**
301 * Getting earning and balance data again
302 */
303 $earning = WithdrawModel::get_withdraw_summary( $user_id );
304 $new_available_balance = tutor_utils()->tutor_price( $earning->available_for_withdraw );
305
306 do_action( 'tutor_withdraw_after' );
307
308 $withdraw_successfull_msg = apply_filters( 'tutor_withdraw_successful_msg', __( 'Withdrawal Request Sent!', 'tutor' ) );
309 wp_send_json_success(
310 array(
311 'msg' => $withdraw_successfull_msg,
312 'available_balance' => $new_available_balance,
313 )
314 );
315 }
316 }
317