Fatal Error: Unexpected BLOG

主に自分用の備忘録として

【EC-CUBE】商品規格を設定している商品の在庫を、規格ではなく商品単位で動くようにする

タイトルがちょっと分かりにくいですが、まとめると以下の様な感じです。

  • 商品Aに規格設定を使って「ラッピング有無」を設定
  • 商品Aの規格画面で、それぞれの規格に在庫「10」を設定

  商品A「ラッピング有り」→ 10
  商品A「ラッピング無し」→ 10

  • 商品A「ラッピング有り」を1個受注
  • 商品Aの全ての規格の在庫が -1される

  商品A「ラッピング有り」→ 9
  商品A「ラッピング無し」→ 9


在庫の増減は、デフォルトだと、product_class_id毎に計算されているので、これを
product_id毎に増減するようにします。


環境は以下の通り


以下のサイトを参考にさせて頂きました。

SC_Product.php

在庫の増減はSC_product.phpに記述されていますので、以下のように変更します。
data/class/SC_Product.php の536行目あたり

<?php
public function reduceStock($productClassId, $quantity)
    {
        if ($quantity == 0) {
            return false;
        }

        $objQuery =& SC_Query_Ex::getSingletonInstance();

        // $productClassIdから、該当するproduct_idを取得
        $arrRet = $objQuery->select('product_id', 'dtb_products_class', 'product_class_id = ?', array($productClassId));
        if (empty($arrRet)) return false;
        $product_id = $arrRet[0]['product_id'];

        // product_idに紐づく全てのproduct_class_idに対して、在庫のUPDATEを実行
        $objQuery->update('dtb_products_class', array(),
                          'product_id = ?', array($product_id),
                          array('stock' => 'stock - ?'), array($quantity));
        // TODO エラーハンドリング

        $productsClass = $this->getDetailAndProductsClass($productClassId);
        if ($productsClass['stock_unlimited'] != '1' && $productsClass['stock'] < 0) {
            return false;
        }

        return true;
    }

変更はこれだけ。
ただし、product_idに紐づく全ての規格の在庫が連動してしまうので、一つでも在庫を個別に管理したい規格がある場合は改修が必要です。