注文番号(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 地デジチューナー