2022.1.5|EC-CUBE

EC-CUBE(イーシーキューブ)で配送業者設定・配送料金の送料合計バグ(エラー)の修正方法

EC-CUBE(イーシーキューブ)で配送業者設定・配送料金の送料合計バグ(エラー)の修正方法

EC-CUBE(イーシーキューブ)では、デフォルトの状態で配送業者の設定や規格の設定を行っていると商品を購入した際に、配送料金にバグ(エラー)が起きることがあります。
通常この状態で配送業者の送料を設定していても、購入後の料金合計にバグ(エラー)が発生します。
今回は、EC-CUBE(イーシーキューブ)で配送業者設定・配送料金の送料合計バグ(エラー)の修正方法を解説します。

EC-CUBEで配送業者設定・配送料金の送料合計バグ(エラー)の修正方法

このバグ(エラー)を修正するには「data」フォルダ内のファイルを修正します。
※Version 2.11.0

1.SC_CartSession.phpファイルのコードを修正

配送関連ファイルを開きます。
ファイルを開いたらコードを変更します。
/data/class/SC_CartSession.php

「SC_CartSession.php」ファイル変更前のコード

※ファイル内から以下のコードを探します。
※508行~536行付近

* @param integer $charge 手数料
 * @param integer $discount 値引
 * @return array カートの計算結果の配列
 */
function calculate($productTypeId, &$objCustomer, $use_point = 0,
                   $deliv_pref = "", $charge = 0, $discount = 0) {
    $objDb = new SC_Helper_DB_Ex();
 
    $total_point = $this->getAllProductsPoint($productTypeId);
    $results['tax'] = $this->getAllProductsTax($productTypeId);
    $results['subtotal'] = $this->getAllProductsTotal($productTypeId);
    $results['deliv_fee'] = 0;
 
    // 商品ごとの送料を加算
    if (OPTION_PRODUCT_DELIV_FEE == 1) {
        $cartItems = $this->getCartList($productTypeId);
        foreach ($cartItems as $item) {
            $results['deliv_fee'] += $item['deliv_fee'] * $item['quantity'];
        }
    }
 
    // 配送業者の送料を加算
    if (OPTION_DELIV_FEE == 1) {
        $results['deliv_fee'] += $objDb->sfGetDelivFee($deliv_pref, $productTypeId);
    }
「SC_CartSession.php」ファイル変更後のコード

※ファイル内から上記のコードを探したら次のコードに書き換えてます。

* @param integer $charge 手数料
 * @param integer $discount 値引
   * @param integer $deliv_id 配送業者ID
 * @return array カートの計算結果の配列
 */
function calculate($productTypeId, &$objCustomer, $use_point = 0,
                   $deliv_pref = "", $charge = 0, $discount = 0, $deliv_id = 0) {
    $objDb = new SC_Helper_DB_Ex();
 
    $total_point = $this->getAllProductsPoint($productTypeId);
    $results['tax'] = $this->getAllProductsTax($productTypeId);
    $results['subtotal'] = $this->getAllProductsTotal($productTypeId);
    $results['deliv_fee'] = 0;
 
    // 商品ごとの送料を加算
    if (OPTION_PRODUCT_DELIV_FEE == 1) {
        $cartItems = $this->getCartList($productTypeId);
        foreach ($cartItems as $item) {
            $results['deliv_fee'] += $item['deliv_fee'] * $item['quantity'];
        }
    }
 
    // 配送業者の送料を加算
    if (OPTION_DELIV_FEE == 1
        && !SC_Utils_Ex::isBlank($deliv_pref)
              && !SC_Utils_Ex::isBlank($deliv_id)) {
              $results['deliv_fee'] += $objDb->sfGetDelivFee($deliv_pref, $deliv_id);
    }

2.SC_Helper_DB.phpファイルのコードを修正

配送関連ファイルを開きます。
ファイルを開いたらコードを変更します。
/data/class/helper/SC_Helper_DB.php

「LC_Page_Admin_Design_Bloc.php」ファイル変更前のコード

※ファイル内から以下のコードを探します。
※1172行~1195行付近

     * @param integer|array $pref_id 都道府県ID 又は都道府県IDの配列
     * @return string 指定の都道府県, 商品種別の配送料金
     */
    function sfGetDelivFee($pref_id, $product_type_id) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
 
        /*
         * FIXME 都道府県が指定されていない場合は、東京都の番号を指定しておく
         * http://svn.ec-cube.net/open_trac/ticket/410
         */
        if($pref_id == "") {
            $pref_id = 13;
        }
        if (!is_array($pref_id)) {
            $pref_id = array($pref_id);
        }
        $sql = <<< __EOS__
            SELECT SUM(T1.fee) AS fee
              FROM dtb_delivfee T1
              JOIN dtb_deliv T2
                ON T1.deliv_id = T2.deliv_id
             WHERE T1.pref = ? AND T2.product_type_id = ?
__EOS__;
 
        $result = 0;
        foreach ($pref_id as $pref) {
            $result += $objQuery->getOne($sql, array($pref, $product_type_id));
        }
        return $result;
    }
「LC_Page_Admin_Design_Bloc.php」ファイル変更後のコード

※ファイル内から上記のコードを探したら次のコードに書き換えてます。

     * @param integer|array $pref_id 都道府県ID 又は都道府県IDの配列
     * @param integer $deliv_id 配送業者ID
       * @return string 指定の都道府県, 配送業者の配送料金
     */
    function sfGetDelivFee($pref_id, $deliv_id = 0) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        if (!is_array($pref_id)) {
            $pref_id = array($pref_id);
        }
        $sql = <<< __EOS__
            SELECT T1.fee AS fee
              FROM dtb_delivfee T1
              JOIN dtb_deliv T2
                ON T1.deliv_id = T2.deliv_id
             WHERE T1.pref = ?
                     AND T1.deliv_id = ?
                     AND T2.del_flg = 0
__EOS__;
        $result = 0;
        foreach ($pref_id as $pref) {
            $result += $objQuery->getOne($sql, array($pref, $deliv_id));
        }
        return $result;
    }

3.LC_Page_Shopping_Confirm.phpファイルのコードを修正

配送関連ファイルを開きます。
ファイルを開いたらコードを変更します。
/data/class/pages/shopping/LC_Page_Shopping_Confirm.php

「LC_Page_Admin_Design_Bloc.php」ファイル変更前のコード

※ファイル内から以下のコードを探します。
※113行~121行付近

// カート集計を元に最終計算
$arrCalcResults = $objCartSess->calculate($this->cartKey, $objCustomer,
                                          $arrOrderTemp['use_point'],
                                          $objPurchase->getShippingPref(),
                                          $arrOrderTemp['charge'],
                                          $arrOrderTemp['discount']);
$this->arrForm = array_merge($arrOrderTemp, $arrCalcResults);
「LC_Page_Admin_Design_Bloc.php」ファイル変更後のコード

※ファイル内から上記のコードを探したら次のコードに書き換えてます。

// カート集計を元に最終計算
$arrCalcResults = $objCartSess->calculate($this->cartKey, $objCustomer,
                                          $arrOrderTemp['use_point'],
                                          $objPurchase->getShippingPref(),
                                          $arrOrderTemp['charge'],
                                          $arrOrderTemp['discount'],
                                                                  $arrOrderTemp['deliv_id']);
$this->arrForm = array_merge($arrOrderTemp, $arrCalcResults);

4.LC_Page_Shopping_Payment.phpファイルのコードを修正

配送関連ファイルを開きます。
ファイルを開いたらコードを変更します。
/data/class/pages/shopping/LC_Page_Shopping_Payment.php

「LC_Page_Admin_Design_Bloc.php」ファイル変更前のコード

※ファイル内から以下のコードを探します。
※121行~124行付近

// 購入金額の取得
$this->arrPrices = $objCartSess->calculate($cart_key, $objCustomer, 0, $objPurchase->getShippingPref());
「LC_Page_Admin_Design_Bloc.php」ファイル変更後のコード

※ファイル内から上記のコードを探したら次のコードに書き換えてます。

     * 購入金額の取得
     * ここでは送料を加算しない
     */
$this->arrPrices = $objCartSess->calculate($cart_key, $objCustomer);

まとめ

EC-CUBE(イーシーキューブ)では、古いバージョンを利用しているとバグやエラーがいくつか出る恐れがあります。
出来る限り最新バージョンに切り替えることをおすすめします。