File "store.php"

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

<?php

namespace AgileStoreLocator\Model;

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

/**
*
* To access the Stores database table
*
* @package    AgileStoreLocator
* @subpackage AgileStoreLocator/elements/store
* @author     AgileStoreLocator Team <support@agilelogix.com>
*/
class Store
{
    /**
     * [get_searchable_columns Return the list of searchable columns]
     * @return [type] [description]
     */
    public static function get_searchable_columns()
    {

        return ['id', 'title', 'lat', 'lng', 'street', 'city', 'state', 'postal_code', 'country', 'email', 'phone', 'fax', 'website', 'is_disabled', 'category', 'marker_id', 'logo_id', 'created_on', 'pending'];
    }

    /**
     * [get_last_ts Return the last timestamp of updated_on or created_on]
     * @return [type] [description]
     */
    public static function get_last_ts()
    {

        global $wpdb;

        $ASL_PREFIX = ASL_PREFIX;

        $max_create = $wpdb->get_var("SELECT MAX(created_on) FROM `{$ASL_PREFIX}stores`");

        $max_update = $wpdb->get_var("SELECT MAX(updated_on) FROM `{$ASL_PREFIX}stores`");

        return ($max_create > $max_update) ? $max_create : $max_update;
    }

    /**
     * [get_all_fields Return all the fields]
     * @return [type] [description]
     */
    public static function get_all_fields()
    {
        $default_columns = self::get_searchable_columns();
        // Values to remove
        $to_remove = ['id'];
        // Remove values from the original array
        $default_columns = array_diff($default_columns, $to_remove);
        $custom_fields = \AgileStoreLocator\Helper::get_custom_fields();
        if ($custom_fields) {
            $custom_fields   = array_keys($custom_fields);
            $default_columns = array_merge($default_columns, $custom_fields);
        }

        return $default_columns;
    }

    /**
     * [get_store_id_via_slug Return the Store ID via SLUG]
     * @return [type] [description]
     */
    public static function get_store_id_via_slug()
    {

        //  For the Slug
        $q_param   = get_query_var('sl-store');

        if ($q_param) {

            global $wpdb;

            $ASL_PREFIX = ASL_PREFIX;

            // Clear the Slug for SQL injection
            $q_param = preg_replace('/-+/', '-', $q_param);

            $where_clause = 's.`slug` = %s';

            $store_inst  = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$ASL_PREFIX}stores as s WHERE {$where_clause};", [$q_param]));

            return $store_inst;
        }

        return null;
    }

    /**
     * [get_stores Get the stores by the given clause]
     * @param  array   $where_clause [description]
     * @param  [type]  $limit        [description]
     * @param  integer $offset       [description]
     * @return [type]                [description]
     */
    public static function get_stores($where_clause = [], $limit = 10000, $offset = 0, $user_id = null, $show_disabled = true)
    {

        global $wpdb;

        $ASL_PREFIX         = ASL_PREFIX;
        $category_clause    = '';
        $join_clause        = '';
        $where_query        = '';

        //  Validate the allowed clauses
        foreach ($where_clause as $cl_key => $cl_value) {
            if (!in_array($cl_key, ['category', 'countries', 'state', 'city', 'country','pending', 'lang', 'meta', 'id', 'title', 'description'])) {
                unset($where_clause[$cl_key]);
            }
        }

        //  Countries Clause
        if (isset($where_clause['countries'])) {

            $countries = $where_clause['countries'];

            $countries = str_replace(', ', ',', $countries);
            $countries = explode(',', $countries);
            array_walk($countries, function (&$x) {$x = "'$x'";});
            $where_query .= " AND {$ASL_PREFIX}countries.`country` IN (".implode(',', $countries).')';
            unset($where_clause['countries']);
        }

        //  Cities Clause
        if (isset($where_clause['city'])) {

            $city   = $where_clause['city'];

            $city   = str_replace(', ', ',', $city);
            $city   = explode(',', $city);
            array_walk($city, function (&$x) {$x = "'$x'";});
            $where_query .= ' AND `city` IN ('.implode(',', $city).')';
            unset($where_clause['city']);
        }

        //  Categories Clause
        if (isset($where_clause['category'])) {

            $categories       = $where_clause['category'];

            $the_categories   = array_map('intval', explode(',', $categories));
            $the_categories   = implode(',', $the_categories);

            $category_clause  = " AND {$ASL_PREFIX}stores_categories.`category_id` IN (".$the_categories.')';

            unset($where_clause['category']);
        }

        //  Pending Clause
        if (isset($where_clause['pending'])) {

            if ($where_clause['pending'] == 2) {
                $where_query .= ' AND  (s.`pending` IS NULL OR s.`pending` = 0)';
            } elseif ($where_clause['pending'] == 1) {
                $where_query .= ' AND s.`pending` = 1';
            }
            /*else if ($where_clause['pending'] == 0) {
              $pending_clause = '';
            }*/

            unset($where_clause['pending']);
        }

        //  Filter ID
        if (isset($where_clause['id'])) {

            $store_ids   = $where_clause['id'];

            $store_ids   = array_map('intval', explode(',', $store_ids));
            $store_ids   = implode(',', $store_ids);

            // ID are there?
            if ($store_ids) {
                $category_clause  = ' AND s.`id` IN ('.$store_ids.')';
            }

            unset($where_clause['id']);
        }

        // Meta Where Clause
        if (isset($where_clause['meta'])) {

            $meta_key = $where_clause['meta']['key'];
            $meta_val = $where_clause['meta']['value'];

            // Validating $meta_key and $meta_val
            if (preg_match('/^shipping_id_\d+$/', $meta_key) && ctype_digit(strval($meta_val))) {

                // Build the JOIN and WHERE clauses
                $join_clause .= " LEFT JOIN {$ASL_PREFIX}stores_meta m ON s.id = m.store_id AND m.option_name = '$meta_key'";
                $where_query .= " AND m.option_value = '$meta_val'";
            }

            unset($where_clause['meta']);
        }

        //  Get the ddl fields
        $ddl_fields  = \AgileStoreLocator\Model\Attribute::get_fields();

        // ddl_fields in the query
        $ddl_fields_str = implode(', ', array_map(function ($f) { return "`$f`";}, $ddl_fields));

        //  Get the stores
        $query   = "SELECT s.`id`, `title`,  `description`, CONCAT_WS(', ', IF(LENGTH(`street`),`street`,NULL), `city`, IF(LENGTH(`state`),`state`,NULL), IF(LENGTH(`postal_code`),`postal_code`,NULL), {$ASL_PREFIX}countries.country) as address, `street`,  `city`,  `state`, `postal_code`, `lat`,`lng`,`phone`,  `fax`,`email`,`website`,`logo_id`,{$ASL_PREFIX}storelogos.`path`,`marker_id`,`description_2`,`open_hours`, `ordr`, $ddl_fields_str, `custom`,`slug`, {$ASL_PREFIX}countries.`country` , `s`.`created_on`, `s`.`updated_on`, `s`.`pending`
          FROM {$ASL_PREFIX}stores as s
          LEFT JOIN {$ASL_PREFIX}storelogos ON logo_id = {$ASL_PREFIX}storelogos.id
          LEFT JOIN {$ASL_PREFIX}countries ON s.`country` = {$ASL_PREFIX}countries.id
          LEFT JOIN {$ASL_PREFIX}stores_categories ON s.`id` = {$ASL_PREFIX}stores_categories.store_id $join_clause
          WHERE s.`id` $category_clause".$where_query;

        //  When we have user ID add it in the clause
        if ($user_id) {
            //  Clean it must be integer
            $user_id = intval($user_id);
            $query  .= " AND s.`id` IN (SELECT store_id FROM `{$ASL_PREFIX}stores_meta` WHERE option_name = 'store_owner' AND  option_value = $user_id)";
        }

        //  Show the disabled Stores
        if ($show_disabled) {
            $query  .= ' AND (is_disabled is NULL || is_disabled = 0) ';
        }

        //  Add the category clause
        $str_clause     = '';
        $clause_params  = [];

        //  Must be an array
        if (!is_array($where_clause)) {
            $where_clause = [];
        }

        //  Language Clause
        if (isset($where_clause['lang'])) {

            // For all the languages
            if ($where_clause['lang'] == '*') {
                unset($where_clause['lang']);
            }
        } else {
            $where_clause['lang'] = '';
        }

        // loop over the clauses
        foreach ($where_clause as $k => $value) {
            $str_clause      .= " AND {$k} = %s";
            $clause_params[]  = $value;
        }

        //  Add the clause
        $query .= $str_clause;
        $limit  = intval($limit);

        //  Prepare the limit clause
        $limit_clause = intval($offset).', '.intval($limit);
        $query .= " GROUP BY s.`id` ORDER BY `title` LIMIT $limit_clause;";

        //  Prepare the query
        if (!empty($clause_params)) {
            $query  = $wpdb->prepare($query, $clause_params);
        }

        //  Get the results
        $stores = $wpdb->get_results($query);

        if ($stores) {

            //   Loop over the Data
            foreach ($stores as $store) {

                //  Clean the Store
                $store = \AgileStoreLocator\Helper::sanitize_store($store);
            }
        }

        return $stores;
    }

    /**
     * [get_store Get the store by the store id or where clause]
     * @param  [type] $origLat [description]
     * @param  [type] $origLon [description]
     * @param  [type] $dist    [description]
     * @return [type]          [description]
     */
    public static function get_store($store_id, $_where_clause = null)
    {

        global $wpdb;

        $ASL_PREFIX   = ASL_PREFIX;

        // Ensure $store_id is an integer and not empty
        $store_id     = ($store_id) ? intval($store_id) : null;

        //  No store ID!
        if (!$store_id) {
            return null;
        }

        $where_clause = ($_where_clause) ? $_where_clause : "s.`id` = {$store_id}";

        // ddl_fields in the query
        $ddl_fields_str = \AgileStoreLocator\Model\Attribute::sql_query_fields();

        //  Query
        $query   = "SELECT s.`id`, `title`, `is_disabled`, `brand`, `special` ,{$ASL_PREFIX}countries.`country` as 'country_name', {$ASL_PREFIX}countries.`id` as 'country', `description`, `street`,  `city`,  `state`, `postal_code`, `lat`,`lng`,`phone`,  `fax`,`email`,`website`,`logo_id`,{$ASL_PREFIX}storelogos.`path`,`marker_id`,`description_2`,`open_hours`, `ordr`,$ddl_fields_str, `custom`,`slug`,GROUP_CONCAT({$ASL_PREFIX}stores_categories.`category_id`) AS category FROM {$ASL_PREFIX}stores as s 
          LEFT JOIN {$ASL_PREFIX}storelogos ON logo_id = {$ASL_PREFIX}storelogos.id
          LEFT JOIN {$ASL_PREFIX}countries ON s.`country` = {$ASL_PREFIX}countries.id
          LEFT JOIN {$ASL_PREFIX}stores_categories ON s.`id` = {$ASL_PREFIX}stores_categories.store_id
          WHERE ".$where_clause;

        $result = $wpdb->get_results($query);

        //  When we have a store in result
        if ($result) {

            $aRow = $result[0];

            // Logo
            if($aRow->path) {
                $aRow->logo_url = ASL_UPLOAD_URL . 'Logo/' . $aRow->path;
            }
        
            
            //	Decode the Custom Fields
			if($aRow->custom) {

				$custom_fields = json_decode($aRow->custom, true);

				if($custom_fields && is_array($custom_fields) && count($custom_fields) > 0) {

					foreach ($custom_fields as $custom_key => $custom_value) {
						
						if($custom_value) {
							$aRow->$custom_key = str_replace("\n", "<br>", esc_attr($custom_value));
						}
					}
				}
			}
            

            unset($aRow->custom);

            // Sanitize the store
            $store = \AgileStoreLocator\Helper::sanitize_store($aRow);

            return $store;
        }

        return null;
    }

    /**
     * [delete_store Delete a Store]
     * @param  [type] $store_id [description]
     * @return [type]           [description]
     */
    public static function delete_store($store_id)
    {

        global $wpdb;

        $ASL_PREFIX = ASL_PREFIX;

        // Delete Meta
        $wpdb->delete("{$ASL_PREFIX}stores_meta", ['store_id' => $store_id]);

        //  Delete the store
        return $wpdb->delete("{$ASL_PREFIX}stores", ['id' => $store_id]);
    }

    /**
     * [count_branches Count the branches of the store]
     * @param  [type]  $store_id [description]
     * @return boolean           [description]
     */
    public static function count_branches($store_id)
    {

        global $wpdb;

        $ASL_PREFIX = ASL_PREFIX;

        return $wpdb->get_var($wpdb->prepare("SELECT count(*) as c FROM {$ASL_PREFIX}stores_meta WHERE option_name = 'p_id' AND option_value = %d", [$store_id]));
    }

    /**
     * [assignBranches Assign the branches to the store]
     * @param  [type] $parent_id [description]
     * @param  [type] $branches  [description]
     * @return [type]            [description]
     */
    public static function assignBranches($parent_id, $branches)
    {

        //  Make sure it is an array
        if (!is_array($branches)) {
            $branches = explode(',', $branches);
        }

        //  Loop to add
        foreach ($branches as $b) {

            // Update Meta for branch
            if ($b && ctype_digit(strval($b))) {
                \AgileStoreLocator\Helper::set_option($b, 'p_id', $parent_id);
            }
        }

        return;
    }

    /**
   * [ Get all the stores metas by the given clause]
   * @param  [type]  $store_id        [description]
   * @return [type]                [description]
   */
    public static function get_stores_meta($store_id)
    {

        global $wpdb;

        $prefix = ASL_PREFIX;
        $table = $prefix.'stores_meta';

        // Get store meta by store id
        $get_meta = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table WHERE `option_name`= 'p_id' AND `store_id`= $store_id "));

        return $get_meta;
    }

    /**
       * [stores_to_enable_by_schedule Get those stores that will be started by now]
       * @return [type] [description]
       */
    public static function stores_to_enable_by_schedule()
    {

        global $wpdb;

        $prefix = ASL_PREFIX;

        // Get store ids is scheduled
        $schedule_store_ids = $wpdb->get_results("SELECT store_id FROM {$prefix}stores_meta WHERE option_name = 's_date' AND option_value > DATE_FORMAT(NOW(),'%d/%m/%Y %H:%i') AND option_value != '' AND is_exec != 1");

        // Store Ids
        $schedulee_ids = wp_list_pluck($schedule_store_ids, 'store_id');
        $schedulee_ids = implode(',', $schedulee_ids);

        // Check Store ids avaiable
        if (!empty($schedule_store_ids)) {

            // Update store status
            $wpdb->query("UPDATE {$prefix}stores SET is_disabled = 1 WHERE id IN ($schedulee_ids)");

        }

        // Get store ids that is  started
        $enable_store_ids = $wpdb->get_results("SELECT store_id FROM {$prefix}stores_meta WHERE option_name = 's_date' AND option_value < DATE_FORMAT(NOW(),'%d/%m/%Y %H:%i')  AND is_exec != 1");

        // Check store is avaiable?
        if (!empty($enable_store_ids)) {

            foreach ($enable_store_ids as $key => $enable_store_id) {

                // Check Store is enable / Disable
                $store_status = \AgileStoreLocator\Helper::get_option($enable_store_id->store_id, 'is_scheduled');

                if ($store_status == 1) {

                    // update store and store meta
                    $wpdb->query("UPDATE {$prefix}stores SET is_disabled = 1 WHERE id = $enable_store_id->store_id");
                    $wpdb->query("UPDATE {$prefix}stores_meta SET is_exec = 1 WHERE option_name = 's_date' AND store_id = $enable_store_id->store_id");
                } else {

                    // update store and store meta
                    $wpdb->query("UPDATE {$prefix}stores SET is_disabled = 0 WHERE id = $enable_store_id->store_id");
                    $wpdb->query("UPDATE {$prefix}stores_meta SET is_exec = 1 WHERE option_name = 's_date' AND store_id = $enable_store_id->store_id ");
                }

            }

        }

    }

    /**
     * [stores_to_disable_by_schedule Get those stores that will be stop by now]
     * @return [type] [description]
     */
    public static function stores_to_disable_by_schedule()
    {

        global $wpdb;

        $prefix = ASL_PREFIX;

        // Get all stores for disable
        $disable_store_ids = $wpdb->get_results("SELECT store_id FROM {$prefix}stores_meta WHERE option_name = 'e_date' AND option_value < DATE_FORMAT(NOW(),'%d/%m/%Y %H:%i') AND is_exec != 1 AND option_value != ''");

        // Store Ids
        $disable_ids = wp_list_pluck($disable_store_ids, 'store_id');
        $disable_ids = implode(',', $disable_ids);

        // Check Store ids avaiable
        if (!empty($disable_store_ids)) {

            // Update store and store meta table
            $wpdb->query("UPDATE {$prefix}stores SET is_disabled = 1 WHERE id IN ($disable_ids)");
            $wpdb->query("UPDATE {$prefix}stores_meta SET is_exec = 1 WHERE option_name = 'e_date' AND store_id IN ($disable_ids) ");

        }

    }
}