/home/hamzarou/www/wp-content/plugins/sms-alert/handler/forms/class-wpjobs.php
<?php
/**
 * This file handles wp jobs form sms notification
 *
 * PHP version 5
 *
 * @category Handler
 * @package  SMSAlert
 * @author   SMS Alert <support@cozyvision.com>
 * @license  URI: http://www.gnu.org/licenses/gpl-2.0.html
 * @link     https://www.smsalert.co.in/
 */

if (! defined('ABSPATH') ) {
    exit;
}
if (! is_plugin_active('wp-job-manager/wp-job-manager.php') ) {
    return; 
}

/**
 * PHP version 5
 *
 * @category Handler
 * @package  SMSAlert
 * @author   SMS Alert <support@cozyvision.com>
 * @license  URI: http://www.gnu.org/licenses/gpl-2.0.html
 * @link     https://www.smsalert.co.in/
 * Wpjobs class.
 */
class Wpjobs extends FormInterface
{

    /**
     * Form Session Variable.
     *
     * @return stirng
     */
    private $form_session_var = FormSessionVars::WP_JOB_MANAGER;

    /**
     * Handle OTP form
     *
     * @return void
     */
    public function handleForm()
    {
        add_action('create_job_application_notification_recipient', array( $this, 'newJobApplicationSendSms' ), 10, 3);
        add_action('pending_to_publish', array( $this, 'listingPublishedSendSms' ));
        add_action('pending_payment_to_publish', array( $this, 'listingPublishedSendSms' ));
        add_filter('submit_job_form_fields', array( $this, 'frontendAddPhoneField' ));
        add_action('job_manager_job_submitted', array( $this, 'sendNewJobNotification' ));
        add_action('job_manager_user_edit_job_listing', array( $this, 'sendUpdatedJobNotification' ));
        add_action('wpjm_notify_new_user', array( $this, 'saUpdateBillingPhone' ), 10, 3);
    }

    /**
     * Send sms for New Job Application
     *
     * @param string $send_to        recipient number.
     * @param string $job_id         Job ID.
     * @param string $application_id application ID.
     *
     * @return void
     */
    public function newJobApplicationSendSms( $send_to, $job_id, $application_id )
    {

        $post                                 = get_post($job_id);
        $user_info                            = get_userdata($post->post_author);
        $admin_number                         = smsalert_get_option('sms_admin_phone', 'smsalert_message', '');
        $phone                                = get_user_meta($user_info->ID, 'billing_phone', true);
        $candidate_phone                      = get_user_meta(get_post_meta($application_id, '_candidate_user_id', true), 'billing_phone', true);
        $msg_enable                           = get_option('smsalert_sms_notification');
        $new_application_customer_msg_enable  = get_option('smsalert_new_application_sms_status');
        $new_application_admin_msg_enable     = get_option('smsalert_new_application_admin_sms_status');
        $new_application_candidate_msg_enable = get_option('smsalert_new_application_candidate_sms_status');

        if ($msg_enable ) {
            $visitor_message   = get_option('smsalert_new_application_sms');
            $admin_message     = get_option('smsalert_new_application_admin_sms');
            $candidate_message = get_option('smsalert_new_application_candidate_sms');

            $datas                      = array();
            $datas['[username]']        = $user_info->user_login;
            $datas['[user_email]']      = $user_info->username;
            $datas['[phone]']           = $phone;
            $datas['[candidate_name]']  = get_post_meta($application_id, 'Full name', true);
            $datas['[candidate_email]'] = get_post_meta($application_id, '_candidate_email', true);
            $datas['[job_id]']          = $job_id;
            $datas['[job_name]']        = get_post_meta($application_id, '_job_applied_for', true);

            if (! empty($visitor_message) && '1' === $new_application_customer_msg_enable ) {
                do_action('sa_send_sms', $phone, self::parseSmsContent($visitor_message, $datas));
            }

            if (! empty($candidate_message) && '1' === $new_application_candidate_msg_enable && ! empty($candidate_phone) ) {
                do_action('sa_send_sms', $candidate_phone, self::parseSmsContent($candidate_message, $datas));
            }

            if (! empty($admin_number) && ! empty($admin_message) && '1' === $new_application_admin_msg_enable ) {
                do_action('sa_send_sms', $admin_number, self::parseSmsContent($admin_message, $datas));
            }
        }
    }

    /**
     * Update User billing phone after registration via job form.
     *
     * @param int    $user_id  user id.
     * @param string $password User password.
     * @param object $new_user user object.
     *
     * @return void
     */
    public function saUpdateBillingPhone( $user_id, $password, $new_user )
    {
        if (isset($_POST['job_phone']) ) {
            $phone = sanitize_text_field(wp_unslash($_POST['job_phone']));
            update_user_meta($user_id, 'billing_phone', $phone);
        }
    }

    /**
     * Send messages to those who are publishing the list.
     *
     * @param int $job_id job id.
     *
     * @return void
     */
    public function listingPublishedSendSms( $job_id )
    {
        if ('job_listing' !== get_post_type($job_id) ) {
            return;
        }
        $post      = get_post($job_id);
        $user_info = get_userdata($post->post_author);

        $admin_number = smsalert_get_option('sms_admin_phone', 'smsalert_message', '');
        $phone        = get_user_meta($user_info->ID, 'billing_phone', true);

        $msg_enable                  = get_option('smsalert_sms_notification');
        $approve_customer_msg_enable = get_option('smsalert_job_approve_customer_sms_status');
        $approve_admin_msg_enable    = get_option('smsalert_job_approve_sms_status');

        if ($msg_enable ) {
            $visitor_message = get_option('smsalert_job_approve_customer_sms');
            $admin_message   = get_option('smsalert_job_approve_sms');

            $datas                 = array();
            $datas['[username]']   = $user_info->user_login;
            $datas['[user_email]'] = $user_info->username;
            $datas['[phone]']      = $phone;
            $datas['[job_id]']     = $post->ID;
            $datas['[job_name]']   = $post->post_title;
            if (! empty($visitor_message) && '1' === $approve_customer_msg_enable ) {
                do_action('sa_send_sms', $phone, self::parseSmsContent($visitor_message, $datas));
            }
            if (! empty($admin_number) && ! empty($admin_message) && '1' === $approve_admin_msg_enable ) {
                do_action('sa_send_sms', $admin_number, self::parseSmsContent($admin_message, $datas));
            }
        }
    }

    /**
     * Add phone field to frontend form.
     *
     * @param array $fields form fields.
     *
     * @return array
     */
    public function frontendAddPhoneField( $fields )
    {
        if (! is_user_logged_in() ) {
            $fields['job']['job_phone'] = array(
            'label'       => __('Phone', 'job_manager'),
            'type'        => 'text',
            'required'    => true,
            'placeholder' => 'Enter Mobile Number',
            'priority'    => 7,
            );
        }
        return $fields;
    }

    /**
     * Job Manager Settings for smsalert.
     *
     * @param array $settings backend smsalert settings in job form.
     *
     * @return array
     */
    public function jobManagerSettings( $settings )
    {

        $data                   = array();
        $settings['smsalert'][] = 'SMS Alert';

        $data[] = array(
        'name'     => 'smsalert_sms_notification',
        'cb_label' => __('Enable to send sms notification to admin as well as employer', 'sms-alert'),
        'std'      => get_option('smsalert_sms_notification', 1),
        'label'    => __('SMS Notification', 'sms-alert'),
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'     => 'smsalert_new_job_sms_status',
        'cb_label' => __('Enable Admin Message When New Job Submitted', 'sms-alert'),
        'std'      => get_option('smsalert_new_job_sms_status', 1),
        'label'    => '',
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'  => 'smsalert_new_job_sms',
        'std'   => 'Dear admin, a new job [job_name] is submitted by [username].Please check your admin dashboard for complete details.',
        'label' => '',
        'desc'  => __('You can use following tokens [store_name], [job_id], [job_name] ,[username] ,[email] ,[phone]', 'sms-alert'),
        'type'  => 'textarea',
        );

        $data[] = array(
        'name'     => 'smsalert_job_approve_sms_status',
        'cb_label' => __('Enable Admin Message When A Job Approved', 'sms-alert'),
        'std'      => get_option('smsalert_job_approve_sms_status', 1),
        'label'    => '',
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'  => 'smsalert_job_approve_sms',
        'std'   => 'Dear admin, a new job [job_name] is approved.Please check your admin dashboard for complete details.',
        'label' => '',
        'desc'  => __('You can use following tokens [store_name], [job_id], [job_name] ,[username] ,[email] ,[phone]', 'sms-alert'),
        'type'  => 'textarea',
        );

        $data[] = array(
        'name'     => 'smsalert_edit_job_sms_status',
        'cb_label' => __('Enable Admin Message When Job Edited', 'sms-alert'),
        'std'      => get_option('smsalert_edit_job_sms_status', 1),
        'label'    => '',
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'  => 'smsalert_edit_job_sms',
        'std'   => 'Dear admin, a job [job_name] is updated by [username].Please check your admin dashboard for complete details.',
        'label' => '',
        'desc'  => __('You can use following tokens [store_name], [job_id], [job_name] ,[username] ,[email] ,[phone]', 'sms-alert'),
        'type'  => 'textarea',
        );

        $data[] = array(
        'name'     => 'smsalert_new_application_admin_sms_status',
        'cb_label' => __('Enable Admin Message When New Application Submitted', 'sms-alert'),
        'std'      => get_option('smsalert_new_application_admin_sms_status', 1),
        'label'    => '',
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'  => 'smsalert_new_application_admin_sms',
        'std'   => 'Dear [username], a candidate [candidate_name] is applied for job.',
        'label' => '',
        'desc'  => __('You can use following tokens [store_name], [job_id], [job_name] ,[username] ,[email] ,[phone] ,[candidate_name] ,[candidate_email]', 'sms-alert'),
        'type'  => 'textarea',
        );

        $data[] = array(
        'name'     => 'smsalert_new_job_customer_sms_status',
        'cb_label' => __('Enable Employer Message When New Job Submitted', 'sms-alert'),
        'std'      => get_option('smsalert_new_job_customer_sms_status', 1),
        'label'    => '',
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'  => 'smsalert_new_job_customer_sms',
        'std'   => 'Dear [username], Thank you for sumitting job, please wait for approval.',
        'label' => '',
        'desc'  => __('You can use following tokens [store_name], [job_id], [job_name] ,[username] ,[email] ,[phone]', 'sms-alert'),
        'type'  => 'textarea',
        );

        $data[] = array(
        'name'     => 'smsalert_job_approve_customer_sms_status',
        'cb_label' => __('Enable Employer Message When A Job Approved', 'sms-alert'),
        'std'      => get_option('smsalert_job_approve_customer_sms_status', 1),
        'label'    => '',
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'  => 'smsalert_job_approve_customer_sms',
        'std'   => 'Dear [username], your job [job_name] is approved.',
        'label' => '',
        'desc'  => __('You can use following tokens [store_name], [job_id], [job_name] ,[username] ,[email] ,[phone]', 'sms-alert'),
        'type'  => 'textarea',
        );

        $data[] = array(
        'name'     => 'smsalert_edit_job_customer_sms_status',
        'cb_label' => __('Enable Employer Message When Job Edited', 'sms-alert'),
        'std'      => get_option('smsalert_edit_job_customer_sms_status', 1),
        'label'    => '',
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'  => 'smsalert_edit_job_customer_sms',
        'std'   => 'Dear [username], job [job_name] is updated successfully.',
        'label' => '',
        'desc'  => __('You can use following tokens [store_name], [job_id], [job_name] ,[username] ,[email] ,[phone]', 'sms-alert'),
        'type'  => 'textarea',
        );

        $data[] = array(
        'name'     => 'smsalert_new_application_sms_status',
        'cb_label' => __('Enable Employer Message When New Application Submitted', 'sms-alert'),
        'std'      => get_option('smsalert_new_application_sms_status', 1),
        'label'    => '',
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'  => 'smsalert_new_application_sms',
        'std'   => 'Dear [username], a candidate [candidate_name] is applied for job.',
        'label' => '',
        'desc'  => __('You can use following tokens [store_name], [job_id], [job_name] ,[username] ,[email] ,[phone] ,[candidate_name] ,[candidate_email]', 'sms-alert'),
        'type'  => 'textarea',
        );

        $data[] = array(
        'name'     => 'smsalert_new_application_candidate_sms_status',
        'cb_label' => __('Enable Candidate Message When New Application Submitted', 'sms-alert'),
        'std'      => get_option('smsalert_new_application_sms_status', 1),
        'label'    => '',
        'type'     => 'checkbox',
        );

        $data[] = array(
        'name'  => 'smsalert_new_application_candidate_sms',
        'std'   => 'Hello [candidate_name], Thank you for submitting the application with [store_name].
Powered by
www.smsalert.co.in',
        'label' => '',
        'desc'  => __('You can use following tokens [store_name], [job_id], [job_name] ,[username] ,[email] ,[phone] ,[candidate_name] ,[candidate_email]', 'sms-alert'),
        'type'  => 'textarea',
        );

        $settings['smsalert'][] = $data;

        return $settings;
    }

    /**
     * Send job notification to candidate using job id.
     *
     * @param int $job_id job id.
     *
     * @return void
     */
    public function sendNewJobNotification( $job_id )
    {
        $post                        = get_post($job_id);
        $user_info                   = get_userdata($post->post_author);
        $admin_number                = smsalert_get_option('sms_admin_phone', 'smsalert_message', '');
        $phone                       = get_user_meta($user_info->ID, 'billing_phone', true);
        $msg_enable                  = get_option('smsalert_sms_notification');
        $new_job_customer_msg_enable = get_option('smsalert_new_job_customer_sms_status');
        $new_job_admin_msg_enable    = get_option('smsalert_new_job_sms_status');

        if ($msg_enable ) {
            $visitor_message = get_option('smsalert_new_job_customer_sms');
            $admin_message   = get_option('smsalert_new_job_sms');

            $datas                 = array();
            $datas['[username]']   = $user_info->user_login;
            $datas['[user_email]'] = $user_info->username;
            $datas['[phone]']      = $phone;
            $datas['[job_id]']     = $post->ID;
            $datas['[job_name]']   = $post->post_title;
            $datas['[store_name]'] = get_bloginfo();
            if (! empty($visitor_message) && '1' === $new_job_customer_msg_enable ) {
                do_action('sa_send_sms', $phone, self::parseSmsContent($visitor_message, $datas));
            }
            if (! empty($admin_number) && ! empty($admin_message) && '1' === $new_job_admin_msg_enable ) {
                do_action('sa_send_sms', $admin_number, self::parseSmsContent($admin_message, $datas));
            }
        }
    }

    /**
     * Send job notification to candidate/admin using job id when job is updated.
     *
     * @param int $job_id job id.
     *
     * @return void
     */
    public function sendUpdatedJobNotification( $job_id )
    {
        $post         = get_post($job_id);
        $user_info    = get_userdata($post->post_author);
        $admin_number = smsalert_get_option('sms_admin_phone', 'smsalert_message', '');
        $phone        = get_user_meta($user_info->ID, 'billing_phone', true);

        $msg_enable                   = get_option('smsalert_sms_notification');
        $edit_job_customer_msg_enable = get_option('smsalert_edit_job_customer_sms_status');
        $edit_job_admin_msg_enable    = get_option('smsalert_edit_job_sms_status');

        if ($msg_enable ) {
            $visitor_message = get_option('smsalert_edit_job_customer_sms');
            $admin_message   = get_option('smsalert_edit_job_sms');

            $datas                 = array();
            $datas['[username]']   = $user_info->user_login;
            $datas['[user_email]'] = $user_info->username;
            $datas['[phone]']      = $phone;
            $datas['[job_id]']     = $post->ID;
            $datas['[job_name]']   = $post->post_title;
            $datas['[store_name]'] = get_bloginfo();
            if (! empty($visitor_message) && '1' === $edit_job_customer_msg_enable ) {
                do_action('sa_send_sms', $phone, self::parseSmsContent($visitor_message, $datas));
            }
            if (! empty($admin_number) && ! empty($admin_message) && '1' === $edit_job_admin_msg_enable ) {
                do_action('sa_send_sms', $admin_number, self::parseSmsContent($admin_message, $datas));
            }
        }
    }

    /**
     * Check your otp setting is enabled or not.
     *
     * @return bool
     */
    public static function isFormEnabled()
    {
        $user_authorize = new smsalert_Setting_Options();
        $islogged       = $user_authorize->is_user_authorised();
        return ( $islogged && is_plugin_active('wp-job-manager/wp-job-manager.php') ) ? true : false;
    }

    /**
     * Handle after failed verification
     *
     * @param object $user_login   users object.
     * @param string $user_email   user email.
     * @param string $phone_number phone number.
     *
     * @return void
     */
    public function handle_failed_verification( $user_login, $user_email, $phone_number )
    {
        SmsAlertUtility::checkSession();
        if (! isset($_SESSION[ $this->form_session_var ]) ) {
            return;
        }
        if (! empty($_REQUEST['option']) && sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-validate-otp-form' ) {
            wp_send_json(SmsAlertUtility::_create_json_response(__('Invalid one time passcode. Please enter a valid passcode.', 'sms-alert'), 'error'));
            exit();
        } else {
            $_SESSION[ $this->form_session_var ] = 'verification_failed';
        }
    }

    /**
     * Handle after post verification
     *
     * @param string $redirect_to  redirect url.
     * @param object $user_login   user object.
     * @param string $user_email   user email.
     * @param string $password     user password.
     * @param string $phone_number phone number.
     * @param string $extra_data   extra hidden fields.
     *
     * @return void
     */
    public function handle_post_verification( $redirect_to, $user_login, $user_email, $password, $phone_number, $extra_data )
    {
        SmsAlertUtility::checkSession();
        if (! isset($_SESSION[ $this->form_session_var ]) ) {
            return;
        }
        if (! empty($_REQUEST['option']) && sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-validate-otp-form' ) {
            wp_send_json(SmsAlertUtility::_create_json_response(__('OTP Validated Successfully.', 'sms-alert'), 'success'));
            exit();
        } else {
            $_SESSION[ $this->form_session_var ] = 'validated';
        }
    }

    /**
     * Clear otp session variable
     *
     * @return void
     */
    public function unsetOTPSessionVariables()
    {
        unset($_SESSION[ $this->tx_session_id ]);
        unset($_SESSION[ $this->form_session_var ]);
    }
    /**
     * Check current form submission is ajax or not
     *
     * @param bool $is_ajax bool value for form type.
     *
     * @return bool
     */
    public function is_ajax_form_in_play( $is_ajax )
    {
        SmsAlertUtility::checkSession();
        return isset($_SESSION[ $this->form_session_var ]) ? true : $is_ajax;
    }

    /**
     * Replace variables for sms contennt
     *
     * @param string $content sms content to be sent.
     * @param array  $datas   values of varibles.
     *
     * @return string
     */
    public static function parseSmsContent( $content = null, $datas = array() )
    {
        $find    = array_keys($datas);
        $replace = array_values($datas);
        $content = str_replace($find, $replace, $content);
        return $content;
    }

    /**
     * Handle form for WordPress backend
     *
     * @return void
     */
    public function handleFormOptions()
    {
        add_filter('job_manager_settings', array( $this, 'jobManagerSettings' ));
    }
}
new Wpjobs();