/** * @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); }
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; }