File: //home/temp/yarusvl.ru/api/Suppliers.php
<?php
require_once('Mgc.php');
class Suppliers extends Mgc {
    public $categories = array();
    /*Выбираем все склады*/
    public function get_suppliers($filter = array()) {
        $limit = 100;
        $page = 1;
        $category_id_filter = '';
        $category_join = '';
        $visible_filter = '';
        $product_id_filter = '';
        $product_join = '';
        $visible_supplier_filter = '';
        $features_filter = '';
        $other_filter = '';
        if(isset($filter['limit'])) {
            $limit = max(1, intval($filter['limit']));
        }
        if(isset($filter['page'])) {
            $page = max(1, intval($filter['page']));
        }
        $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);
        if(isset($filter['visible'])) {
            $visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible']));
        }
        if(isset($filter['visible_supplier'])) {
            $visible_supplier_filter = $this->db->placehold('AND s.visible=?', intval($filter['visible_supplier']));
        }
        if(isset($filter['product_id'])) {
            $product_id_filter = $this->db->placehold('AND p.id in (?@)', (array)$filter['product_id']);
            $product_join = $this->db->placehold("LEFT JOIN __products p ON p.supplier_id=s.id");
        }
        if(!empty($filter['category_id'])) {
            $category_join = $this->db->placehold("LEFT JOIN __products p ON p.supplier_id=s.id LEFT JOIN __products_categories pc ON p.id = pc.product_id");
            $category_id_filter = $this->db->placehold("AND pc.category_id in(?@) $visible_filter", (array)$filter['category_id']);
        }
        if(!empty($filter['features'])) {
            foreach($filter['features'] as $feature=>$value) {
                $features_filter .= $this->db->placehold('AND p.id in (SELECT product_id FROM __options WHERE feature_id=? AND translit in(?@) ) ', $feature, (array)$value);
            }
            if (empty($category_join)) {
                $features_filter .= $visible_filter;
                $category_join = $this->db->placehold("LEFT JOIN __products p ON (p.supplier_id=s.id)");
            }
        }
        if (!empty($filter['other_filter'])) {
            $other_filter = "AND (";
            if (in_array("featured", $filter['other_filter'])) {
                $other_filter .= "p.featured=1 OR ";
            }
            if (in_array("discounted", $filter['other_filter'])) {
                $other_filter .= "(SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.compare_price>0 LIMIT 1) = 1 OR ";
            }
            $other_filter = substr($other_filter, 0, -4).")";
            if (empty($category_join)) {
                $other_filter .= $visible_filter;
                $category_join = $this->db->placehold("LEFT JOIN __products p ON (p.supplier_id=s.id)");
            }
        }
        $lang_sql = $this->languages->get_query(array('object'=>'supplier'));
        // Выбираем все поставщикы
        $query = $this->db->placehold("SELECT 
                DISTINCT s.id, 
                s.url, 
                s.image, 
                s.last_modify,
                s.visible,
                s.position,
                $lang_sql->fields 
            FROM __suppliers s
            $lang_sql->join
            $category_join
            $product_join
            WHERE 
                1 
                $category_id_filter
                $features_filter
                $visible_supplier_filter
                $product_id_filter
                $other_filter
            ORDER BY s.position
            $sql_limit
        ");
   //   echo $query;
    //  exit;
        $this->db->query($query);
        //var_dump($this->db->results());
        return $this->db->results();
    }
    function get_categories($supp_id){
        $this->db->query('SELECT s.*,c.name as cname  FROM __categories_suppliers s LEFT JOIN __categories c ON c.id=s.cat_id WHERE s.supplier_id=? ', $supp_id);
        $cats = $this->db->results();
     $categories =  array();
        foreach ($cats as $k=> $cat){
            $categories[$cat->parent_id][$cat->sup_id] = $cat;
//var_dump($categories);
        }
     //   exit;
        return $categories;
        foreach ($cats as $k=> $cat){
            if((int)$cat->parent_id==0){
                $categories[(string)$cat->sup_id] = $cat;
                $categories[(string)$cat->sup_id]->level = 1;
                unset($cats[$k]);
            }
        }
        foreach ($cats as $k=> $cat){
                 if($cat->parent_id!=0 && isset($categories[(int)$cat->parent_id])){
                     $categories[(string)$cat->parent_id]->childs[(int)$cat->sup_id] = $cat;
                     $categories[(string)$cat->parent_id]->level=2;
                     unset($cats[$k]);
                 }
                 else{
                     //var_dump();
                 //    echo " error need 3d level ".$cat->parent_id.$cat->title.PHP_EOL;
                 }
        }
        foreach ($cats as $k=> $cat){
            if(isset($cat->childs)){
                foreach($cat->childs as $k1=>$v){
                    if((int)$k1==(string)$cat->parent_id){
                     $categories[$k]->childs[(int)$k1] = $cat;
                     $categories[(string)$cat->parent_id]->level=3;
                     unset($cats[$k]);
                    }
                }
            }
        }
      //  var_dump($categories);exit;
        return  $categories;
    }
    public function count_suppliers($filter = array()) {
        $category_id_filter = '';
        $category_join = '';
        $visible_filter = '';
        $product_id_filter = '';
        $product_join = '';
        $visible_supplier_filter = '';
        $features_filter = '';
        $other_filter = '';
        if(isset($filter['visible'])) {
            $visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible']));
        }
        if(isset($filter['visible_supplier'])) {
            $visible_supplier_filter = $this->db->placehold('AND s.visible=?', intval($filter['visible_supplier']));
        }
        if(isset($filter['product_id'])) {
            $product_id_filter = $this->db->placehold('AND p.id in (?@)', (array)$filter['product_id']);
            $product_join = $this->db->placehold("LEFT JOIN __products p ON p.supplier_id=s.id");
        }
        if(!empty($filter['category_id'])) {
            $category_join = $this->db->placehold("LEFT JOIN __products p ON p.supplier_id=s.id LEFT JOIN __products_categories pc ON p.id = pc.product_id");
            $category_id_filter = $this->db->placehold("AND pc.category_id in(?@) $visible_filter", (array)$filter['category_id']);
        }
        if(!empty($filter['features'])) {
            foreach($filter['features'] as $feature=>$value) {
                $features_filter .= $this->db->placehold('AND p.id in (SELECT product_id FROM __options WHERE feature_id=? AND translit in(?@) ) ', $feature, (array)$value);
            }
            if (empty($category_join)) {
                $features_filter .= $visible_filter;
                $category_join = $this->db->placehold("LEFT JOIN __products p ON (p.supplier_id=s.id)");
            }
        }
        if (!empty($filter['other_filter'])) {
            $other_filter = "AND (";
            if (in_array("featured", $filter['other_filter'])) {
                $other_filter .= "p.featured=1 OR ";
            }
            if (in_array("discounted", $filter['other_filter'])) {
                $other_filter .= "(SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.compare_price>0 LIMIT 1) = 1 OR ";
            }
            $other_filter = substr($other_filter, 0, -4).")";
            if (empty($category_join)) {
                $other_filter .= $visible_filter;
                $category_join = $this->db->placehold("LEFT JOIN __products p ON (p.supplier_id=s.id)");
            }
        }
        $lang_sql = $this->languages->get_query(array('object'=>'supplier'));
        // Выбираем все поставщикы
        $query = $this->db->placehold("SELECT
                count(distinct s.id) as count
            FROM __suppliers s
            $lang_sql->join
            $category_join
            $product_join
            WHERE
                1
                $category_id_filter
                $features_filter
                $visible_supplier_filter
                $product_id_filter
                $other_filter
        ");
        $this->db->query($query);
        return $this->db->result('count');
    }
    /*Выбираем конкретный поставщик*/
    public function get_supplier($id) {
        if (empty($id)) {
            return false;
        }
        if(is_int($id)) {
            $filter = $this->db->placehold('AND s.id = ?', intval($id));
        } else {
            $id = $this->translit_alpha($id);
            $filter = $this->db->placehold('AND s.url = ?', $id);
        }
        
        $lang_sql = $this->languages->get_query(array('object'=>'supplier'));
        $query = "SELECT 
                s.*, 
                
                $lang_sql->fields                
            FROM __suppliers s
            $lang_sql->join
            WHERE 
                1 
                $filter
            LIMIT 1
        ";
      //  echo($query);
        $this->db->query($query);
        return $this->db->result();
    }
    /*Добавление поставщика*/
    public function add_supplier($supplier) {
        $supplier = (object)$supplier;
        if(isset($supplier->url)){
            $supplier->url = preg_replace("/[\s]+/ui", '', $supplier->url);
                    $supplier->url = strtolower(preg_replace("/[^0-9a-z]+/ui", '', $supplier->url));
        }else{
            $supplier->url = '';
        }
        if(empty($supplier->url)) {
            $supplier->url = $this->translit_alpha($supplier->name);
        }
        while($this->get_supplier((string)$supplier->url)) {
            if(preg_match('/(.+)([0-9]+)$/', $supplier->url, $parts)) {
                $supplier->url = $parts[1].''.($parts[2]+1);
            } else {
                $supplier->url = $supplier->url.'2';
            }
        }
        
        // Проверяем есть ли мультиязычность и забираем описания для перевода
        $result = $this->languages->get_description($supplier, 'supplier');
        $this->db->query("INSERT INTO __suppliers SET ?%", $supplier);
        //die($supplier);
        $id = $this->db->insert_id();
        $this->db->query("UPDATE __suppliers SET position=id WHERE id=? LIMIT 1", $id);
        
        // Если есть описание для перевода. Указываем язык для обновления
        if(!empty($result->description)) {
            $this->languages->action_description($id, $result->description, 'supplier');
        }
        return $id;
    }
    /*Обновление поставщика*/
    public function update_supplier($id, $supplier) {
        $supplier = (object)$supplier;
        // Проверяем есть ли мультиязычность и забираем описания для перевода
        $result = $this->languages->get_description($supplier, 'supplier');
        $query = $this->db->placehold("UPDATE __suppliers SET ?% WHERE id=? LIMIT 1", $supplier, intval($id));
        $this->db->query($query);
        
        // Если есть описание для перевода. Указываем язык для обновления
        if(!empty($result->description)) {
            $this->languages->action_description($id, $result->description, 'supplier', $this->languages->lang_id());
        }
        
        return $id;
    }
    /*Обновление поставщика*/
    public function update_cat_supplier($id, $supplier) {
        $supplier = (object)$supplier;
        $query = $this->db->placehold("UPDATE __categories_suppliers SET ?% WHERE id=? LIMIT 1", $supplier, intval($id));
        $this->db->query($query);
        
        return $id;
    }
    
    /*Удаление поставщика*/
    public function delete_supplier($id) {
        if(!empty($id)) {
            $this->image->delete_image($id, 'image', 'suppliers', $this->config->original_suppliers_dir, $this->config->resized_suppliers_dir);
            $query = $this->db->placehold("DELETE FROM __suppliers WHERE id=? LIMIT 1", $id);
            $this->db->query($query);
            $query = $this->db->placehold("UPDATE __products SET supplier_id=NULL WHERE supplier_id=?", $id);
            $this->db->query($query);
            $this->db->query("DELETE FROM __lang_suppliers WHERE supplier_id=?", $id);
        }
    }
    
}