File "lead.php"

Full Path: /home/aiclgcwq/photonindustriespvt.com/wp-content/plugins/agile-store-locator/includes/admin/lead.php
File size: 11.61 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace AgileStoreLocator\Admin;

if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly.
}

use AgileStoreLocator\Admin\Base;

/**
 * The lead manager functionality of the plugin.
 *
 * @link       https://agilestorelocator.com
 * @since      4.8
 *
 * @package    AgileStoreLocator
 * @subpackage AgileStoreLocator/Admin/Lead
 */

class Lead extends Base
{
    /**
     * [__construct description]
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * [delete_lead delete lead/leads]
     * @return [type] [description]
     */
    public function delete_lead()
    {
        global $wpdb;

        $response          = new \stdclass();
        $response->success = false;

        $multiple = isset($_REQUEST['multiple']) ? $_REQUEST['multiple'] : null;
        $delete_sql;
        $mResults;

        if ($multiple) {
            $item_ids      = implode(',', array_map('intval', $_POST['item_ids']));
            $delete_sql    = 'DELETE FROM ' . ASL_PREFIX . 'leads WHERE id IN (' . $item_ids . ')';
            $mResults      = $wpdb->get_results('SELECT * FROM ' . ASL_PREFIX . 'leads WHERE id IN (' . $item_ids . ')');
        } else {
            $item_id       = intval($_REQUEST['lead_id']);
            $delete_sql    = 'DELETE FROM ' . ASL_PREFIX . 'leads WHERE id = ' . $item_id;
            $mResults      = $wpdb->get_results('SELECT * FROM ' . ASL_PREFIX . 'leads WHERE id = ' . $item_id);
        }

        if (count($mResults) != 0) {
            if ($wpdb->query($delete_sql)) {
                $response->success = true;
            } else {
                $response->error = esc_attr__('Error occurred while deleting record', 'asl_locator');
                $response->msg   = $wpdb->show_errors();
            }
        } else {
            $response->error = esc_attr__('Error occurred while deleting record', 'asl_locator');
        }

        if ($response->success) {
            $response->msg = ($multiple) ? __('Leads deleted successfully.', 'asl_locator') : esc_attr__('Lead deleted successfully.', 'asl_locator');
        }

        return $this->send_response($response);
    }

    /**
     * [update_lead update lead with icon]
     * @return [type] [description]
     */
    public function update_lead()
    {
        global $wpdb;

        $response          = new \stdclass();
        $response->success = false;

        $data      = $_REQUEST['data'];

        //  Lead Update Parameter
        $data_params = ['lead_name' => trim(sanitize_text_field($data['lead_name']))];

        //  Execute the Update Query
        $wpdb->update(ASL_PREFIX . 'leads', $data_params, ['id' => sanitize_text_field($data['lead_id'])]);

        $response->msg      = esc_attr__('Lead Updated Successfully.', 'asl_locator');
        $response->success  = true;

        return $this->send_response($response);
    }

    /**
     * [export_dealers Export the CSV file the dealers]
     * @return [type] [description]
     */
    public function export_dealers()
    {
        global $wpdb;

        $duration = isset($_REQUEST['sl-duration']) ? $_REQUEST['sl-duration'] : null;

        list($start_date, $end_date)  = explode('-', $duration);

        //  Trim dates
        $start_date = date('Y-m-d', strtotime((trim($start_date)))) . ' 00:00:00';
        $end_date   = date('Y-m-d', strtotime((trim($end_date)))) . ' 23:59:00';

        //  leads Data
        //$leads = $wpdb->get_results($wpdb->prepare("SELECT `l`.`id`, `l`.`name`, `l`.`phone`, `l`.`postal_code`, `l`.`email`, `l`.`message`, s.`title`, s.`street`, s.`city` FROM ".ASL_PREFIX."leads as l LEFT JOIN ".ASL_PREFIX."stores as s ON s.id = l.store_id WHERE l.created_on >= %s AND l.created_on <= %s", $start_date, $end_date ));
        $leads = $wpdb->get_results($wpdb->prepare("SELECT COUNT(*) AS 'total',  s.`title` as 'Store Name', s.`street` as 'Store Street', s.`city` as 'Store City' FROM " . ASL_PREFIX . 'leads as l LEFT JOIN ' . ASL_PREFIX . 'stores as s ON s.id = l.store_id WHERE l.created_on between %s AND %s AND `l`.`store_id` > 0 GROUP BY l.store_id', $start_date, $end_date));

        $csv = new \AgileStoreLocator\Admin\CSV\Reader();

        //  Rows to be exported
        $all_rows = [];

        //  Just send the headers for empty
        if (!$leads) {
            $leads = [['Total' => '', 'Store Name' => '', 'Street'=> '', 'City' => '']];
        }

        //  Loop over the stores data
        foreach ($leads as $value) {
            //unset($value->id);

            //  Push into rows collection
            $all_rows[] = $value;
        }

        $csv->setRows($all_rows);

        $csv->write(\AgileStoreLocator\Admin\CSV\Reader::DOWNLOAD, 'dealers-export.csv');
        ;
        die;
    }

    /**
     * [export_leads Export the leads filter by duration]
     * @return [type] [description]
     */
    public function export_leads()
    {
        global $wpdb;

        $duration = isset($_REQUEST['sl-duration']) ? $_REQUEST['sl-duration'] : null;

        list($start_date, $end_date)  = explode('-', $duration);

        //  Trim dates
        $start_date = date('Y-m-d', strtotime((trim($start_date)))) . ' 00:00:00';
        $end_date   = date('Y-m-d', strtotime((trim($end_date)))) . ' 23:59:00';

        //  leads Data
        //$leads = $wpdb->get_results($wpdb->prepare("SELECT `l`.`id`, `l`.`name`, `l`.`phone`, `l`.`postal_code`, `l`.`email`, `l`.`message`, s.`title`, s.`street`, s.`city` FROM ".ASL_PREFIX."leads as l LEFT JOIN ".ASL_PREFIX."stores as s ON s.id = l.store_id WHERE l.created_on >= %s AND l.created_on <= %s", $start_date, $end_date ));
        $leads = $wpdb->get_results($wpdb->prepare("SELECT `l`.`id`, `l`.`name` as 'Lead Name', `l`.`phone` as 'Lead Phone', `l`.`postal_code` as 'Lead Postal Code', `l`.`email` as 'Lead Email', `l`.`message` as 'Message', `l`.`created_on` as 'Dated',  s.`title` as 'Store Name', s.`street` as 'Store Street', s.`city` as 'Store City' FROM " . ASL_PREFIX . 'leads as l LEFT JOIN ' . ASL_PREFIX . 'stores as s ON s.id = l.store_id WHERE l.created_on between %s AND %s', $start_date, $end_date));

        //  Just send the headers for empty
        if (!$leads) {
            $leads = [['id' =>  '', 'Name' => '', 'Phone' => '', 'Postal Code' => '', 'Email' => '', 'Message' =>'']];
        }

        $csv = new \AgileStoreLocator\Admin\CSV\Reader();

        //  Rows to be exported
        $all_rows = [];

        //  Loop over the stores data
        foreach ($leads as $value) {
            //unset($value->id);

            //  Push into rows collection
            $all_rows[] = $value;
        }

        $csv->setRows($all_rows);

        $csv->write(\AgileStoreLocator\Admin\CSV\Reader::DOWNLOAD, 'leads-export.csv');
        
        die;
    }

    /**
     * [get_leads GET the Leads List]
     * @return [type] [description]
     */
    public function get_leads()
    {
        global $wpdb;

        // Pagination and basic params
        $start  = isset($_REQUEST['iDisplayStart']) ? intval($_REQUEST['iDisplayStart']) : 0;
        $length = isset($_REQUEST['iDisplayLength']) && $_REQUEST['iDisplayLength'] != '-1'
                  ? intval($_REQUEST['iDisplayLength']) : 10;
        $sEcho  = isset($_REQUEST['sEcho']) ? intval($_REQUEST['sEcho']) : 1;

        // Whitelisted columns for filtering and ordering
        $acolumns        = ['l.id', 'l.id', 'l.name', 'l.phone', 'l.email', 'l.postal_code', 's.title', 'l.created_on'];
        $allowed_columns = ['id', 'name', 'phone', 'email', 'postal_code', 'created_on'];

        $clause     = [];
        $sql_params = [];

        // Filtering
        if (isset($_REQUEST['filter']) && is_array($_REQUEST['filter'])) {
            foreach ($_REQUEST['filter'] as $key => $value) {
                if (!$key || !$value || $key === 'undefined' || $value === 'undefined') {
                    continue;
                }

                $key   = sanitize_text_field($key);
                $value = sanitize_text_field($value);

                // Allow filtering only on safe columns (no table prefix here)
                if (in_array($key, $allowed_columns, true)) {
                    $clause[]     = "`l`.`$key` LIKE %s";
                    $sql_params[] = '%' . $wpdb->esc_like($value) . '%';
                }
            }
        }

        $sWhere = $clause ? 'WHERE ' . implode(' AND ', $clause) : '';
        $sLimit = "LIMIT $start, $length";

        // Sorting logic
        $sOrder = '';
        if (isset($_REQUEST['iSortCol_0']) && isset($_REQUEST['iSortingCols'])) {
            for ($i = 0; $i < intval($_REQUEST['iSortingCols']); $i++) {
                $col_index = intval($_REQUEST['iSortCol_' . $i]);
                $sort_dir  = (isset($_REQUEST['sSortDir_' . $i]) && strtolower($_REQUEST['sSortDir_' . $i]) === 'asc') ? 'ASC' : 'DESC';

                if (isset($acolumns[$col_index])) {
                    $column_raw = $acolumns[$col_index];

                    // Ensure the base column is allowed for ordering
                    $base_column = str_replace(['l.', 's.'], '', $column_raw);
                    if (in_array($base_column, $allowed_columns, true) || $base_column === 'title') {
                        $sOrder = "ORDER BY $column_raw $sort_dir";
                        break;
                    }
                }
            }
        }

        // Query components
        $fields = '`l`.`id`, `l`.`name`, `l`.`phone`, `l`.`postal_code`, `l`.`email`, `l`.`message`, `l`.`created_on`, `s`.`title`';
        $table  = ASL_PREFIX . 'leads AS l LEFT JOIN ' . ASL_PREFIX . 'stores AS s ON s.id = l.store_id';

        $sql      = "SELECT $fields FROM $table";
        $sqlCount = "SELECT COUNT(*) as count FROM $table";

        // Final queries
        $data_query  = "$sql $sWhere $sOrder $sLimit";
        $count_query = "$sqlCount $sWhere";

        $data_output    = $wpdb->get_results($wpdb->prepare($data_query, ...$sql_params));
        $r              = $wpdb->get_results($wpdb->prepare($count_query, ...$sql_params));
        $iFilteredTotal = isset($r[0]->count) ? intval($r[0]->count) : 0;

        // Prepare response
        $output = [
            'sEcho'                => $sEcho,
            'iTotalRecords'        => $iFilteredTotal,
            'iTotalDisplayRecords' => $iFilteredTotal,
            'aaData'               => []
        ];

        // Format output rows
        foreach ($data_output as $row) {
            $row->dated = strtotime($row->created_on);

            $row->check = '<div class="custom-control custom-checkbox">
            <input type="checkbox" data-id="' . esc_attr($row->id) . '" class="custom-control-input" id="asl-chk-' . esc_attr($row->id) . '">
            <label class="custom-control-label" for="asl-chk-' . esc_attr($row->id) . '"></label>
            </div>';

            $row->action = '<div class="edit-options">
            <a data-id="' . esc_attr($row->id) . '" title="Edit" class="edit_lead text-primary">View</a>
        </div>';

            $output['aaData'][] = $row;
        }

        return $this->send_response($output);
    }

    /**
     * [get_lead_by_id get lead by id]
     * @return [type] [description]
     */
    public function get_lead_by_id()
    {
        global $wpdb;

        $response          = new \stdclass();
        $response->success = false;

        $store_id = isset($_REQUEST['lead_id']) ? intval($_REQUEST['lead_id']) : 0;

        $response->list = $wpdb->get_results('SELECT * FROM ' . ASL_PREFIX . 'leads WHERE id = ' . $store_id);

        if (count($response->list) != 0) {
            $response->success = true;
        } else {
            $response->error = esc_attr__('Error occurred while geting record', 'asl_locator');
        }
        return $this->send_response($response);
    }
}