Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 107

Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 234

Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 235

Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 236

Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 237

Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 238

Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 239
* @link https://themeum.com * @since 1.0.0 */ namespace TUTOR; if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Handle withdraw request logic * * @since 1.0.0 */ class Withdraw_Requests_List { /** * Page title * * @since 1.0.0 * * @var string */ public $page_title; /** * List page slug * * @since 1.0.0 * * @var string */ const WITHDRAW_REQUEST_LIST_PAGE = 'tutor_withdraw_requests'; /** * Register hooks, resolve dependencies * * @since 1.0.0 */ public function __construct() { $this->page_title = __( 'Withdraw Request', 'tutor' ); /** * Approve or reject withdraw request */ add_action( 'wp_ajax_tutor_admin_withdraw_action', array( $this, 'update_withdraw_status' ) ); } /** * Available tabs that will visible on the right side of page navbar * * @since 2.0.0 * * @param string $date withdraw request date | optional. * @param string $search search by instructor name or email | optional. * * @return array */ public function tabs_key_value( $date = '', $search = '' ): array { $approved = self::tabs_data( 'approved', $date, $search ); $pending = self::tabs_data( 'pending', $date, $search ); $rejected = self::tabs_data( 'rejected', $date, $search ); $url = get_pagenum_link(); $tabs = array( array( 'key' => 'all', 'title' => __( 'All', 'tutor-pro' ), 'value' => $approved + $pending + $rejected, 'url' => $url . '&data=all', ), array( 'key' => 'approved', 'title' => __( 'Approved', 'tutor-pro' ), 'value' => $approved, 'url' => $url . '&data=approved', ), array( 'key' => 'pending', 'title' => __( 'Pending', 'tutor-pro' ), 'value' => $pending, 'url' => $url . '&data=pending', ), array( 'key' => 'rejected', 'title' => __( 'Rejected', 'tutor-pro' ), 'value' => $rejected, 'url' => $url . '&data=rejected', ), ); return $tabs; } /** * Get counted number of withdraw list by status ex: approved | pending | rejected * * @since 2.0.0 * * @param string $status status required | available : (approved | pending | rejected). * @param string $date withdraw request date | optional | YYYY-MM-DD. * @param string $search search by instructor name or email | optional. * * @return int */ public static function tabs_data( string $status, $date = '', $search = '' ): int { global $wpdb; $withdraw_table = $wpdb->prefix . 'tutor_withdraws'; $user_table = $wpdb->users; $status = sanitize_text_field( $status ); $date = sanitize_text_field( $date ); $search = sanitize_text_field( $search ); // Prepare date query. $date_query = ''; if ( '' !== $date ) { $date_query = "AND DATE(withdraw.created_at) = CAST('{$date}' AS DATE) "; } // Prepare search query. $search = '%' . $wpdb->esc_like( $search ) . '%'; $count = $wpdb->get_var( $wpdb->prepare( "SELECT count(*) FROM {$withdraw_table} AS withdraw INNER JOIN {$user_table} AS user ON user.ID = withdraw.user_id WHERE withdraw.status = %s {$date_query} AND ( user.user_login LIKE %s OR user.user_nicename LIKE %s OR user.user_email LIKE %s OR user.display_name LIKE %s ) ", $status, $search, $search, $search, $search ) ); return $count ? $count : 0; } /** * Handle ajax request for updating withdraw status | available status (approved, rejected, pending) * * @since 2.0.0 * * @return string json response. */ public function update_withdraw_status() { tutor_utils()->checking_nonce(); // Check if user is privileged. if ( ! current_user_can( 'administrator' ) ) { wp_send_json_error( tutor_utils()->error_message() ); } $status = Input::post( 'action-type', '' ); $withdraw_id = Input::post( 'withdraw-id', '' ); $reject_type = Input::post( 'reject-type', '' ); $reject_comment = Input::post( 'reject-comment', '' ); if ( '' === $withdraw_id ) { return false; } else { $update = self::update( $status, $withdraw_id, $reject_type, $reject_comment ); return $update ? wp_send_json( true ) : false; } exit; } /** * Update withdraw status | available status (approved, rejected, pending) * * @since v2.0.0 * * @param string $status | required. * @param int $withdraw_id | required. * @param string $reject_type | optional. * @param string $reject_comment | optional. * * @return bool json response. */ public static function update( string $status, int $withdraw_id, $reject_type = '', $reject_comment = '' ): bool { global $wpdb; $withdraw_table = $wpdb->prefix . 'tutor_withdraws'; $withdraw_id = sanitize_text_field( $withdraw_id ); $status = sanitize_text_field( $status ); // Prepare data for update. $data = array( 'status' => $status, 'updated_at' => gmdate( 'Y-m-d H:i:s' ), ); // If rejected then append reject_type and comment with method_data. if ( 'rejected' === $status ) { $withdraw = self::get_withdraw_by_id( $withdraw_id ); if ( $withdraw ) { $details = unserialize( $withdraw->method_data ); $details['rejects'] = array( 'reject_type' => sanitize_text_field( $reject_type ), 'reject_comment' => sanitize_text_field( $reject_comment ), ); $data['method_data'] = maybe_serialize( $details ); // Trigger email after rejecting withdraw. do_action( 'tutor_after_rejected_withdraw', $withdraw_id ); } } else { do_action( 'tutor_after_approved_withdraw', $withdraw_id ); } // Update. $update = $wpdb->update( $withdraw_table, $data, array( 'withdraw_id' => $withdraw_id, ) ); return $update ? true : false; } /** * Get withdraw by id * * @since v2.0.0 * * @param int $withdraw_id | required. * * @return object withdraw list. */ public static function get_withdraw_by_id( int $withdraw_id ) { global $wpdb; $withdraw_table = $wpdb->prefix . 'tutor_withdraws'; return $wpdb->get_row( $wpdb->prepare( " SELECT *FROM {$withdraw_table} WHERE withdraw_id = %d ", $withdraw_id ) ); } }