バージョン選択

フォーラム

メニュー

オンライン状況

16 人のユーザが現在オンラインです。 (8 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 16
もっと...

サイト内検索

バグ報告 > フロント機能 > 手数料の計算をポイント割引後にしたい

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
HORNET
投稿日時: 2010/1/6 9:57
対応状況: −−−
新米
登録日: 2009/9/4
居住地:
投稿: 4
手数料の計算をポイント割引後にしたい
商品注文時にかかる手数料(例えば代引手数料)の計算方法を変更したいのですが、どこを修正するかわからず悩んでいます。

現在、手数料は
商品合計に対して設定された手数料がかかると思うのですが、
これを
商品合計-使用ポイント+送料
に対して計算されるよう変更して、総支払額が手数料のルールに従って計算されるようにしたいと思っています。

------------------- 例 -------------------
----<現状>----

--送料--
商品合計 < 10,000円 → 600円
9,999円 < 商品合計 → 無料

--手数料--
商品合計 < 9,400円 → 315円 
9,399円 < 商品合計 → 420円


【例1】
商品合計 10,000円
ポイント利用 421ポイント
の場合
手数料 → 420円

支払額 → 10,000 - 421 + 0 + 420 = 9,999円


【例2】
商品合計 9,400円
ポイント利用 421ポイント
の場合
手数料 → 420円

支払額 → 9,400 - 421 + 600 + 420 = 9,999円

支払額が10,000円未満なのに代引手数料が420円かかる


----<変更後>----

--送料--
商品合計 < 10,000円 → 600円
9,999円 < 商品合計 → 無料

--手数料--
商品合計 - ポイント + 送料 < 9,685円 → 315円
9,684円 < 商品合計 - ポイント + 送料 → 420円

【例1】
商品合計 10,000円
ポイント利用 421ポイント
の場合
手数料 → 315円


支払額 → 10,000 - 421 + 0 + 315 = 9,894円

【例2】
商品合計 9,400円
ポイント利用 421ポイント
の場合
手数料 → 315円

支払額 → 9,400 - 421 + 600 + 315 = 9,894円

------------------- 例終わり -------------------

SC_helper_DB.PHPの$arrData['charge']
を疑っているのですが、これがどこで計算されているのかわかりません。

どなたかご教示頂ければありがたいです。

宜しくお願い致します。


----------------
--------------------------------
EC-CUBEバージョン 2.4.2
PHPバージョン PHP 5.2.11
DBバージョン PostgreSQL 7.4.26
--------------------------------
AMUAMU
投稿日時: 2010/1/6 10:38
対応状況: −−−
登録日: 2009/5/2
居住地: 東京都
投稿: 2712
Re: 手数料の計算をポイント割引後にしたい
charge自体の決定はLC_Page_Shopping_Payment内だと思います。
目的の機能を実装するならばSC_helper_DBの合計金額の計算ルーチンあたりを修正すれば実現できそうな気がします。


----------------
EC-CUBE公式エヴァンジェリスト
EC-CUBEインテグレートパートナー (株)スピリット・オブ
移転・拡張・高速化・問題解決
各種カスタマイズ・支援依頼承ります。

[url=h

seasoft
投稿日時: 2010/1/6 11:38
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7332
Re: 手数料の計算をポイント割引後にしたい
「送料」に関わる部分につきましては、チケットが登録されています。
http://svn.ec-cube.net/open_trac/ticket/337
まだ実装には至っていないようですが、開発メンバの間で、年末ごろに話題に上がりましたので、実装される日も近いかもしれません。参考まで。

また、HORNET 様が実装に成功した場合に、実装方法をご提供いただけると、EC-CUBE 本体への取り込みが可能かもしれません。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

HORNET
投稿日時: 2010/1/6 12:16
対応状況: −−−
新米
登録日: 2009/9/4
居住地:
投稿: 4
Re: 手数料の計算をポイント割引後にしたい
引用:

seasoftさんは書きました:
「送料」に関わる部分につきましては、チケットが登録されています。
http://svn.ec-cube.net/open_trac/ticket/337
まだ実装には至っていないようですが、開発メンバの間で、年末ごろに話題に上がりましたので、実装される日も近いかもしれません。参考まで。

また、HORNET 様が実装に成功した場合に、実装方法をご提供いただけると、EC-CUBE 本体への取り込みが可能かもしれません。


ご返答ありがとうございます。

実はこのチケットは知っていたのですが、15ヶ月も前から動きがなかったのであまり必要性がなかったのかな?と思って別途書き込みした次第です。

送料については「商品代金10,000円以上送料無料」とルール付けをしてお客様にサービス提供すれば今のままでも良いのですが、各運送会社が代引手数料のルールを公開しているので手数料が420円で支払い合計額が10,000円未満になってしまうのは、お客様にあまり良い印象ではないと思ってました。

SC_Helper_DB.php
LC_Page_Shopping_Payment.php
を覗いてみたところ、支払い方法を選択した時点(html/shopping/payment.php)で手数料が決定するようなので、使用ポイントを入力しても既に決定したものを変更できないような仕組みになっていると見えるのですが正しいでしょうか?

そうなると、支払い方法を選択する前に使用ポイントを決定して、手数料をその後に計算させるよう大がかりな変更が必要な気が・・・。

実装できるよう考えますので、良いアイデアがありましたらご提案ください。

宜しくお願い致します。
sumida
投稿日時: 2014/1/20 23:05
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 手数料の計算をポイント割引後にしたい
私も同感なので、考えてみました。

問題点:
・配送方法を選択した段階で、商品合計をもとに、支払方法を絞り込んでいる。
・支払方法選択画面で、ポイントの使用等を決めるため、ポイント等を反映した支払方法に絞り込めない。

考慮点:
・代引手数料は、確認画面で、その額が利用者の目に入る。

そこで、以下のようにしては、どうでしょうか。
管理側:
管理側の運用制限として、
・請求金額毎に支払方法に登録する。(現状と同じ)
・その際、支払方法の名称は、同一にする。
(例:代引き)
代金引換  315       ~9684   10,000未満(9999-315)
代金引換  420    9685~29579   30,000未満(29999-420)
代金引換  630   29580~99369   100,000未満(99999-630)
代金引換  1050  99370~298950   300,000まで(300000-1050)

ショップ側:
確認画面表示の段階で、処理を追加
・代引手数料がある場合、代引手数料 0 円で、仮支払合計を求める。
・この仮支払合計をもとに、支払方法を再度決定する。(決定要因:同一の支払方法の名称)
・ただし、この結果、該当する支払方法がなくなることは、想定していません。(そのまま変更されません。)

data/class/pages/shopping/LC_Page_Shopping_Confirm.php

        // 一時受注テーブルの読込
        $arrOrderTemp = $objPurchase->getOrderTemp($this->tpl_uniqid);
// added
        if ($arrOrderTemp['charge'] != 0) {
            // カート集計を元に計算(代引手数料なし)
            $arrCalcResults = $objCartSess->calculate($this->cartKey, $objCustomer,
                                                  $arrOrderTemp['use_point'],
                                                  $objPurchase->getShippingPref($this->is_multiple),
                                                  0,
                                                  $arrOrderTemp['discount'],
                                                  $arrOrderTemp['deliv_id'],
                                                  $arrOrderTemp['order_pref'],  // 税金計算の為に追加 注文者基準
                                                  $arrOrderTemp['order_country_id'] // 税金計算の為に追加 注文者基準
                                                  );

            $objPayment = new SC_Helper_Payment_Ex();
            $payments_total = $objPayment->getByPrice($arrCalcResults['payment_total']);
            foreach ($payments_total as $payment) {
                // 同じ支払い方法
               if ($payment['payment_method'] == $arrOrderTemp['payment_method']) {
                    $arrOrderTemp['payment_id'] = $payment['payment_id'];
                    $arrOrderTemp['charge'] = $payment['charge'];
                    break;
                }
            }
        }
// added
        // カート集計を元に最終計算
        $arrCalcResults = $objCartSess->calculate($this->cartKey, $objCustomer,
                                                  $arrOrderTemp['use_point'],
                                                  $objPurchase->getShippingPref($this->is_multiple),
                                                  $arrOrderTemp['charge'],
                                                  $arrOrderTemp['discount'],
                                                  $arrOrderTemp['deliv_id'],
                                                  $arrOrderTemp['order_pref'],  // 税金計算の為に追加 注文者基準
                                                  $arrOrderTemp['order_country_id'] // 税金計算の為に追加 注文者基準
                                                  );
        $this->arrForm = array_merge($arrOrderTemp, $arrCalcResults);
 
sumida
投稿日時: 2014/1/21 17:09
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 手数料の計算をポイント割引後にしたい
これだと、新しい支払方法がみつからない場合のエラー対策が必要なので。
支払方法の画面側で、やってみました。

追記:
なんだか、しっくりこないな〜。

再追記:
コードを変更しました。
ただ、使用ポイント数によって、
・「代引ができる」・「代引きができない」の境界にある場合に、画面に初期表示されない。
つまり、初期表示で代金引換がある場合は良いが、初期表示にない場合の検討が必要なようです。

data/class/pages/shopping/LC_Page_Shopping_payment.php

                $this->arrErr = $this->lfCheckError($objFormParam, $this->arrPrices['subtotal'], $this->tpl_user_point);
// added
                if (empty($this->arrErr)) {
                    // カート集計を元に計算(代引手数料なし)
                    $arrCalcResults = $objCartSess->calculate($this->cartKey, $objCustomer,
                                                  $objFormParam->getValue('use_point'),
                                                  $objPurchase->getShippingPref($this->is_multiple),
                                                  0,
                                                  $arrOrderTemp['discount'],
                                                  $objFormParam->getValue('deliv_id'),
                                                  $arrOrderTemp['order_pref'],  // 税金計算の為に追加 注文者基準
                                                  $arrOrderTemp['order_country_id'] // 税金計算の為に追加 注文者基準
                                                  );
                    $payment_id = $objFormParam->getValue('payment_id');
                    // 現在の支払方法の名称
                    foreach ($this->arrPayment as $payment) {
                        if ($payment['payment_id'] == $payment_id) {
                            $payment_method = $payment['payment_method'];
                            break;
                        }
                    }
                    // 支払金額で支払方法を再設定
                    $objPayment = new SC_Helper_Payment_Ex();
                    $payments_total = $objPayment->getByPrice($arrCalcResults['payment_total']);
                    $payment_method_found = false;
                    foreach ($payments_total as $payment) {
                        // 同じ支払い方法
                        if ($payment['payment_method'] == $payment_method) {
                            $payment_method_found = true;
                            $objFormParam->setValue('payment_id', $payment['payment_id']);
                            break;
                        }
                    }
                    if ($payment_method_found == false) {
                        $this->arrErr['payment_id'] = '※ 選択した支払い方法は、利用限度額を超えるため、ご利用できません。<br>';
                    }
                }
// added
sumida
投稿日時: 2014/1/22 8:03
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 手数料の計算をポイント割引後にしたい
やっぱり、途中で強制的に変更するのは、しっくりこないですね。
sumida
投稿日時: 2014/1/22 22:47
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 手数料の計算をポイント割引後にしたい
とりあえず、ジタバタしてみました。(複数の配送方法がある場合は、確認していません。)
配送方法を決定してから支払方法が決まる手順だと思うので、たぶんいけると思うのですが。
結局、
・使用ポイントは、支払画面より前に決まるような画面遷移?
・配送方法とポイントの使用が決まって、支払方法を選択する手順?
にしないと、ベストな解がでない。

制限事項:
・使用ポイントは考慮できませんでした。
  (確認画面に遷移するタイミングでないと、ポイント数が不明なため)
・支払方法:代金引換は、代引手数料を引いた金額で、取引金額の範囲を設定する。

data/class/pages/shopping/LC_Page_Shopping_payment.php

        /*
         * 購入金額の取得
         * ここでは送料を加算しない
         */
/* changed
        $this->arrPrices = $objCartSess->calculate($cart_key, $objCustomer);
changed */
        // やっぱり、送料計算も入れる。
        if (!$this->is_single_deliv) {
            $deliv_id = $objFormParam->getValue('deliv_id');
        } else {
            $deliv_id = $this->arrDeliv[0]['deliv_id'];
        }
        // カート集計を元に計算(使用ポイント・代引手数料なし)
        $this->arrPrices = $objCartSess->calculate($cart_key, $objCustomer,
                                                  0, // use_point
                                                  $objPurchase->getShippingPref($this->is_multiple),
                                                  0, // 手数料
                                                  $arrOrderTemp['discount'],
                                                  $deliv_id,
                                                  $arrOrderTemp['order_pref'],  // 税金計算の為に追加 注文者基準
                                                  $arrOrderTemp['order_country_id'] // 税金計算の為に追加 注文者基準
                                                  );
// changed

3カ所

/* changed
                    $arrSelectedDeliv = $this->getSelectedDeliv($objCartSess, $deliv_id);
changed */
                    $arrSelectedDeliv = $this->getSelectedDeliv($objCartSess, $deliv_id, $this->arrPrices['payment_total']);
// changed


/* changed
    public function getSelectedDeliv(&$objCartSess, $deliv_id)
changed */
    public function getSelectedDeliv(&$objCartSess, $deliv_id, $total)
// changed
    {
        $arrResults = array();
        $arrResults['arrDelivTime'] = SC_Helper_Delivery_Ex::getDelivTime($deliv_id);
/* deleted
        $total = $objCartSess->getAllProductsTotal($objCartSess->getKey());
deleted */
        $payments_deliv = SC_Helper_Delivery_Ex::getPayments($deliv_id);
        $objPayment = new SC_Helper_Payment_Ex();
        $payments_total = $objPayment->getByPrice($total);
        $arrPayment = array();

sumida
投稿日時: 2014/1/23 22:26
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 手数料の計算をポイント割引後にしたい
使用ポイントとの関係を何とかしようとするための仕様案です。

(案1) 現在の配送方法の選択により、支払方法の表示が決まっている。
使用ポイントの指定位置を、支払方法より上(前)の位置にし、
この部分の変更があった時点で、支払方法を再度表示し直す。
(表示し直しにより、選択中の支払方法が存在すれば、そのまま選択状態にし、なければ、注意を促し、未選択の状態にする。)

(案2) 現在の仕様だと、商品合計額で支払方法を絞り込んで画面表示している。
これはこれで、利用者にとっては、親切な仕様だと思います。
ただ、使用ポイントも考慮した支払方法となると、
確認画面に遷移するタイミングで利用可能な支払方法か判断することとなる。
なので、支払方法を絞り込まないで表示し、
遷移するタイミングで利用できない支払方法ならエラーとする。
sumida
投稿日時: 2014/1/24 18:37
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 手数料の計算をポイント割引後にしたい
案2について強引にやってみました。参考までに。

data/class/pages/shopping/LC_Page_Shopping_payment.php

                $this->arrErr = $this->lfCheckError($objFormParam, $this->arrPrices['subtotal'], $this->tpl_user_point);
// added
                if (empty($this->arrErr)) {
                    if (USE_POINT === false) {
                        $use_point = 0;
                    } else {
                        if ($objFormParam->getValue('point_check') == '1') {
                            $use_point = $objFormParam->getValue('use_point');
                        } else {
                            $use_point = 0;
                        }
                    }
                    // カート集計を元に計算(代引手数料なし)
                    $arrCalcResults = $objCartSess->calculate($this->cartKey, $objCustomer,
                                                  $use_point,
                                                  $objPurchase->getShippingPref($this->is_multiple),
                                                  0,
                                                  $arrOrderTemp['discount'],
                                                  $objFormParam->getValue('deliv_id'),
                                                  $arrOrderTemp['order_pref'],  // 税金計算の為に追加 注文者基準
                                                  $arrOrderTemp['order_country_id'] // 税金計算の為に追加 注文者基準
                                                  );
                    $payment_id = $objFormParam->getValue('payment_id');
                    // 現在の支払方法の名称
                    foreach ($this->arrPayment as $payment) {
                        if ($payment['payment_id'] == $payment_id) {
                            $payment_method = $payment['payment_method'];
                            break;
                        }
                    }
                    // 支払金額で支払方法を再設定
                    $objPayment = new SC_Helper_Payment_Ex();
                    $arrSelectedDeliv = $this->getSelectedDeliv($objCartSess, $deliv_id, $arrCalcResults['payment_total']);
                    $payments_total = $arrSelectedDeliv['arrPayment'];
                    $payment_method_found = false;
                    foreach ($payments_total as $payment) {
                        // 同じ支払い方法
                        if ($payment['payment_method'] == $payment_method) {
                            $payment_method_found = true;
                            $objFormParam->setValue('payment_id', $payment['payment_id']);
                            $this->arrPayment = $payments_total;
                            break;
                        }
                    }
                    if ($payment_method_found == false) {
                        $this->arrErr['payment_id'] = '※ 選択した支払い方法は、ご利用限度額内にないため、ご利用できません。<br>';
                    }
                }
// added


            default:
                // FIXME 前のページから戻ってきた場合は別パラメーター(mode)で処理分岐する必要があるのかもしれない
                $this->setFormParams($objFormParam, $arrOrderTemp, false, $this->arrShipping);

                if (!$this->is_single_deliv) {
                    $deliv_id = $objFormParam->getValue('deliv_id');
                } else {
                    $deliv_id = $this->arrDeliv[0]['deliv_id'];
                }

                if (!SC_Utils_Ex::isBlank($deliv_id)) {
                    $objFormParam->setValue('deliv_id', $deliv_id);
                    $arrSelectedDeliv = $this->getSelectedDeliv($objCartSess, $deliv_id);
                    $this->arrPayment = $arrSelectedDeliv['arrPayment'];
                    $this->arrDelivTime = $arrSelectedDeliv['arrDelivTime'];
                    $this->img_show = $arrSelectedDeliv['img_show'];
// added
                    $payment_id = $objFormParam->getValue('payment_id');
                    if ($payment_id != '') {
                        // 確認画面から戻った場合、payment_idを戻すため
                        $objPayment = new SC_Helper_Payment_Ex();
                        $payments_all = $objPayment->getList();
                        foreach ($payments_all as $payment) {
                            if ($payment['payment_id'] == $payment_id) {
                                $payment_method = $payment['payment_method'];
                                break;
                            }
                        }
                        foreach ($this->arrPayment as $payment) {
                            if ($payment['payment_method'] == $payment_method) {
                                $objFormParam->setValue('payment_id', $payment['payment_id']);
                                break;
                            }
                        }
                    }
// added
                }
                break;


/* changed
    public function getSelectedDeliv(&$objCartSess, $deliv_id)
changed */
    public function getSelectedDeliv(&$objCartSess, $deliv_id, $total=0)
// changed
    {
        $arrResults = array();
        $arrResults['arrDelivTime'] = SC_Helper_Delivery_Ex::getDelivTime($deliv_id);
/* deleted
        $total = $objCartSess->getAllProductsTotal($objCartSess->getKey());
deleted */
        $payments_deliv = SC_Helper_Delivery_Ex::getPayments($deliv_id);
        $objPayment = new SC_Helper_Payment_Ex();
// added
    if ($total == 0) {
        $payments_total = $objPayment->getList();
        $arrPayment = array();
        // ここで、同じ名称は、一つにする
        foreach ($payments_total as $payment) {
            if (in_array($payment['payment_id'], $payments_deliv)) {
                $payment_found = false;
                foreach ($arrPayment as $payment_exist) {
                    if ($payment_exist['payment_method'] == $payment['payment_method']) {
                        $payment_found = true;
                        break;
                    }
                }
                if ($payment_found == false) {
                    $arrPayment[] = $payment;
                }
            }
        }
        $arrResults['arrPayment'] = $arrPayment;
    } else {
// added
        $payments_total = $objPayment->getByPrice($total);
        $arrPayment = array();
        foreach ($payments_total as $payment) {
            if (in_array($payment['payment_id'], $payments_deliv)) {
                $arrPayment[] = $payment;
            }
        }
        $arrResults['arrPayment'] = $arrPayment;
// added
    }
// added
        $arrResults['img_show'] = $this->hasPaymentImage($arrResults['arrPayment']);

        return $arrResults;
    }
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は66,636名です
総投稿数は98,374件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
468
2651
4
nanasess
2103
5
umebius
1753
6
yuh
1612
7
red
1424
8
h_tanaka
1044
9
fukap
907
10
tsuji
863
11
shutta
835
12
tao_s
792
13 ramrun 789
14 karin 657
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.