Exemplo n.º 1
0
 /**
  * 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;
 }
Exemplo n.º 2
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);
 }