FC2ブログ

Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事にトラックバックする(FC2ブログユーザー)
http://eccubememo.blog52.fc2.com/tb.php/20-d8f51266

トラックバック

[T1] EC-CUBEでショップ全体の注文数が会員に知られてしまう

EC-CUBEの注文番号(受注番号)は連番で、その値が注文受付メールに記載される。 メンテなんかに必要なので載せた方がいいんだけど、連番なのでショップ全体の注文数が知られてしまう。 解決策としては 1....

コメント

[C7] 承認待ちコメント

このコメントは管理者の承認待ちです

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

顧客に見せる用の注文番号(order_id)を作成。

注文番号(order_id)は完全連番なので、複数回購入されたお客さんに、その間の注文数がわかってしまいます。
注文の多寡に関わらず、(常識を超えて多いぐらいでないと)それがわかるというのは余り嬉しいことではないと思われます。

ということで、それでお客さんに見せる用の注文番号を作成しますよサンプル。

このサンプルの仕様としては、
年月日(8桁)+
ランダムなアルファベット(1桁)+
その日の最初の注文で6桁のランダムな数字を生成し、それにorder_idを足した数字(ゼロ埋め6桁)
計15桁とします。

手順 1)
テーブル作成。
テーブル名:dtb_order_random_id
列1: create_date  型:date  NOT NULL (PRIMARY KEY)
列2: start_order_id  型:integer  NOT NULL

手順 2)
テーブル dtb_order に列追加。
列名: custmer_order_id  型:varchar

手順 3)
data/class/helper/SC_Helper_DB.php に、
次のfunctionを作成します。一番下に追記とかで良いよ。
_____________________________________

 //客用注文No.を生成
  function getCustmerOrderId(&$objQuery, $order_id) {

      // 今日の開始値をテーブルdtb_order_random_idから取得
      $col = "start_order_id";
      $tbl = "dtb_order_random_id";
      $wh .= "to_char(create_date, 'YYYY-MM-DD')=?";
      $today = date("Y-m-d");
      $ret = $objQuery->select($col, $tbl, $wh, array($today));
      $order_random_id = $ret[0][$col];
      if ($order_random_id > 0) {
        // ある場合
      } else {
        // ない場合、ランダムな6桁の数字を生成してinsert
        $order_random_id = mt_rand(1, 999999);
        $sql = "INSERT into dtb_order_random_id(create_date, start_order_id)";
        $sql .= " VALUES(current_date, ?)";
        $objQuery->conn->query($sql, array($order_random_id));
      }

      // 客用注文No.作成 --- 年月日(8桁) + アルファベット(1桁) + (ランダム数字+order_id)(6桁)
      $custmer_order_id_tmp = intval($order_random_id) + intval($order_id);
      if ($custmer_order_id_tmp > 999999) {
        $custmer_order_id_tmp -= 999999;
      }
      $str_custmer_order_id_tmp = sprintf('%06d', $custmer_order_id_tmp);    //ゼロ埋め
      $today = date("Ymd");
      $alpbt = str_split("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
      $rand_keys = array_rand($alpbt, 1);

      $custmer_order_id = $today.$alpbt[$rand_keys].$str_custmer_order_id_tmp;
      return $custmer_order_id;
  }

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

手順 4)
data/class/pages/shopping/LC_Page_Shopping_Complete.php を編集。
function lfRegistOrder 内、
dtb_orderへのinsert直前に、次のコードを追記します。
_____________________________________

// 受注テーブルへ登録
  function lfRegistOrder($objQuery, $arrData, $objCampaignSess = null) {

      ・・・
      ・・・
      ・・・

      // 客用注文番号追加 start ---------
      $objDb = new SC_Helper_DB_Ex();
      $custmer_order_id = $objDb->getCustmerOrderId($objQuery, $order_id);
      $sqlval['custmer_order_id'] = $custmer_order_id;
      // ----------- 客用注文番号追加 end


      // INSERTの実行
      $objQuery->insert("dtb_order", $sqlval);

      ・・・
      ・・・

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

手順 5)
order_mail.tpl を編集。
_____________________________________

******************************************************************
 配送情報とご請求金額
******************************************************************

ご注文番号:<!--{$arrOrder.order_id}-->


ご注文番号:<!--{if $arrOrder.custmer_order_id}--><!--{$arrOrder.custmer_order_id}--><!--{else}--><!--{$arrOrder.order_id}--><!--{/if}-->

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

以上!

・・ですが、

これでは本当のorder_idがメールではわからないので、必要であれば、自分(店)宛てにメールをもう1通作ってそれを店宛てにだけ送信しましょう。その中で、

注文番号:<!--{$arrOrder.order_id}-->
客用注文番号:<!--{if $arrOrder.custmer_order_id}--><!--{$arrOrder.custmer_order_id}--><!--{else}--><!--{$arrOrder.order_id}--><!--{/if}-->

とかやりましょう。
EC-CUBEのデフォルトのままでは客宛てメールをお店にBCC送信しているだけなので、「お客さんにはメールで見せたくないけど自分はメールで見たい」情報がある場合は、物理的にそれしか方法がないです。
(というより、それでなくても普通は客宛てと店宛ては分けた方がいいとは思う)

と、ここまで書いといて何なんですが、
上記のようにdtb_orderに列を追加する(order_idと別に持たせる)のではなく、アルファベットなんぞ入れないで数字のみにして注文番号(order_id)そのものをどうにかする、という方法もアリというかその方が一見楽そうではあります。

でもねえ、運用側の都合として、連番は連番でどっかに欲しいんですよねえ。必須ではないし明確なメリットという訳ではないけれども、あったらあったで番号だけで直感的に最近の注文かどうかわかったり短いから覚えやすかったり最近の注文数も何となく皆さんが把握出来ていたり、やんわりとイイことがあったりなかったりします。そしたら連番用列を追加しますか、ってことになったら手間としては結局のところ余り変わらなくなったりする訳です。
更に、ホンモノの方のorder_idをどうにかするということは、dtb_orderのキー項目をどうにかするということなので何かしら面倒なことになる可能性というか危険が危ないというか、そこをどうにかするということは通常のシステム屋的感覚、というよりあくまで俺的感覚ですが色んなテストケースでの総テストが必要と判断するレベルになってしまいます。こここれはメンド臭い。

だったら、ホンモノの方のorder_idは触らずに済むこっちの方が危険は少なそう、影響範囲も限られていて、何となく予期しないトラブルもなさそうだね、というこっちの方が良いように思います。これだと各画面・機能の通り一遍的なチェックで済みます。

運用に際しては、社内処理的にはこれまでの注文番号で良いけど、お客さんに知らせる番号がそれである以上、問い合わせ等の対応はこの番号で、となるので、管理画面で「顧客用注文番号」で検索とか出来るようにしておいた方が良いでしょうね。MYページの購入履歴のところも通常の注文番号表示なのでそこも忘れず修正。
何れにせよ色々メンド臭い訳ですが。


<本>
野村の流儀 - ノムさん本
<安>
BUFFALO 地デジチューナー

この記事にトラックバックする(FC2ブログユーザー)
http://eccubememo.blog52.fc2.com/tb.php/20-d8f51266

トラックバック

[T1] EC-CUBEでショップ全体の注文数が会員に知られてしまう

EC-CUBEの注文番号(受注番号)は連番で、その値が注文受付メールに記載される。 メンテなんかに必要なので載せた方がいいんだけど、連番なのでショップ全体の注文数が知られてしまう。 解決策としては 1....

コメント

[C7] 承認待ちコメント

このコメントは管理者の承認待ちです

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

Appendix

プロフィール

modezo

Author:modezo
モデゾー

思いたって書き始めたのが随分出来てからなので実は書くことがあんまりない。

全記事表示リンク

全ての記事を表示する

 

newsing

にほんブログ村 IT技術ブログ 自社サイト運用へ
にほんブログ村

ブランド和牛一覧
近江牛ステーキ・しゃぶしゃぶ
SEOTOOLS999|相互リンクSEO-P-Link ver3.5
匹夫の勇|相互リンクSEO-P-Link ver3.5
頓珍漢|相互リンクSEO-P-Link ver3.5

Googleページランク表示ツール PagerankExplore

あわせて読みたい

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。