Esempio n. 1
0
 /**
  * @param array $product_ids
  * @return array
  */
 public function skus($product_ids)
 {
     if (!$product_ids) {
         return array();
     }
     $skus_model = new shopProductSkusModel();
     $rows = $skus_model->select('*')->where('product_id IN (i:ids)', array('ids' => $product_ids))->order('sort')->fetchAll();
     $skus = array();
     foreach ($rows as $row) {
         $skus[$row['product_id']][] = $row;
     }
     return $skus;
 }
 /**
  * Set count for stock and sku. 
  * Make insert, update or delete depending on input parameters and current state (sku-stock record in table)
  * Take into account stocking log (@see shopProductStocksLog)
  * 
  * @param string[mixed] $data Specify sku ID, stock ID, count
  * @param int           $data['sku_id'] sku ID, obligatory
  * @param int           $data['product_id'] product ID, optional
  * @param int           $data['stock_id'] stock ID, obligatory
  * @param int|null      $data['count'] count, obligatory. 
  * 
  * <code>
  * array(
  *     'sku_id' => 123,      // sku ID, obligatory
  *     'product_id' => 111,  // product ID, optional
  *     'stock_id' => 23,     // stock ID, obligatory
  *     'count' => 12,        // Maybe null or integer greater or equals 0
  * )
  * </code>
  * 
  * @return boolean
  */
 public function set($data)
 {
     if (empty($data['sku_id']) || empty($data['stock_id'])) {
         return false;
     }
     // isset doesn't work correctly with null
     if (!array_key_exists('count', $data)) {
         return false;
     }
     $count = $data['count'];
     if (empty($data['product_id'])) {
         $product_skus_model = new shopProductSkusModel();
         $data['product_id'] = $product_skus_model->select('product_id')->where('sku_id = :sku_id', array('sku_id' => $data['sku_id']))->fetchField();
     }
     if (empty($data['product_id'])) {
         return false;
     }
     $key = array('sku_id' => $data['sku_id'], 'stock_id' => $data['stock_id']);
     $item = $this->getByField($key);
     if ($item && $count !== null && $count == $item['count'] || !$item && $count === null) {
         // nothing to update
         return true;
     }
     $log_data = array('product_id' => $data['product_id'], 'sku_id' => $data['sku_id'], 'stock_id' => $data['stock_id'], 'before_count' => null, 'after_count' => $count);
     if ($item) {
         $log_data['before_count'] = $item['count'];
     }
     if ($count === null) {
         $op = 'delete';
     } else {
         if ($item) {
             $op = 'update';
         } else {
             $op = 'insert';
         }
     }
     if ($op == 'delete') {
         $this->deleteByField($key);
     } else {
         if ($op == 'update') {
             $this->updateByField($key, $data);
         } else {
             $this->insert($data);
         }
     }
     $log_model = new shopProductStocksLogModel();
     $log_model->add($log_data);
     return true;
 }
 private function workupList(&$list, $fields)
 {
     if (!$list) {
         return;
     }
     foreach ($list as &$v) {
         $v['icon'] = shopProductStocksLogModel::getIcon($v['type']);
         if (!$v['description']) {
             if ($v['after_count'] === null) {
                 $v['description'] = _w('In stock value updated to ∞');
             } else {
                 $v['description'] = sprintf(_w('In stock value updated to %d'), $v['after_count']);
             }
         } else {
             if ($v['type'] == self::TYPE_ORDER) {
                 $v['description'] = sprintf(_w($v['description']), '<a href="?action=orders#/order/' . $v['order_id'] . '/">' . shopHelper::encodeOrderId($v['order_id']) . '</a>');
             }
         }
     }
     unset($v);
     $stock_ids = array();
     foreach ($list as $v) {
         $stock_ids[] = $v['stock_id'];
     }
     $model = new shopStockModel();
     $stocks = $model->getByField('id', array_unique($stock_ids), 'id');
     foreach ($list as &$v) {
         if (isset($stocks[$v['stock_id']])) {
             $v['stock_name'] = $stocks[$v['stock_id']]['name'];
         }
     }
     unset($v);
     foreach ($fields as $f) {
         if ($f == 'sku_name') {
             $sku_ids = array();
             foreach ($list as $v) {
                 $sku_ids[] = $v['sku_id'];
             }
             $model = new shopProductSkusModel();
             $skus = $model->select('id,sku,name')->where("id IN(" . implode(',', array_unique($sku_ids)) . ")")->fetchAll('id');
             foreach ($list as &$v) {
                 if (isset($skus[$v['sku_id']])) {
                     $v['sku_name'] = $skus[$v['sku_id']]['name'];
                     if ($v['sku_name']) {
                         if ($skus[$v['sku_id']]['sku']) {
                             $v['sku_name'] .= ' (' . $skus[$v['sku_id']]['sku'] . ')';
                         }
                     } else {
                         if ($skus[$v['sku_id']]['sku']) {
                             $v['sku_name'] = $skus[$v['sku_id']]['sku'];
                         }
                     }
                 }
             }
             unset($v);
         }
         if ($f == 'product_name') {
             $product_ids = array();
             foreach ($list as $v) {
                 $product_ids[] = $v['product_id'];
             }
             $model = new shopProductModel();
             $products = $model->select('id,name')->where("id IN (" . implode(',', array_unique($product_ids)) . ")")->fetchAll('id');
             foreach ($list as &$v) {
                 if (isset($products[$v['product_id']])) {
                     $v['product_name'] = $products[$v['product_id']]['name'];
                 }
             }
             unset($v);
         }
     }
 }
 public function productsAutocomplete($q, $limit = null)
 {
     $limit = $limit !== null ? $limit : $this->limit;
     $product_model = new shopProductModel();
     $q = $product_model->escape($q, 'like');
     $fields = 'id, name AS value, price, count, sku_id';
     $products = $product_model->select($fields)->where("name LIKE '{$q}%'")->limit($limit)->fetchAll('id');
     $count = count($products);
     if ($count < $limit) {
         $product_skus_model = new shopProductSkusModel();
         $product_ids = array_keys($product_skus_model->select('id, product_id')->where("sku LIKE '{$q}%'")->limit($limit)->fetchAll('product_id'));
         if ($product_ids) {
             $data = $product_model->select($fields)->where('id IN (' . implode(',', $product_ids) . ')')->limit($limit - $count)->fetchAll('id');
             // not array_merge, because it makes first reset numeric keys and then make merge
             $products = $products + $data;
         }
     }
     // try find with LIKE %query%
     if (!$products) {
         $products = $product_model->select($fields)->where("name LIKE '%{$q}%'")->limit($limit)->fetchAll();
     }
     $currency = wa()->getConfig()->getCurrency();
     foreach ($products as &$p) {
         $p['price_str'] = wa_currency($p['price'], $currency);
     }
     unset($p);
     if (waRequest::get('with_sku_name')) {
         $sku_ids = array();
         foreach ($products as $p) {
             $sku_ids[] = $p['sku_id'];
         }
         $product_skus_model = new shopProductSkusModel();
         $skus = $product_skus_model->getByField('id', $sku_ids, 'id');
         $sku_names = array();
         foreach ($skus as $sku_id => $sku) {
             $name = '';
             if ($sku['name']) {
                 $name = $sku['name'];
                 if ($sku['sku']) {
                     $name .= ' (' . $sku['sku'] . ')';
                 }
             } else {
                 $name = $sku['sku'];
             }
             $sku_names[$sku_id] = $name;
         }
         foreach ($products as &$p) {
             $p['sku_name'] = $sku_names[$p['sku_id']];
         }
         unset($p);
     }
     return array_values($products);
 }
Esempio n. 5
0
 public function updateStockCount($data)
 {
     if (!$data) {
         return;
     }
     $product_skus_model = new shopProductSkusModel();
     $product_stocks_model = new shopProductStocksModel();
     $stocks_log_model = new shopProductStocksLogModel();
     $sku_ids = array_map('intval', array_keys($data));
     if (!$sku_ids) {
         return;
     }
     $skus = $product_skus_model->select('id,product_id')->where("id IN(" . implode(',', $sku_ids) . ")")->fetchAll('id');
     $sku_ids = array_keys($skus);
     if (!$sku_ids) {
         return;
     }
     $product_ids = array();
     foreach ($data as $sku_id => $sku_stock) {
         $sku_id = (int) $sku_id;
         if (!isset($skus[$sku_id]['product_id'])) {
             continue;
         }
         $product_id = $skus[$sku_id]['product_id'];
         foreach ($sku_stock as $stock_id => $count) {
             $stock_id = (int) $stock_id;
             if ($stock_id) {
                 $item = $product_stocks_model->getByField(array('sku_id' => $sku_id, 'stock_id' => $stock_id));
                 if (!$item) {
                     continue;
                 }
                 $product_stocks_model->set(array('sku_id' => $sku_id, 'product_id' => $product_id, 'stock_id' => $stock_id, 'count' => $item['count'] + $count));
             } else {
                 $old_count = $product_skus_model->select('count')->where('id=i:sku_id', array('sku_id' => $sku_id))->fetchField();
                 if ($old_count !== null) {
                     $log_data = array('product_id' => $product_id, 'sku_id' => $sku_id, 'before_count' => $old_count, 'after_count' => $old_count + $count, 'diff_count' => $count);
                     $stocks_log_model->insert($log_data);
                 }
                 $this->exec("UPDATE `shop_product_skus` SET count = count + ({$count})\n                        WHERE id = {$sku_id}");
             }
             if (isset($skus[$sku_id]['product_id'])) {
                 $product_ids[] = $product_id;
             }
         }
     }
     if (!$product_ids) {
         return;
     }
     // correct sku counters
     $sql = "\n            UPDATE `shop_product_skus` sk JOIN (\n                SELECT sk.id, SUM(st.count) AS count FROM `shop_product_skus` sk\n                JOIN `shop_product_stocks` st ON sk.id = st.sku_id\n                WHERE sk.id IN(" . implode(',', $sku_ids) . ")\n                GROUP BY sk.id\n                ORDER BY sk.id\n            ) r ON sk.id = r.id\n            SET sk.count = r.count\n            WHERE sk.count IS NOT NULL";
     $this->exec($sql);
     // correct product counters
     $sql = "\n            UPDATE `shop_product` p JOIN (\n                SELECT p.id, SUM(sk.count) AS count FROM `shop_product` p\n                JOIN `shop_product_skus` sk ON p.id = sk.product_id\n                WHERE p.id IN(" . implode(',', array_unique($product_ids)) . ") AND sk.available = 1\n                GROUP BY p.id\n                ORDER BY p.id\n            ) r ON p.id = r.id\n            SET p.count = r.count\n            WHERE p.count IS NOT NULL";
     $this->exec($sql);
 }
 public function workupData($data)
 {
     $currency = $data['currency'] ? $data['currency'] : $this->getConfig()->getCurrency();
     $file_names = array();
     // sku_id => filename of attachment
     foreach ($data['skus'] as $id => &$sku) {
         if (!isset($sku['file_name'])) {
             $file_names[$sku['id']] = '';
             // need to obtain filename
         }
         // price in light of l18n: if ru - delimeter is ',', if en - delimeter is '.'
         $sku['price_loc'] = (string) (double) $sku['price'];
         $sku['price_str'] = wa_currency($sku['price'], $currency);
         $sku['stock_icon'] = array();
         $sku['stock_icon'][0] = shopHelper::getStockCountIcon($sku['count']);
         if (!empty($sku['stock'])) {
             foreach ($sku['stock'] as $stock_id => $count) {
                 $sku['stock_icon'][$stock_id] = shopHelper::getStockCountIcon($count, $stock_id);
             }
         }
     }
     unset($sku);
     // obtain filename
     if ($file_names) {
         $product_skus_model = new shopProductSkusModel();
         $file_names = $product_skus_model->select('id, file_name')->where("id IN('" . implode("','", array_keys($file_names)) . "')")->fetchAll('id', true);
         foreach ($file_names as $sku_id => $file_name) {
             $data['skus'][$sku_id]['file_name'] = $file_name;
         }
     }
     return $data;
 }