ECcube2.11 個別送料計算とか、送料計算のロジックを書き直したょ。 | φ(..)メモとして残しておこう…

ECcube2.11 個別送料計算とか、送料計算のロジックを書き直したょ。

商品ごとに送料が違う。
配送先都道府県で送料が違う。
さらに、送料合計が各都道府県で設定された金額を超えた場合には、その金額を上限にする。

つまり

OPTION_PRODUCT_DELIV_FEE == 1

OPTION_DELIV_FEE == 1

トータルのOPTION_PRODUCT_DELIV_FEE > OPTION_DELIV_FEE

の場合には、

$results['deliv_fee'] = OPTION_DELIV_FEE

にしなきゃ。。。

というわけで、SC_CartSession.phpの

// 配送業者の送料を加算
のところに
&& $results['deliv_fee'] != 0
を追加して

$results['deliv_fee'] += $objDb->sfGetDelivFee($deliv_pref, $deliv_id);
            ▼
$results['deliv_fee'] = $objDb->sfGetDelivFee($deliv_pref, $deliv_id);

こう変更。


個別送料計算のロジックに


//送料の計算(商品毎に加算)
$deliv_fee .= $haisou['shipping'];
//商品毎の送料が1000円(最大送料)を超えたら、その人宛の送料は1000円に
if ( $deliv_fee > $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"])) {
$deliv_fee = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);
}


こいつを追加。


結局、ソースはこうなりました。


function calculate()の中身…

$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['productsClass']['deliv_fee'] * $item['quantity'];
}
}

// 配送業者の送料を加算
if (OPTION_DELIV_FEE == 1
//追加
&& $results['deliv_fee'] != 0

&& !SC_Utils_Ex::isBlank($deliv_pref)
&& !SC_Utils_Ex::isBlank($deliv_id)) {
//商品毎の合計送料が地域送料を超えていた場合には、送料を地域送料額にする
//(全て同梱できると仮定して)
$results['deliv_fee'] = $objDb->sfGetDelivFee($deliv_pref, $deliv_id);

}

// 送料無料チェック
if ($this->isDelivFree($productTypeId)) {
$results['deliv_fee'] = 0;
}

/*▼▼▼お届け先が複数ならそれごとに送料を再計算▼▼▼*/

if ( count($_SESSION['shipping']) > 1 ){

//---------[初期処理]-------------

//とりあえず、$results['deliv_fee']を0にしておく
$results['deliv_fee'] = 0;

//flagsも初期化
$flags = "";

//何人目かを記録しておくためのフラグ
$multi = 0;

//---------[初期処理終了]---------

//人数分の繰り返し
foreach ( $_SESSION['shipping'] as $deli) {

//フラグ関係を初期化
$total_indiv = 0;

//商品のコードを配列から取得
$temp_list = $deli['shipment_item'];
$item = array_keys( $temp_list );


//商品分の繰り返し
for ($loop = 0; $loop < count($item); $loop++){

$item_code = $item[$loop];

$quant = $item_code;
$quantity = $deli['shipment_item'][$quant]['quantity'];

$objQuery = new SC_Query();
$haisou = $objQuery->getOne("SELECT
price02,
deliv_fee
FROM
dtb_products_class
where
product_code = " . $item_code . ";
");

//商品の購入金額
$temp_indiv = $haisou['sell_price'] * $quantity;
$total_indiv += $temp_indiv;

$subTotal_fee[] = $haisou['deliv_fee'];

//送料の計算(商品毎に加算)
$deliv_fee .= $haisou['deliv_fee'];

//送料の合計が最大送料(配送地域別送料)を超えたら、送料は地域別送料に
if ( $deliv_fee > $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"])) {

$deliv_fee = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);

}


}//商品分の繰り返し

//送料無料条件を超えていたら0円に、超えていなかったら商品別送料の中で一番高い金額を設定
$deliv_fee =
( $total_indiv > $objQuery->getOne("SELECT free_rule FROM dtb_base_info;") ) ? 0:max($subTotal_fee);

// 地域別の送料を計算(あれ?必要かな…これ…商品分の繰り返しでやってるからいらないかな?)
if (OPTION_DELIV_FEE == 1
&& $deliv_fee <> 0
&& !SC_Utils_Ex::isBlank($deliv_pref)
&& !SC_Utils_Ex::isBlank($deliv_id)) {
$deliv_fee = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);
}

//全注文の総トータル送料に個別送料を加算していく
$results['deliv_fee'] += $deliv_fee;

//送料と合計金額をセッションに保存(comfirm.tpl表示用)
$_SESSION['multi_deliv'][$multi]['deliv_fee'] = $deliv_fee;
$_SESSION['multi_deliv'][$multi]['total_indiv'] = $total_indiv;

$multi++;

}//人数分の繰り返し

}

/* ▲▲▲お届け先ごとに送料を再計算(ここまで)▲▲▲ */


とりあえず、困ったときには
$objQuery = new SC_Query();
$objQuery->getOne()とかでDBからデータ取ってきて処理ですね。

それだけでなんとかなるもんです。

デフォルトの状態の処理なら、最新の記事を見てください。