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