/** * Transfer sku from one stock (src) to another (dst) * * @param int $src_id * @param int $dst_id * @param int $sku_id * @param int $count * @return boolean */ public function transfer($src_id, $dst_id, $sku_id, $count = null) { $src_id = (int) $src_id; $dst_id = (int) $dst_id; $sku_id = (int) $sku_id; $stock_model = new shopStockModel(); $data = $stock_model->getByField('id', array($src_id, $dst_id), true); if (count($data) < 2) { return false; } // count data $data = $this->query("\n SELECT stock_id, count, product_id\n FROM {$this->table}\n WHERE sku_id = {$sku_id} AND stock_id IN({$src_id}, {$dst_id})")->fetchAll('stock_id', true); $src_count = isset($data[$src_id]) ? $data[$src_id]['count'] : null; $dst_count = isset($data[$dst_id]) ? $data[$dst_id]['count'] : null; if ($dst_count === null) { return true; } $product_id = $data[$dst_id]['product_id']; if ($count === null) { // get all from src if src has numeric count if ($src_count !== null) { $count = $src_count; } } else { if ($src_count !== null) { if ($src_count <= 0) { $count = 0; } else { $count = min((int) $count, $src_count); } } else { $count = (int) $count; } } if (!$count) { return true; } $log_model = new shopProductStocksLogModel(); if (!$this->updateByField(array('sku_id' => $sku_id, 'stock_id' => $src_id), array('count' => $src_count - $count))) { return false; } $log_model->insert(array('product_id' => $product_id, 'sku_id' => $sku_id, 'stock_id' => $src_id, 'before_count' => $src_count, 'after_count' => $src_count - $count, 'diff_count' => -$count)); if (!$this->updateByField(array('sku_id' => $sku_id, 'stock_id' => $dst_id), array('count' => $dst_count + $count))) { return false; } $log_model->add(array('product_id' => $product_id, 'sku_id' => $sku_id, 'stock_id' => $dst_id, 'before_count' => $dst_count, 'after_count' => $dst_count + $count, 'diff_count' => $count)); 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); } } }