source: branches/version-2_5-dev/data/class/pages/admin/customer/LC_Page_Admin_Customer.php @ 19889

Revision 19889, 22.4 KB checked in by ghana, 10 years ago (diff)

#898
refs #898
顧客管理機能顧客マスタで顧客の削除ができない
autoExecute は MDB2 の Extended の機能のようなので
通常の update 文に変更

  • Property svn:eol-style set to LF
  • Property svn:keywords set to "Id Revision Date"
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2010 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24// {{{ requires
25require_once(CLASS_REALDIR . "pages/admin/LC_Page_Admin.php");
26
27/**
28 * 顧客管理 のページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
34class LC_Page_Admin_Customer extends LC_Page_Admin {
35
36    // }}}
37    // {{{ functions
38
39    /**
40     * Page を初期化する.
41     *
42     * @return void
43     */
44    function init() {
45        parent::init();
46        $this->tpl_mainpage = 'customer/index.tpl';
47        $this->tpl_mainno = 'customer';
48        $this->tpl_subnavi = 'customer/subnavi.tpl';
49        $this->tpl_subno = 'index';
50        $this->tpl_pager = TEMPLATE_REALDIR . 'admin/pager.tpl';
51        $this->tpl_subtitle = '顧客マスタ';
52
53        $masterData = new SC_DB_MasterData_Ex();
54        $this->arrPref = $masterData->getMasterData('mtb_pref');
55
56        $this->arrJob = $masterData->getMasterData("mtb_job");
57        $this->arrJob["不明"] = "不明";
58        $this->arrSex = $masterData->getMasterData("mtb_sex");
59        $this->arrPageRows = $masterData->getMasterData("mtb_page_rows");
60        $this->arrMAILMAGATYPE = $masterData->getMasterData("mtb_mail_magazine_type");
61        $this->arrHtmlmail[''] = "すべて";
62        $this->arrHtmlmail[1] = $this->arrMAILMAGATYPE[1];
63        $this->arrHtmlmail[2] = $this->arrMAILMAGATYPE[2];
64
65        $this->arrStatus[1] = "仮会員";
66        $this->arrStatus[2] = "本会員";
67
68        //---- CSVダウンロード用
69        $this->arrColumnCSV = array(
70            array(
71                "sql" => "customer_id",
72                "csv" => "customer_id",
73                "header" => "顧客ID"
74            ),
75            array(
76                "sql" => "name01",
77                "csv" => "name01",
78                "header" => "名前1"
79            ),
80            array(
81                "sql" => "name02",
82                "csv" => "name02",
83                "header" => "名前2"
84            ),
85            array(
86                "sql" => "kana01",
87                "csv" => "kana01",
88                "header" => "お名前(フリガナ・姓)"
89            ),
90            array(
91                "sql" => "kana02",
92                "csv" => "kana02",
93                "header" => "お名前(フリガナ・名)"
94            ),
95            array(
96                "sql" => "zip01",
97                "csv" => "zip01",
98                "header" => "郵便番号1"
99            ),
100            array(
101                "sql" => "zip02",
102                "csv" => "zip02",
103                "header" => "郵便番号2"
104            ),
105            array(
106                "sql" => "pref",
107                "csv" => "pref",
108                "header" => "都道府県"
109            ),
110            array(
111                "sql" => "addr01",
112                "csv" => "addr01",
113                "header" => "住所1"
114            ),
115            array(
116                "sql" => "addr02",
117                "csv" => "addr02",
118                "header" => "住所2"
119            ),
120            array(
121                "sql" => "email",
122                "csv" => "email",
123                "header" => "E-MAIL"
124            ),
125            array(
126                "sql" => "tel01",
127                "csv" => "tel01",
128                "header" => "TEL1"
129            ),
130            array(
131                "sql" => "tel02",
132                "csv" => "tel02",
133                "header" => "TEL2"
134            ),
135            array(
136                "sql" => "tel03",
137                "csv" => "tel03",
138                "header" => "TEL3"
139            ),
140            array(
141                "sql" => "fax01",
142                "csv" => "fax01",
143                "header" => "FAX1"
144            ),
145            array(
146                "sql" => "fax02",
147                "csv" => "fax02",
148                "header" => "FAX2"
149            ),
150            array(
151                "sql" => "fax03",
152                "csv" => "fax03",
153                "header" => "FAX3"
154            ),
155            array(
156                "sql" => "CASE WHEN sex = 1 THEN '男性' ELSE '女性' END AS sex",
157                "csv" => "sex",
158                "header" => "性別"
159            ),
160            array(
161                "sql" => "job",
162                "csv" => "job",
163                "header" => "職業"
164            ),
165            array(
166                "sql" => "cast(birth as date) AS birth",
167                "csv" => "birth",
168                "header" => "誕生日"
169            ),
170            array(
171                "sql" => "cast(first_buy_date as date) AS first_buy_date",
172                "csv" => "first_buy_date",
173                "header" => "初回購入日"
174            ),
175            array(
176                "sql" => "cast(last_buy_date as date) AS last_buy_date",
177                "csv" => "last_buy_date",
178                "header" => "最終購入日"
179            ),
180            array(
181                "sql" => "buy_times",
182                "csv" => "buy_times",
183                "header" => "購入回数"
184            ),
185            array(
186                "sql" => "point",
187                "csv" => "point",
188                "header" => "ポイント残高"
189            ),
190            array(
191                "sql" => "note",
192                "csv" => "note",
193                "header" => "備考"
194            ),
195            array(
196                "sql" => "cast(create_date as date) AS create_date",
197                "csv" => "create_date",
198                "header" => "登録日"
199            ),
200            array(
201                "sql" => "cast(update_date as date) AS update_date",
202                "csv" => "update_date",
203                "header" => "更新日"
204            ),
205        );
206        $this->httpCacheControl('nocache');
207    }
208
209    /**
210     * Page のプロセス.
211     *
212     * @return void
213     */
214    function process() {
215        $this->action();
216        $this->sendResponse();
217    }
218
219    /**
220     * Page のアクション.
221     *
222     * @return void
223     */
224    function action() {
225        //---- ページ初期設定
226        $objQuery = new SC_Query();
227        $objView = new SC_AdminView();
228        $objDate = new SC_Date(1901);
229        $objDb = new SC_Helper_DB_Ex();
230        $this->arrYear = $objDate->getYear();   // 日付プルダウン設定
231        $this->arrMonth = $objDate->getMonth();
232        $this->arrDay = $objDate->getDay();
233        $this->objDate = $objDate;
234
235        // 認証可否の判定
236        $objSess = new SC_Session();
237        SC_Utils_Ex::sfIsSuccess($objSess);
238
239        // POST値の引き継ぎ
240        $this->arrForm = $_POST;
241
242        // ページ送り用
243        $this->arrHidden['search_pageno'] =
244                isset($_POST['search_pageno']) ? $_POST['search_pageno'] : "";
245
246        // 検索ワードの引き継ぎ
247        foreach ($_POST as $key => $val) {
248            switch($key) {
249            case 'sex':
250            case 'status':
251                $this->arrHidden[$key] = SC_Utils_Ex::sfMergeParamCheckBoxes($val);
252                if(!is_array($val)) {
253                    $this->arrForm[$key] = split("-", $val);
254                }
255                break;
256            default:
257                $this->arrHidden[$key] = $val;
258                break;
259            }
260        }
261
262        if (!isset($_POST['mode'])) $_POST['mode'] = "";
263
264        // 顧客削除
265        if ($_POST['mode'] == "delete") {
266            $sql = "SELECT status,email FROM dtb_customer WHERE customer_id = ? AND del_flg = 0";
267            $result_customer = $objQuery->getAll($sql, array($_POST["edit_customer_id"]));
268
269            if ($result_customer[0]["status"] == 2) {           //本会員削除
270                $objQuery->exec("UPDATE dtb_customer SET del_flg=1, update_date=now() WHERE customer_id=?", array($_POST["edit_customer_id"]));
271            } elseif ($result_customer[0]["status"] == 1) {     //仮会員削除
272                $sql = "DELETE FROM dtb_customer WHERE customer_id = ?";
273                $objQuery->query($sql, array($_POST["edit_customer_id"]));
274            }
275        }
276        // 登録メール再送
277        if ($_POST['mode'] == "resend_mail") {
278            $arrRet = $objQuery->select("name01, name02, secret_key, email, email_mobile", "dtb_customer","customer_id = ? AND del_flg <> 1 AND status = 1", array($_POST["edit_customer_id"]));
279            if( is_array($arrRet) === true && count($arrRet) > 0 ){
280
281                $this->name01 = $arrRet[0]['name01'];
282                $this->name02 = $arrRet[0]['name02'];
283                $this->uniqid = $arrRet[0]['secret_key'];
284
285                $CONF = $objDb->sfGetBasisData();
286                $this->CONF = $CONF;
287                /**
288                 * 携帯メールアドレスが登録されていれば携帯サイトから仮会員登録したものと判定する。
289                 * TODO: とりあえずの簡易的な判定なので、将来的には判定ルーチンを修正した方が良い。
290                 */
291                if (!empty($arrRet[0]['email_mobile'])) {
292                    $objMailText = new SC_MobileView(false);
293                    $this->to_name01 = $arrRet[0]['name01'];
294                    $this->to_name02 = $arrRet[0]['name02'];
295                } else {
296                    $objMailText = new SC_SiteView(false);
297                }
298                $objMailText->assignobj($this);
299                $mailHelper = new SC_Helper_Mail_Ex();
300
301                $subject = $mailHelper->sfMakesubject('会員登録のご確認');
302                $toCustomerMail = $objMailText->fetch("mail_templates/customer_mail.tpl");
303
304                $objMail = new SC_SendMail();
305                $objMail->setItem(
306                                    ''                  // 宛先
307                                    , $subject          // サブジェクト
308                                    , $toCustomerMail   // 本文
309                                    , $CONF["email03"]  // 配送元アドレス
310                                    , $CONF["shop_name"]// 配送元 名前
311                                    , $CONF["email03"]  // reply_to
312                                    , $CONF["email04"]  // return_path
313                                    , $CONF["email04"]  //  Errors_to
314                                 );
315                // 宛先の設定
316                $name = $this->name01 . $this->name02 ." 様";
317                $objMail->setTo($arrRet[0]["email"], $name);
318                $objMail->sendMail();
319            }
320
321        }
322
323        if ($_POST['mode'] == "search" || $_POST['mode'] == "csv"  || $_POST['mode'] == "delete" || $_POST['mode'] == "delete_all" || $_POST['mode'] == "resend_mail") {
324
325            // 入力文字の強制変換
326            $this->lfConvertParam();
327            // エラーチェック
328            $this->arrErr = $this->lfCheckError($this->arrForm);
329
330            $where = "del_flg = 0";
331
332            /* 入力エラーなし */
333            if (count($this->arrErr) == 0) {
334
335                //-- 検索データ取得
336                $objSelect = new SC_CustomerList($this->arrForm, "customer");
337
338                // 表示件数設定
339                $page_rows = $this->arrForm['page_rows'];
340                if(is_numeric($page_rows)) {
341                    $page_max = $page_rows;
342                } else {
343                    $page_max = SEARCH_PMAX;
344                }
345
346                if (!isset($this->arrForm['search_pageno'])) $this->arrForm['search_pageno'] = "";
347
348                if ($this->arrForm['search_pageno'] == 0){
349                    $this->arrForm['search_pageno'] = 1;
350                }
351
352                $offset = $page_max * ($this->arrForm['search_pageno'] - 1);
353                $objSelect->setLimitOffset($page_max, $offset);
354
355                if ($_POST["mode"] == 'csv') {
356                    $searchSql = $objSelect->getListCSV($this->arrColumnCSV);
357                }else{
358                    $searchSql = $objSelect->getList();
359                }
360
361                $this->search_data = $objQuery->getAll($searchSql, $objSelect->arrVal);
362
363                switch($_POST['mode']) {
364                case 'csv':
365                    require_once(CLASS_EX_REALDIR . "helper_extends/SC_Helper_CSV_Ex.php");
366
367                    $objCSV = new SC_Helper_CSV_Ex();
368                    $i = 0;
369                    $header = "";
370
371                    // CSVカラム取得
372                    $arrCsvOutput = ($objCSV->sfgetCsvOutput(2, 'status = 1'));
373
374                    if (count($arrCsvOutput) <= 0) break;
375
376                    foreach($arrCsvOutput as $data) {
377                        $arrColumn[] = $data["col"];
378                        if ($i != 0) $header .= ", ";
379                        $header .= $data["disp_name"];
380                        $i ++;
381                    }
382                    $header .= "\n";
383
384                    //- 都道府県/職業の変換
385                    for($i = 0; $i < count($this->search_data); $i ++) {
386                        $this->search_data[$i]["pref"] = $this->arrPref[ $this->search_data[$i]["pref"] ];
387                        $this->search_data[$i]["job"]  = $this->arrJob[ $this->search_data[$i]["job"] ];
388                    }
389
390                    //- CSV出力
391                    $data = SC_Utils_Ex::getCSVData($this->search_data, $arrColumn);
392
393
394                    // CSVを送信する。
395                    list($fime_name, $data) = SC_Utils_Ex::sfGetCSVData($head.$data);
396                    $this->sendResponseCSV($fime_name, $data);
397                    exit;
398                    break;
399                case 'delete_all':
400                    // 検索結果をすべて削除
401                    $where = "product_id IN (SELECT product_id FROM SC_Product::alldtlSQL() WHERE $where)";
402                    $sqlval['del_flg'] = 1;
403                    $objQuery->update("dtb_products", $sqlval, $where, $arrval);
404
405                    $sql = "SELECT status,email FROM dtb_customer WHERE customer_id = ? AND del_flg = 0";
406                    $result_customer = $objQuery->getAll($sql, array($_POST["del_customer_id"]));
407
408                    if ($result_customer[0]["status"] == 2) {           //本会員削除
409                        $objQuery->exec("UPDATE dtb_customer SET del_flg=1, update_date=now() WHERE customer_id=?", array($_POST["del_customer_id"]));
410                    } elseif ($result_customer[0]["status"] == 1) {     //仮会員削除
411                        $sql = "DELETE FROM dtb_customer WHERE customer_id = ?";
412                        $objQuery->query($sql, array($_POST["del_customer_id"]));
413                    }
414
415                    break;
416                default:
417
418                    // 行数の取得
419                    $linemax = $objQuery->getOne( $objSelect->getListCount(), $objSelect->arrVal);
420                    $this->tpl_linemax = $linemax;              // 何件が該当しました。表示用
421
422                    // ページ送りの取得
423                    $objNavi = new SC_PageNavi($this->arrHidden['search_pageno'],
424                                               $linemax, $page_max,
425                                               "fnCustomerPage", NAVI_PMAX);
426                    $startno = $objNavi->start_row;
427                    $this->arrPagenavi = $objNavi->arrPagenavi;
428                }
429            }
430        }
431
432        $this->arrCatList = $objDb->sfGetCategoryList();
433    }
434
435    /**
436     * デストラクタ.
437     *
438     * @return void
439     */
440    function destroy() {
441        parent::destroy();
442    }
443
444    //---- 取得文字列の変換
445    function lfConvertParam() {
446        /*
447         *  文字列の変換
448         *  K :  「半角(ハンカク)片仮名」を「全角片仮名」に変換
449         *  C :  「全角ひら仮名」を「全角かた仮名」に変換
450         *  V :  濁点付きの文字を一文字に変換。"K","H"と共に使用します
451         *  n :  「全角」数字を「半角(ハンカク)」に変換
452         *  a :  全角英数字を半角英数字に変換する
453         */
454        // カラム名とコンバート情報
455        $arrConvList['customer_id'] = "n" ;
456        $arrConvList['name'] = "aKV" ;
457        $arrConvList['pref'] = "n" ;
458        $arrConvList['kana'] = "CKV" ;
459        $arrConvList['b_start_year'] = "n" ;
460        $arrConvList['b_start_month'] = "n" ;
461        $arrConvList['b_start_day'] = "n" ;
462        $arrConvList['b_end_year'] = "n" ;
463        $arrConvList['b_end_month'] = "n" ;
464        $arrConvList['b_end_day'] = "n" ;
465        $arrConvList['tel'] = "n" ;
466        $arrConvList['birth_month'] = "n" ;
467        $arrConvList['email'] = "a" ;
468        $arrConvList['buy_total_from'] = "n" ;
469        $arrConvList['buy_total_to'] = "n" ;
470        $arrConvList['buy_times_from'] = "n" ;
471        $arrConvList['buy_times_to'] = "n" ;
472        $arrConvList['start_year'] = "n" ;
473        $arrConvList['start_month'] = "n" ;
474        $arrConvList['start_day'] = "n" ;
475        $arrConvList['end_year'] = "n" ;
476        $arrConvList['end_month'] = "n" ;
477        $arrConvList['end_day'] = "n" ;
478        $arrConvList['page_rows'] = "n" ;
479        $arrConvList['buy_start_year'] = "n" ;      // 最終購入日 START 年
480        $arrConvList['buy_start_month'] = "n" ;     // 最終購入日 START 月
481        $arrConvList['buy_start_day'] = "n" ;       // 最終購入日 START 日
482        $arrConvList['buy_end_year'] = "n" ;            // 最終購入日 END 年
483        $arrConvList['buy_end_month'] = "n" ;       // 最終購入日 END 月
484        $arrConvList['buy_end_day'] = "n" ;         // 最終購入日 END 日
485        $arrConvList['buy_product_name'] = "aKV" ;  // 購入商品名
486        $arrConvList['buy_product_code'] = "aKV" ;  // 購入商品コード
487        $arrConvList['category_id'] = "" ;          // カテゴリ
488
489        // 文字変換
490        foreach ($arrConvList as $key => $val) {
491            // POSTされてきた値のみ変換する。
492            if(isset($this->arrForm[$key])) {
493                $this->arrForm[$key] = mb_convert_kana($this->arrForm[$key] ,$val);
494            }
495        }
496    }
497
498    //---- 入力エラーチェック
499    function lfCheckError($array) {
500
501        $objErr = new SC_CheckError($array);
502
503        $objErr->doFunc(array("顧客コード", "customer_id", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
504        $objErr->doFunc(array("都道府県", "pref", 2), array("NUM_CHECK","MAX_LENGTH_CHECK"));
505        $objErr->doFunc(array("顧客名", "name", STEXT_LEN), array("MAX_LENGTH_CHECK"));
506        $objErr->doFunc(array("顧客名(カナ)", "kana", STEXT_LEN), array("SPTAB_CHECK" ,"MAX_LENGTH_CHECK", "KANABLANK_CHECK"));
507        $objErr->doFunc(array("誕生日(開始日)", "b_start_year", "b_start_month", "b_start_day"), array("CHECK_DATE"));
508        $objErr->doFunc(array("誕生日(終了日)", "b_end_year", "b_end_month", "b_end_day"), array("CHECK_DATE"));
509        $objErr->doFunc(array("誕生日(開始日)","誕生日(終了日)", "b_start_year", "b_start_month", "b_start_day", "b_end_year", "b_end_month", "b_end_day"), array("CHECK_SET_TERM"));
510        $objErr->doFunc(array("誕生月", "birth_month", 2), array("NUM_CHECK","MAX_LENGTH_CHECK"));
511        $objErr->doFunc(array('メールアドレス', "email", STEXT_LEN) ,array("EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
512        $objErr->doFunc(array('携帯メールアドレス', "email_mobile", STEXT_LEN) ,array("EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
513        $objErr->doFunc(array("電話番号", "tel", TEL_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
514        $objErr->doFunc(array("購入金額(開始)", "buy_total_from", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
515        $objErr->doFunc(array("購入金額(終了)", "buy_total_to", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
516        if ( (is_numeric($array["buy_total_from"]) && is_numeric($array["buy_total_to"]) ) && ($array["buy_total_from"] > $array["buy_total_to"]) ) $objErr->arrErr["buy_total_from"] .= "※ 購入金額の指定範囲が不正です。";
517        $objErr->doFunc(array("購入回数(開始)", "buy_times_from", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
518        $objErr->doFunc(array("購入回数(終了)", "buy_times_to", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
519        if ( (is_numeric($array["buy_times_from"]) && is_numeric($array["buy_times_to"]) ) && ($array["buy_times_from"] > $array["buy_times_to"]) ) $objErr->arrErr["buy_times_from"] .= "※ 購入回数の指定範囲が不正です。";
520        $objErr->doFunc(array("登録・更新日(開始日)", "start_year", "start_month", "start_day",), array("CHECK_DATE"));
521        $objErr->doFunc(array("登録・更新日(終了日)", "end_year", "end_month", "end_day"), array("CHECK_DATE"));
522        $objErr->doFunc(array("登録・更新日(開始日)","登録・更新日(終了日)", "start_year", "start_month", "start_day", "end_year", "end_month", "end_day"), array("CHECK_SET_TERM"));
523        $objErr->doFunc(array("表示件数", "page_rows", 3), array("NUM_CHECK","MAX_LENGTH_CHECK"));
524        $objErr->doFunc(array("最終購入日(開始日)", "buy_start_year", "buy_start_month", "buy_start_day",), array("CHECK_DATE"));   //最終購入日(開始日)
525        $objErr->doFunc(array("最終購入(終了日)", "buy_end_year", "buy_end_month", "buy_end_day"), array("CHECK_DATE"));            //最終購入日(終了日)
526        //購入金額(from) > 購入金額(to) の場合はエラーとする
527        $objErr->doFunc(array("最終購入日(開始日)","登録・更新日(終了日)", "buy_start_year", "buy_start_month", "buy_start_day", "buy_end_year", "buy_end_month", "buy_end_day"), array("CHECK_SET_TERM"));
528        $objErr->doFunc(array("購入商品コード", "buy_product_code", STEXT_LEN), array("MAX_LENGTH_CHECK"));                     //購入商品コード
529        $objErr->doFunc(array("購入商品名", "buy_product_name", STEXT_LEN), array("MAX_LENGTH_CHECK"));                         //購入商品名称
530
531        return $objErr->arrErr;
532    }
533}
534?>
Note: See TracBrowser for help on using the repository browser.