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()の中身…
とりあえず、困ったときには
$objQuery = new SC_Query();
$objQuery->getOne()とかでDBからデータ取ってきて処理ですね。
それだけでなんとかなるもんです。
デフォルトの状態の処理なら、最新の記事を見てください。
配送先都道府県で送料が違う。
さらに、送料合計が各都道府県で設定された金額を超えた場合には、その金額を上限にする。
つまり
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からデータ取ってきて処理ですね。
それだけでなんとかなるもんです。
デフォルトの状態の処理なら、最新の記事を見てください。


