HEX
Server: Apache/2.4.59 (Debian)
System: Linux keymana 4.19.0-21-cloud-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30) x86_64
User: lijunjie (1003)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/html/wp-content/plugins/erp/modules/crm/crm.php
<?php
namespace WeDevs\ERP\CRM;

use WeDevs\ERP\Framework\Traits\Hooker;

/**
 * The HRM Class
 *
 * This is loaded in `init` action hook
 */
class Customer_Relationship {
    use Hooker;

    /**
     * Initializes the WeDevs_ERP() class
     *
     * Checks for an existing WeDevs_ERP() instance
     * and if it doesn't find one, creates it.
     */
    public static function init() {
        static $instance = false;

        if ( ! $instance ) {
            $instance = new self();
        }

        return $instance;
    }

    /**
     * Kick-in the class
     *
     * @return void
     */
    public function __construct() {
        // prevent duplicate loading
        if ( did_action( 'erp_crm_loaded' ) ) {
            return;
        }

        // Define constants
        $this->define_constants();

        // Include required files
        $this->includes();

        // Initialize the classes
        $this->init_classes();

        // Initialize the action hooks
        $this->init_actions();

        // Initialize the filter hooks
        $this->init_filters();

        // Trigger after CRM module loaded
        do_action( 'erp_crm_loaded' );
    }

    /**
     * Define the plugin constants
     *
     * @return void
     */
    private function define_constants() {
        define( 'WPERP_CRM_FILE', __FILE__ );
        define( 'WPERP_CRM_PATH', __DIR__ );
        define( 'WPERP_CRM_VIEWS', __DIR__ . '/views' );
        define( 'WPERP_CRM_JS_TMPL', WPERP_CRM_VIEWS . '/js-templates' );
        define( 'WPERP_CRM_ASSETS', plugins_url( '/assets', __FILE__ ) );
    }

    /**
     * Include the required files
     *
     * @return void
     */
    private function includes() {
        require_once WPERP_CRM_PATH . '/includes/actions-filters.php';
        require_once WPERP_CRM_PATH . '/includes/functions-localize.php';
        require_once WPERP_CRM_PATH . '/includes/functions-customer.php';
        require_once WPERP_CRM_PATH . '/includes/functions-dashboard.php';
        require_once WPERP_CRM_PATH . '/includes/functions-reporting.php';
        require_once WPERP_CRM_PATH . '/includes/functions-capabilities.php';
        require_once WPERP_CRM_PATH . '/includes/contact-forms/class-contact-forms-integration.php';

        // cli command
        if ( defined( 'WP_CLI' ) && WP_CLI ) {
            include WPERP_CRM_PATH . '/includes/cli/commands.php';
        }
    }

    /**
     * Init classes
     *
     * @return void
     */
    private function init_classes() {
        if ( is_admin() ) {
            new Ajax_Handler();
            new Form_Handler();
            new Admin_Menu();
            new User_Profile();
            new Log();
            new Emailer();
            new Admin_Dashboard();
        }

        Subscription::instance();
    }

    /**
     * Initialize WordPress action hooks
     *
     * @return void
     */
    private function init_actions() {
        $this->action( 'admin_enqueue_scripts', 'admin_scripts' );
        $this->action( 'admin_footer', 'load_js_template', 10 );

        $this->action( 'admin_enqueue_scripts', 'load_settings_scripts' );
    }

    /**
     * Initialize WordPress filter hooks
     *
     * @return void
     */
    private function init_filters() {
    }

    /**
     * Enqueue admin scripts
     *
     * @since 1.0.0
     * @since 1.2.2 Remove other select2 sources from contact groups page
     *
     * @param string $hook
     *
     * @return void
     */
    public function admin_scripts( $hook ) {
        // $hook = str_replace( sanitize_title( __( 'CRM', 'erp' ) ) , 'crm', $hook );

        if ( 'wp-erp_page_erp-crm' !== $hook && 'wp-erp_page_erp-settings' !== $hook ) {
            return;
        }

        // $crm_pages = [
        //     'toplevel_page_erp-sales',
        //     'crm_page_erp-sales-customers',
        //     'crm_page_erp-sales-companies',
        //     'crm_page_erp-sales-schedules',
        //     'crm_page_erp-sales-activities',
        //     'erp-settings_page_erp-settings',
        //     'crm_page_erp-sales-contact-groups',
        //     'crm_page_erp-sales-reports',
        //     'wp-erp_page_erp-crm',
        // ];

        // if ( ! in_array( $hook , $crm_pages ) ) {
        //     return;
        // }

        $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '';

        wp_enqueue_media();
        wp_enqueue_style( 'erp-tiptip' );
        wp_enqueue_script( 'erp-tiptip' );
        wp_enqueue_style( 'erp-sweetalert' );
        wp_enqueue_script( 'erp-sweetalert' );
        wp_enqueue_script( 'erp-vuejs', false, [ 'jquery', 'erp-script' ], gmdate( 'Ymd' ), true );
        wp_enqueue_script( 'erp-vue-table', WPERP_CRM_ASSETS . "/js/vue-table$suffix.js", [ 'erp-vuejs', 'jquery' ], gmdate( 'Ymd' ), true );

        wp_enqueue_style( 'email-attachment', WPERP_CRM_ASSETS . '/css/email-attachment.css', [], gmdate( 'Ymd' ) );

        $localize_script = apply_filters( 'erp_crm_localize_script', [
            'ajaxurl'               => admin_url( 'admin-ajax.php' ),
            'nonce'                 => wp_create_nonce( 'wp-erp-crm-nonce' ),
            'popup'                 => [
                'customer_title'         => __( 'Add New Customer', 'erp' ),
                'customer_update_title'  => __( 'Edit Customer', 'erp' ),
                'customer_social_title'  => __( 'Customer Social Profile', 'erp' ),
                'customer_assign_group'  => __( 'Add to Contact groups', 'erp' ),
            ],
            'asset_url'                   => WPERP_ASSETS,
            'add_submit'                  => __( 'Add New', 'erp' ),
            'update_submit'               => __( 'Update', 'erp' ),
            'save_submit'                 => __( 'Save', 'erp' ),
            'customer_upload_photo'       => __( 'Upload Photo', 'erp' ),
            'customer_set_photo'          => __( 'Set Photo', 'erp' ),
            'confirm'                     => __( 'Are you sure?', 'erp' ),
            'delConfirmCustomer'          => __( 'Are you sure to delete?', 'erp' ),
            'delConfirm'                  => __( 'Are you sure to delete this?', 'erp' ),
            'checkedConfirm'              => __( 'Select atleast one group', 'erp' ),
            'contact_exit'                => __( 'Already exists as a contact or company', 'erp' ),
            'make_contact_text'           => __( 'This user already exists! Do you want to make this user as a', 'erp' ),
            'wpuser_make_contact_text'    => __( 'This is wp user! Do you want to create this user as a', 'erp' ),
            'create_contact_text'         => __( 'Create new', 'erp' ),
            'current_user_id'             => get_current_user_id(),
            'successfully_created_wpuser' => __( 'WP User created successfully', 'erp' ),
            'required_field_notice'       => __( 'Please fill all the required fields. You have {count} required field(s) empty. Check the Advanced Fields if necessary.', 'erp' ),
        ] );

        $contact_actvity_localize = apply_filters( 'erp_crm_contact_localize_var', [
            'ajaxurl'              => admin_url( 'admin-ajax.php' ),
            'nonce'                => wp_create_nonce( 'wp-erp-crm-customer-feed' ),
            'current_user_id'      => get_current_user_id(),
            'isAdmin'              => current_user_can( 'manage_options' ),
            'isCrmManager'         => current_user_can( 'erp_crm_manager' ),
            'isAgent'              => current_user_can( 'erp_crm_agent' ),
            'confirm'              => __( 'Are you sure?', 'erp' ),
            'date_format'          => get_option( 'date_format' ),
            'timeline_feed_header' => apply_filters( 'erp_crm_contact_timeline_feeds_header', '' ),
            'timeline_feed_body'   => apply_filters( 'erp_crm_contact_timeline_feeds_body', '' ),
        ] );

        /*
         * This below block is only needed for translations
         * Pleeease find some proper place for me
         */ ?>
        <script>
            window.erpLocale = JSON.parse('<?php echo wp_kses_post( wp_slash( wp_json_encode( apply_filters( 'erp_localized_data', [] ) ) ) ); ?>');
        </script>

        <?php
        wp_enqueue_script( 'erp-crm-i18n', WPERP_ASSETS . '/js/i18n.js', [], gmdate( 'Ymd' ), true );
        /**
         * This above block is only needed for translations
         */
        $section = isset( $_GET['section'] ) ? sanitize_text_field( wp_unslash( $_GET['section'] ) ) : 'dashboard';

        switch ( $section ) {
            case 'dashboard':
                wp_enqueue_script( 'jquery' );
                wp_enqueue_script( 'erp-flotchart' );
                wp_enqueue_script( 'erp-flotchart-time' );
                wp_enqueue_script( 'erp-flotchart-axislables' );
                wp_enqueue_script( 'erp-flotchart-orerbars' );
                wp_enqueue_script( 'erp-flotchart-tooltip' );
                break;

                case 'contact':
                    $sub_section = isset( $_GET['sub-section'] ) ? sanitize_text_field( wp_unslash( $_GET['sub-section'] ) ) : 'contacts';

                    switch ( $sub_section ) {
                        case 'contacts':
                            $this->load_contact_company_scripts( $suffix, $contact_actvity_localize );

                            $customer                             = new Contact( null, 'contact' );
                            $localize_script['customer_empty']    = $customer->to_array();
                            $localize_script['erp_fields']        = erp_get_import_export_fields();
                            $localize_script['import']            = __( 'Import', 'erp' );
                            $localize_script['export']            = __( 'Export', 'erp' );
                            $localize_script['import_title']      = __( 'Import Contacts', 'erp' );
                            $localize_script['export_title']      = __( 'Export Contacts', 'erp' );
                            $localize_script['import_users']      = __( 'Import Users As Contacts', 'erp' );
                            $localize_script['statuses']          = erp_crm_customer_get_status_count( 'contact' );
                            $localize_script['contact_type']      = 'contact';
                            $localize_script['life_stages']       = erp_crm_get_life_stages_dropdown_raw();
                            $localize_script['searchFields']      = erp_crm_get_serach_key( 'contact' );
                            $localize_script['saveAdvanceSearch'] = erp_crm_get_save_search_item( [ 'type' => 'contact' ] );
                            $localize_script['isAdmin']           = current_user_can( 'manage_options' );
                            $localize_script['isCrmManager']      = current_user_can( 'erp_crm_manager' );
                            $localize_script['isAgent']           = current_user_can( 'erp_crm_agent' );

                            $country = \WeDevs\ERP\Countries::instance();
                            wp_localize_script( 'erp-script', 'wpErpCountries', $country->load_country_states() );
                            break;

                        case 'companies':
                            $this->load_contact_company_scripts( $suffix, $contact_actvity_localize );

                            $customer                             = new Contact( null, 'company' );
                            $localize_script['customer_empty']    = $customer->to_array();
                            $localize_script['erp_fields']        = erp_get_import_export_fields();
                            $localize_script['import']            = __( 'Import', 'erp' );
                            $localize_script['export']            = __( 'Export', 'erp' );
                            $localize_script['import_title']      = __( 'Import Companies', 'erp' );
                            $localize_script['export_title']      = __( 'Export Companies', 'erp' );
                            $localize_script['statuses']          = erp_crm_customer_get_status_count( 'company' );
                            $localize_script['contact_type']      = 'company';
                            $localize_script['life_stages']       = erp_crm_get_life_stages_dropdown_raw();
                            $localize_script['searchFields']      = erp_crm_get_serach_key( 'company' );
                            $localize_script['saveAdvanceSearch'] = erp_crm_get_save_search_item( [ 'type' => 'company' ] );
                            $localize_script['isAdmin']           = current_user_can( 'manage_options' );
                            $localize_script['isCrmManager']      = current_user_can( 'erp_crm_manager' );
                            $localize_script['isAgent']           = current_user_can( 'erp_crm_agent' );

                            $country = \WeDevs\ERP\Countries::instance();
                            wp_localize_script( 'erp-script', 'wpErpCountries', $country->load_country_states() );
                            break;

                        case 'activities':
                            wp_enqueue_script( 'underscore' );
                            wp_enqueue_script( 'erp-vuejs' );
                            wp_enqueue_style( 'erp-nprogress' );
                            wp_enqueue_script( 'erp-nprogress' );
                            wp_enqueue_script( 'wp-erp-crm-vue-component', WPERP_CRM_ASSETS . '/js/crm-components.js', apply_filters( 'crm_vue_customer_script', [ 'erp-nprogress', 'erp-script', 'erp-vuejs', 'underscore', 'erp-select2', 'erp-tiptip' ] ), gmdate( 'Ymd' ), true );

                            do_action( 'erp_crm_load_contact_vue_scripts' );

                            wp_enqueue_script( 'wp-erp-crm-vue-customer', WPERP_CRM_ASSETS . "/js/crm-app$suffix.js", [ 'wp-erp-crm-vue-component', 'erp-nprogress', 'erp-script', 'erp-vuejs', 'underscore', 'erp-select2', 'erp-tiptip' ], gmdate( 'Ymd' ), true );
                            wp_enqueue_script( 'post' );

                            $contact_actvity_localize['isActivityPage'] = true;
                            wp_localize_script( 'wp-erp-crm-vue-component', 'wpCRMvue', $contact_actvity_localize );
                            break;
                    }

                    break;

                case 'task':
                    wp_enqueue_style( 'erp-timepicker' );
                    wp_enqueue_script( 'erp-timepicker' );
                    wp_enqueue_script( 'underscore' );
                    wp_enqueue_script( 'erp-trix-editor' );
                    wp_enqueue_style( 'erp-trix-editor' );
                    break;

                case 'reports':
                    if ( isset( $_GET['type'] ) && $_GET['type'] === 'growth-report' ) {
                        wp_enqueue_script( 'erp-momentjs' );
                        wp_enqueue_script( 'erp-crm-chart', WPERP_CRM_ASSETS . "/js/chart$suffix.min.js", [], gmdate( 'Ymd' ), true );
                        wp_enqueue_script( 'erp-crm-report', WPERP_CRM_ASSETS . "/js/report$suffix.js", [], gmdate( 'Ymd' ), true );
                    }
                    break;
        }

        wp_localize_script( 'erp-vue-table', 'wpVueTable', [
            'ajaxurl' => admin_url( 'admin-ajax.php' ),
            'nonce'   => wp_create_nonce( 'wp-erp-vue-table' ),
        ] );

        wp_enqueue_script( 'erp-crm', WPERP_CRM_ASSETS . "/js/crm$suffix.js", [ 'erp-script', 'erp-timepicker' ], gmdate( 'Ymd' ), true );
        wp_enqueue_script( 'erp-crm-contact', WPERP_CRM_ASSETS . "/js/crm-contacts$suffix.js", [ 'erp-vue-table', 'erp-script', 'erp-vuejs', 'underscore', 'erp-tiptip', 'jquery', 'erp-select2', 'erp-crm-i18n' ], gmdate( 'Ymd' ), true );
        wp_localize_script( 'erp-crm', 'wpErpCrm', $localize_script );
        wp_localize_script( 'erp-crm-contact', 'wpErpCrm', $localize_script );

        erp_remove_other_select2_sources();
    }

    /**
     * Load all js template in footer
     *
     * @since 1.0
     *
     * @return void
     */
    public function load_js_template() {
        global $current_screen;
        $hook    = str_replace( sanitize_title( __( 'CRM', 'erp' ) ), 'crm', $current_screen->base );
        $section = isset( $_GET['section'] ) ? sanitize_text_field( wp_unslash( $_GET['section'] ) ) : 'dashboard';

        switch ( $section ) {
            case 'contact':
                $sub_section = isset( $_GET['sub-section'] ) ? sanitize_text_field( wp_unslash( $_GET['sub-section'] ) ) : 'contacts';

                switch ( $sub_section ) {
                    case 'contacts':
                    case 'companies':
                        erp_get_js_template( WPERP_CRM_JS_TMPL . '/new-customer.php', 'erp-crm-new-contact' );
                        erp_get_js_template( WPERP_CRM_JS_TMPL . '/customer-import.php', 'erp-crm-import-customer' );
                        erp_get_js_template( WPERP_CRM_JS_TMPL . '/customer-export.php', 'erp-crm-export-customer' );
                        erp_get_js_template( WPERP_CRM_JS_TMPL . '/customer-import-users.php', 'erp-crm-import-users' );
                        erp_get_js_template( WPERP_CRM_JS_TMPL . '/make-wp-user.php', 'erp-make-wp-user' );
                        erp_get_js_template( WPERP_CRM_JS_TMPL . '/new-bulk-contact-group.php', 'erp-crm-new-bulk-contact-group' );
                        erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/save-search-fields.php', 'erp-crm-save-search-item' );

                        if ( isset( $_GET['action'] ) && $_GET['action'] === 'view' ) {
                            erp_get_js_template( WPERP_CRM_JS_TMPL . '/new-assign-company.php', 'erp-crm-new-assign-company' );
                            erp_get_js_template( WPERP_CRM_JS_TMPL . '/customer-social.php', 'erp-crm-customer-social' );
                            erp_get_js_template( WPERP_CRM_JS_TMPL . '/customer-feed-edit.php', 'erp-crm-customer-edit-feed' );
                            erp_get_js_template( WPERP_CRM_JS_TMPL . '/new-subscriber-contact.php', 'erp-crm-assign-subscriber-contact' );
                            erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/timeline-new-note.php', 'erp-crm-timeline-feed-new-note' );
                            erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/timeline-email.php', 'erp-crm-timeline-feed-email' );
                            erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/timeline-log-activity.php', 'erp-crm-timeline-feed-log-activity' );
                            erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/timeline-task.php', 'erp-crm-timeline-feed-task-note' );
                            erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/customer-newnote.php', 'erp-crm-new-note-template' );
                            erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/customer-log-activity.php', 'erp-crm-log-activity-template' );
                            erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/customer-email-note.php', 'erp-crm-email-note-template' );
                            erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/customer-schedule-note.php', 'erp-crm-schedule-note-template' );
                            erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/customer-tasks-note.php', 'erp-crm-tasks-note-template' );

                            do_action( 'erp_crm_load_vue_js_template' );
                        }

                        break;

                    case 'contact-groups':
                        erp_get_js_template( WPERP_CRM_JS_TMPL . '/new-contact-group.php', 'erp-crm-new-contact-group' );

                        if ( isset( $_GET['groupaction'] ) && $_GET['groupaction'] === 'view-subscriber' ) {
                            erp_get_js_template( WPERP_CRM_JS_TMPL . '/new-subscriber-contact.php', 'erp-crm-assign-subscriber-contact' );
                        }
                        break;

                    case 'activities':
                        erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/timeline-new-note.php', 'erp-crm-timeline-feed-new-note' );
                        erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/timeline-email.php', 'erp-crm-timeline-feed-email' );
                        erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/timeline-log-activity.php', 'erp-crm-timeline-feed-log-activity' );
                        erp_get_vue_component_template( WPERP_CRM_JS_TMPL . '/timeline-task.php', 'erp-crm-timeline-feed-task-note' );

                        do_action( 'erp_crm_load_vue_js_template' );

                        break;
                }

                break;

            case 'dashboard':
                erp_get_js_template( WPERP_CRM_JS_TMPL . '/single-schedule-details.php', 'erp-crm-single-schedule-details' );
                break;

            case 'task':
                erp_get_js_template( WPERP_CRM_JS_TMPL . '/single-schedule-details.php', 'erp-crm-single-schedule-details' );
                erp_get_js_template( WPERP_CRM_JS_TMPL . '/customer-add-schedules.php', 'erp-crm-customer-schedules' );
                break;

            default:
                // code...
                break;
        }
    }

    /**
     * Load commong scripts for company and contacts page
     *
     * @param $suffix
     * @param $contact_actvity_localize
     */
    public function load_contact_company_scripts( $suffix, $contact_actvity_localize ) {
        wp_enqueue_style( 'erp-timepicker' );
        wp_enqueue_script( 'erp-timepicker' );
        wp_enqueue_script( 'erp-vuejs' );
        wp_enqueue_script( 'erp-trix-editor' );
        wp_enqueue_style( 'erp-trix-editor' );
        wp_enqueue_script( 'underscore' );
        wp_enqueue_style( 'erp-nprogress' );
        wp_enqueue_script( 'erp-nprogress' );
        wp_enqueue_script( 'wp-erp-crm-vue-component', WPERP_CRM_ASSETS . '/js/crm-components.js', [ 'erp-nprogress', 'erp-script', 'erp-vuejs', 'underscore', 'erp-select2', 'erp-tiptip' ], gmdate( 'Ymd' ), true );

        do_action( 'erp_crm_load_contact_vue_scripts' );

        if ( isset( $_GET['action'] ) && $_GET['action'] === 'view' ) {
            wp_enqueue_script( 'wp-erp-crm-vue-customer', WPERP_CRM_ASSETS . "/js/crm-app$suffix.js", apply_filters( 'crm_vue_customer_script', [ 'erp-nprogress', 'erp-script', 'erp-vuejs', 'underscore', 'erp-select2', 'erp-tiptip' ] ), gmdate( 'Ymd' ), true );
        }

        wp_localize_script( 'wp-erp-crm-vue-component', 'wpCRMvue', $contact_actvity_localize );

        wp_localize_script( 'wp-erp-crm-vue-customer', 'erpCrmApp', [
            'reattach' => __( 'Reattach', 'erp' ),
            'remove'   => __( 'Remove', 'erp' ),
        ] );

        wp_enqueue_script( 'post' );
    }

    /**
     * Load scritps for settings page
     *
     * @param $hook
     */
    public function load_settings_scripts( $hook ) {
        $hook = str_replace( sanitize_title( __( 'CRM', 'erp' ) ), 'crm', $hook );

        if ( 'wp-erp_page_erp-settings' === $hook && isset( $_GET['tab'] ) && $_GET['tab'] === 'erp-crm' ) {
            wp_enqueue_script( 'erp-trix-editor' );
            wp_enqueue_style( 'erp-trix-editor' );
        }
    }
}