source: branches/feature-module-update/data/class/pages/admin/total/LC_Page_Admin_Total.php @ 15626

Revision 15626, 32.6 KB checked in by nanasess, 15 years ago (diff)

未定義変数の修正

  • Property svn:keywords set to "Id Revision Date"
Line 
1<?php
2/*
3 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
4 *
5 * http://www.lockon.co.jp/
6 */
7
8// {{{ requires
9require_once("../../require.php");
10require_once(CLASS_PATH . "pages/LC_Page.php");
11require_once(CLASS_PATH . "batch_extends/SC_Batch_Daily_Ex.php");
12require_once(CLASS_PATH . "graph/SC_GraphPie.php");
13require_once(CLASS_PATH . "graph/SC_GraphLine.php");
14require_once(CLASS_PATH . "graph/SC_GraphBar.php");
15
16/**
17 * 売上集計 のページクラス.
18 *
19 * @package Page
20 * @author LOCKON CO.,LTD.
21 * @version $Id$
22 */
23class LC_Page_Admin_Total extends LC_Page {
24
25    // }}}
26    // {{{ functions
27
28    /**
29     * Page を初期化する.
30     *
31     * @return void
32     */
33    function init() {
34        parent::init();
35        // GDライブラリのインストール判定
36        $this->install_GD = function_exists("gd_info") ? true : false;
37        $this->tpl_mainpage = 'total/index.tpl';
38        $this->tpl_subnavi = 'total/subnavi.tpl';
39        $this->tpl_graphsubtitle = 'total/subtitle.tpl';
40        $this->tpl_titleimage = URL_DIR.'img/title/title_sale.jpg';
41        $this->tpl_mainno = 'total';
42
43        $masterData = new SC_DB_MasterData_Ex();
44        $this->arrWDAY = $masterData->getMasterData("mtb_wday");
45        $this->arrSex = $masterData->getMasterData("mtb_sex");
46        // ページタイトル
47        $this->arrTitle[''] = "期間別集計";
48        $this->arrTitle['term'] = "期間別集計";
49        $this->arrTitle['products'] = "商品別集計";
50        $this->arrTitle['age'] = "年代別集計";
51        $this->arrTitle['job'] = "職業別集計";
52        $this->arrTitle['member'] = "会員別集計";
53
54        // キャッシュ回避のために日付を渡す
55        $this->cashtime = time();
56        $this->objBatch = new SC_Batch_Daily_Ex();
57    }
58
59    /**
60     * Page のプロセス.
61     *
62     * @return void
63     */
64    function process() {
65        $objView = new SC_AdminView();
66        $objSess = new SC_Session();
67
68        // 認証可否の判定
69        SC_Utils_Ex::sfIsSuccess($objSess);
70
71        // 入力期間をセッションに記録する
72        $this->lfSaveDateSession();
73
74        if(isset($_GET['draw_image']) && $_GET['draw_image'] != ""){
75            define('DRAW_IMAGE' , true);
76        }else{
77            define('DRAW_IMAGE' , false);
78        }
79
80        // パラメータ管理クラス
81        $this->objFormParam = new SC_FormParam();
82        // パラメータ情報の初期化
83        $this->lfInitParam();
84        $this->objFormParam->setParam($_POST);
85        $this->objFormParam->setParam($_GET);
86
87        // 検索ワードの引き継ぎ
88        foreach ($_POST as $key => $val) {
89            if (ereg("^search_", $key)) {
90                $this->arrHidden[$key] = $val;
91            }
92        }
93
94        $mode = $this->objFormParam->getValue('mode');
95        switch($mode) {
96        case 'pdf':
97        case 'csv':
98        case 'search':
99            // 入力値の変換
100            $this->objFormParam->convParam();
101            $this->arrErr = $this->lfCheckError();
102            $arrRet = $this->objFormParam->getHashArray();
103
104            // 入力エラーなし
105            if (count($this->arrErr) == 0) {
106                foreach ($arrRet as $key => $val) {
107                    if($val == "") {
108                        continue;
109                    }
110                    switch ($key) {
111                    case 'search_startyear':
112                        $sdate = $this->objFormParam->getValue('search_startyear') . "/" . $this->objFormParam->getValue('search_startmonth') . "/" . $this->objFormParam->getValue('search_startday');
113                        break;
114                    case 'search_endyear':
115                        $edate = $this->objFormParam->getValue('search_endyear') . "/" . $this->objFormParam->getValue('search_endmonth') . "/" . $this->objFormParam->getValue('search_endday');
116                        break;
117                    case 'search_startyear_m':
118                        list($sdate, $edate) = SC_Utils_Ex::sfTermMonth($this->objFormParam->getValue('search_startyear_m'), $this->objFormParam->getValue('search_startmonth_m'), CLOSE_DAY);
119                        break;
120                    default:
121                        break;
122                    }
123                }
124
125                if($this->objFormParam->getValue('type') != "") {
126                    $type = $this->objFormParam->getValue('type');
127                }
128
129                $page = $this->objFormParam->getValue('page');
130
131                switch($page) {
132                    // 商品別集計
133                case 'products':
134                    if($type == "") {
135                        $type = 'all';
136                    }
137                    $this->tpl_page_type = "total/page_products.tpl";
138                    // 未集計データの集計を行う
139                    if(!DAILY_BATCH_MODE) {
140                        $this->objBatch->lfRealTimeDailyTotal($sdate, $edate);
141                    }
142                    // 検索結果の取得
143                    $this->lfGetOrderProducts($type, $sdate, $edate, $this, $this->install_GD, $mode);
144                    break;
145                    // 職業別集計
146                case 'job':
147                    if($type == "") {
148                        $type = 'all';
149                    }
150                    $this->tpl_page_type = "total/page_job.tpl";
151                    // 未集計データの集計を行う
152                    if(!DAILY_BATCH_MODE) {
153                        $this->objBatch->lfRealTimeDailyTotal($sdate, $edate);
154                    }
155                    // 検索結果の取得
156                    $this->lfGetOrderJob($type, $sdate, $edate, $this, $this->install_GD);
157                    break;
158                    // 会員別集計
159                case 'member':
160                    if($type == "") {
161                        $type = 'all';
162                    }
163                    $this->tpl_page_type = "total/page_member.tpl";
164                    // 未集計データの集計を行う
165                    if(!DAILY_BATCH_MODE) {
166                        $this->objBatch->lfRealTimeDailyTotal($sdate, $edate);
167                    }
168                    // 検索結果の取得
169                    $this->lfGetOrderMember($type, $sdate, $edate, $this, $this->install_GD);
170                    break;
171                    // 年代別集計
172                case 'age':
173                    if($type == "") {
174                        $type = 'all';
175                    }
176
177                    $this->tpl_page_type = "total/page_age.tpl";
178                    // 未集計データの集計を行う
179                    if(!DAILY_BATCH_MODE) {
180                        $this->objBatch->lfRealTimeDailyTotal($sdate, $edate);
181                    }
182                    // 検索結果の取得
183                    $this->lfGetOrderAge($type, $sdate, $edate, $this, $this->install_GD);
184                    break;
185                    // 期間別集計
186                default:
187                    if (!isset($type)) $type = "";
188                    if($type == "") {
189                        $type = 'day';
190                    }
191                    $this->tpl_page_type = "total/page_term.tpl";
192                    // 未集計データの集計を行う
193                    if(!DAILY_BATCH_MODE) {
194                        $this->objBatch->lfRealTimeDailyTotal($sdate, $edate);
195                    }
196                    // 検索結果の取得
197                    $this->lfGetOrderTerm($type, $sdate, $edate, $this, $this->install_GD);
198
199                    break;
200                }
201
202                if($mode == 'csv') {
203                    // CSV出力タイトル行の取得
204                    list($arrTitleCol, $arrDataCol) = $this->lfGetCSVColum($page, $this->keyname);
205                    $head = SC_Utils_Ex::sfGetCSVList($arrTitleCol);
206                    $data = $this->lfGetDataColCSV($this->arrResults, $arrDataCol);
207                    // CSVを送信する。
208                    SC_Utils_Ex::sfCSVDownload($head.$data, $page."_".$type);
209                    exit;
210                }
211
212                if($mode == 'pdf') {
213                    // CSV出力タイトル行の取得
214                    list($arrTitleCol, $arrDataCol, $arrColSize, $arrAlign, $title) = $this->lfGetPDFColum($page, $type, $this->keyname);
215                    $head = sfGetPDFList($arrTitleCol);
216                    $data = lfGetDataColPDF($this->arrResults, $arrDataCol, 40);
217                    // PDF出力用
218                    $graph_name = basename($this->tpl_image);
219                    $this->lfPDFDownload($graph_name, $head . $data, $arrColSize, $arrAlign, $sdate, $edate, $title, $page);
220                    exit;
221                }
222            }
223            break;
224        default:
225            if(count($_GET) == 0) {
226                // バッチモードの場合のみ実行する(当日の集計を行うため)
227                if(DAILY_BATCH_MODE) {
228                    // 3日前までの集計
229                    $this->objBatch->lfStartDailyTotal(3,0);
230                }
231            }
232            break;
233        }
234
235
236
237        // 登録・更新日検索用
238        $objDate = new SC_Date();
239        $objDate->setStartYear(RELEASE_YEAR);
240        $objDate->setEndYear(DATE("Y"));
241        $this->arrYear = $objDate->getYear();
242        $this->arrMonth = $objDate->getMonth();
243        $this->arrDay = $objDate->getDay();
244        // 入力値の取得
245        $this->arrForm = $this->objFormParam->getFormParamList();
246
247        $this->tpl_subtitle = $this->arrTitle[$this->objFormParam->getValue('page')];
248
249        $objView->assignobj($this);
250        $objView->display(MAIN_FRAME);
251    }
252
253    /**
254     * デストラクタ.
255     *
256     * @return void
257     */
258    function destroy() {
259        parent::destroy();
260    }
261
262    /* PDF出力 */
263    function lfPDFDownload($image, $table, $arrColSize, $arrAlign, $sdate, $edate, $title, $page = "") {
264
265        $objPdf = new SC_Pdf();
266        $objPdf->setTableColor("CCCCCC", "F0F0F0", "D1DEFE");
267
268        // 土台となるPDFファイルの指定
269        $objPdf->setTemplate(PDF_DIR . "total.pdf");
270
271        $disp_sdate = sfDispDBDate($sdate, false);
272        $disp_edate = sfDispDBDate($edate, false);
273
274        $arrText['title_block'] = $title;
275        $arrText['date_block'] = "$disp_sdate-$disp_edate";
276        $arrImage['graph_block'] = GRAPH_DIR . $image;
277
278        // 文末の\nを削除する
279        $table = ereg_replace("\n$", "", $table);
280        $arrRet = split("\n", $table);
281        $page_max = intval((count($arrRet) / 35) + 1);
282
283        for($page = 1; $page <= $page_max; $page++) {
284            if($page > 1) {
285                // 2ページ以降
286                $start_no = 35 * ($page - 1) + 1;
287            } else {
288                // 開始ページ
289                $start_no = 1;
290            }
291
292            $arrText['page_block'] = $page . " / " . $page_max;
293            $objPdf->setTextBlock($arrText);
294            $objPdf->setImageBlock($arrImage);
295            // ブロック値の入力
296            $objPdf->writeBlock();
297            // 最終ページのみ、商品別集計は合計がないので最終行の色を変更しない。
298            if($page == $page_max && $page != 'products') {
299                $last_color_flg = true;
300            } else {
301                $last_color_flg = false;
302            }
303            $objPdf->writeTableCenter($table, 500, $arrColSize, $arrAlign, 35, $start_no, $last_color_flg);
304            $objPdf->closePage();
305        }
306
307        // PDFの出力
308        $objPdf->output();
309    }
310
311    /* セッションに入力期間を記録する */
312    function lfSaveDateSession() {
313        if (!isset($_POST['form'])) $_POST['form'] = "";
314
315        if($_POST['form'] == 1) {
316            $_SESSION['total']['startyear_m'] = $_POST['search_startyear_m'];
317            $_SESSION['total']['startmonth_m'] = $_POST['search_startmonth_m'];
318        }
319
320        if($_POST['form'] == 2) {
321            $_SESSION['total']['startyear'] = $_POST['search_startyear'];
322            $_SESSION['total']['startmonth'] = $_POST['search_startmonth'];
323            $_SESSION['total']['startday'] = $_POST['search_startday'];
324            $_SESSION['total']['endyear'] = $_POST['search_endyear'];
325            $_SESSION['total']['endmonth'] = $_POST['search_endmonth'];
326            $_SESSION['total']['endday'] = $_POST['search_endday'];
327        }
328    }
329
330    /* デフォルト値の取得 */
331    function lfGetDateDefault() {
332        $year = date("Y");
333        $month = date("m");
334        $day = date("d");
335
336        $list = isset($_SESSION['total']) ? $_SESSION['total'] : "";
337
338        // セッション情報に開始月度が保存されていない。
339        if(empty($_SESSION['total']['startyear_m'])) {
340            $list['startyear_m'] = $year;
341            $list['startmonth_m'] = $month;
342        }
343
344        // セッション情報に開始日付、終了日付が保存されていない。
345        if(empty($_SESSION['total']['startyear']) && empty($_SESSION['total']['endyear'])) {
346            $list['startyear'] = $year;
347            $list['startmonth'] = $month;
348            $list['startday'] = $day;
349            $list['endyear'] = $year;
350            $list['endmonth'] = $month;
351            $list['endday'] = $day;
352        }
353
354        return $list;
355    }
356
357    /* パラメータ情報の初期化 */
358    function lfInitParam() {
359        // デフォルト値の取得
360        $arrList = $this->lfGetDateDefault();
361
362        // 月度集計
363        $this->objFormParam->addParam("月度", "search_startyear_m", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"), $arrList['startyear_m']);
364        $this->objFormParam->addParam("月度", "search_startmonth_m", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"), $arrList['startmonth_m']);
365        // 期間集計
366        $this->objFormParam->addParam("開始日", "search_startyear", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"), $arrList['startyear']);
367        $this->objFormParam->addParam("開始日", "search_startmonth", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"), $arrList['startmonth']);
368        $this->objFormParam->addParam("開始日", "search_startday", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"), $arrList['startday']);
369        $this->objFormParam->addParam("終了日", "search_endyear", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"), $arrList['endyear']);
370        $this->objFormParam->addParam("終了日", "search_endmonth", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"), $arrList['endmonth']);
371        $this->objFormParam->addParam("終了日", "search_endday", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"), $arrList['endday']);
372
373        // hiddenデータの取得用
374        $this->objFormParam->addParam("", "page");
375        $this->objFormParam->addParam("", "type");
376        $this->objFormParam->addParam("", "mode");
377
378    }
379
380    /* 入力内容のチェック */
381    function lfCheckError() {
382        // 入力データを渡す。
383        $arrRet =  $this->objFormParam->getHashArray();
384        $objErr = new SC_CheckError($arrRet);
385        $objErr->arrErr = $this->objFormParam->checkError();
386
387        // 特殊項目チェック
388        if($_POST['form'] == 1) {
389            $objErr->doFunc(array("月度", "search_startyear_m"), array("ONE_EXIST_CHECK"));
390        }
391
392        if($_POST['form'] == 2) {
393            $objErr->doFunc(array("期間", "search_startyear", "search_endyear"), array("ONE_EXIST_CHECK"));
394        }
395
396        $objErr->doFunc(array("月度", "search_startyear_m", "search_startmonth_m"), array("ALL_EXIST_CHECK"));
397        $objErr->doFunc(array("開始日", "search_startyear", "search_startmonth", "search_startday"), array("CHECK_DATE"));
398        $objErr->doFunc(array("終了日", "search_endyear", "search_endmonth", "search_endday"), array("CHECK_DATE"));
399        $objErr->doFunc(array("開始日", "終了日", "search_startyear", "search_startmonth", "search_startday", "search_endyear", "search_endmonth", "search_endday"), array("CHECK_SET_TERM"));
400        return $objErr->arrErr;
401    }
402
403    /* 折れ線グラフの作成 */
404    function lfGetGraphLine($arrResults, $keyname, $type, $xtitle, $ytitle, $sdate, $edate) {
405
406        $ret_path = "";
407
408        // 結果が0行以上ある場合のみグラフを生成する。
409        if(count($arrResults) > 0) {
410
411            // グラフの生成
412            $arrList = SC_Utils_Ex::sfArrKeyValue($arrResults, $keyname, "total");
413
414            // 一時ファイル名の取得
415            $pngname = $this->lfGetGraphPng($type);
416
417            $path = GRAPH_DIR . $pngname;
418
419            // ラベル表示インターバルを求める
420            $interval = intval(count($arrList) / 20);
421            if($interval < 1) {
422                $interval = 1;
423            }
424            $objGraphPie = new SC_GraphPie();
425            $objGraphLine = new SC_GraphLine();
426
427            // 値のセット
428            $objGraphLine->setData($arrList);
429            $objGraphLine->setXLabel(array_keys($arrList));
430
431            // ラベル回転(日本語不可)
432            if($keyname == "key_day"){
433                $objGraphLine->setXLabelAngle(45);
434            }
435
436            // タイトルセット
437            $objGraphLine->setXTitle($xtitle);
438            $objGraphLine->setYTitle($ytitle);
439
440            // メインタイトル作成
441            list($sy, $sm, $sd) = split("[/ ]" , $sdate);
442            list($ey, $em, $ed) = split("[/ ]" , $edate);
443            $start_date = $sy . "年" . $sm . "月" . $sd . "日";
444            $end_date = $ey . "年" . $em . "月" . $ed . "日";
445            $objGraphLine->drawTitle("集計期間:" . $start_date . " - " . $end_date);
446
447            // グラフ描画
448            $objGraphLine->drawGraph();
449
450            // グラフの出力
451            if(DRAW_IMAGE){
452                $objGraphLine->outputGraph();
453                exit();
454            }
455
456            // ファイルパスを返す
457            $ret_path = GRAPH_URL . $pngname;
458        }
459        return $ret_path;
460    }
461
462    // 円グラフの作成
463    function lfGetGraphPie($arrResults, $keyname, $type, $title = "", $sdate = "", $edate = "") {
464
465        $ret_path = "";
466
467        // 結果が0行以上ある場合のみグラフを生成する。
468        if(count($arrResults) > 0) {
469            // グラフの生成
470            $arrList = sfArrKeyValue($arrResults, $keyname, "total", GRAPH_PIE_MAX, GRAPH_LABEL_MAX);
471
472            // 一時ファイル名の取得
473            $pngname = $this->lfGetGraphPng($type);
474            $path = GRAPH_DIR . $pngname;
475
476            $objGraphPie = new SC_GraphPie();
477
478            /* デバッグ表示用 by naka
479             foreach($arrList as $key => $val) {
480             $objGraphPie->debugPrint("key:$key val:$val");
481             }
482            */
483
484            // データをセットする
485            $objGraphPie->setData($arrList);
486            // 凡例をセットする
487            $objGraphPie->setLegend(array_keys($arrList));
488
489            // メインタイトル作成
490            list($sy, $sm, $sd) = split("[/ ]" , $sdate);
491            list($ey, $em, $ed) = split("[/ ]" , $edate);
492            $start_date = $sy . "年" . $sm . "月" . $sd . "日";
493            $end_date = $ey . "年" . $em . "月" . $ed . "日";
494            $objGraphPie->drawTitle("集計期間:" . $start_date . " - " . $end_date);
495
496            // 円グラフ描画
497            $objGraphPie->drawGraph();
498
499            // グラフの出力
500            if(DRAW_IMAGE){
501                $objGraphPie->outputGraph();
502                exit();
503            }
504
505            // ファイルパスを返す
506            $ret_path = GRAPH_URL . $pngname;
507        }
508        return $ret_path;
509    }
510
511    // 棒グラフの作成
512    function lfGetGraphBar($arrResults, $keyname, $type, $xtitle, $ytitle, $sdate, $edate) {
513        $ret_path = "";
514
515        // 結果が0行以上ある場合のみグラフを生成する。
516        if(count($arrResults) > 0) {
517            // グラフの生成
518            $arrList = sfArrKeyValue($arrResults, $keyname, "total", GRAPH_PIE_MAX, GRAPH_LABEL_MAX);
519
520            // 一時ファイル名の取得
521            $pngname = $this->lfGetGraphPng($type);
522            $path = GRAPH_DIR . $pngname;
523
524            $objGraphBar = new SC_GraphBar();
525
526            foreach(array_keys($arrList) as $val) {
527                $arrKey[] = ereg_replace("〜", "-", $val);
528            }
529
530            // グラフ描画
531            $objGraphBar->setXLabel($arrKey);
532            $objGraphBar->setXTitle($xtitle);
533            $objGraphBar->setYTitle($ytitle);
534            $objGraphBar->setData($arrList);
535
536            // メインタイトル作成
537            $arrKey = array_keys($arrList);
538            list($sy, $sm, $sd) = split("[/ ]" , $sdate);
539            list($ey, $em, $ed) = split("[/ ]" , $edate);
540            $start_date = $sy . "年" . $sm . "月" . $sd . "日";
541            $end_date = $ey . "年" . $em . "月" . $ed . "日";
542            $objGraphBar->drawTitle("集計期間:" . $start_date . " - " . $end_date);
543
544            $objGraphBar->drawGraph();
545
546            if(DRAW_IMAGE){
547                $objGraphBar->outputGraph();
548                exit();
549            }
550
551            // ファイルパスを返す
552            $ret_path = GRAPH_URL . $pngname;
553        }
554        return $ret_path;
555    }
556
557    // グラフ用のPNGファイル名
558    function lfGetGraphPng($keyname) {
559        if (!isset($_POST['search_startyear_m'])) $_POST['search_startyear_m'] = "";
560        if($_POST['search_startyear_m'] != "") {
561            $pngname = sprintf("%s_%02d%02d.png", $keyname, substr($_POST['search_startyear_m'],2), $_POST['search_startmonth_m']);
562        } else {
563            $pngname = sprintf("%s_%02d%02d%02d_%02d%02d%02d.png", $keyname, substr($_POST['search_startyear'], 2), $_POST['search_startmonth'], $_POST['search_startday'], substr($_POST['search_endyear'],2), $_POST['search_endmonth'], $_POST['search_endday']);
564        }
565        return $pngname;
566    }
567
568    // 会員、非会員集計のWHERE分の作成
569    function lfGetWhereMember($col_date, $sdate, $edate, $type, $col_member = "customer_id") {
570        // 取得日付の指定
571        if($sdate != "") {
572            if ($where != "") {
573                $where.= " AND ";
574            }
575            $where.= " $col_date >= '". $sdate ."'";
576        }
577
578        if($edate != "") {
579            if ($where != "") {
580                $where.= " AND ";
581            }
582            $edate = date("Y/m/d",strtotime("1 day" ,strtotime($edate)));
583            $where.= " $col_date < date('" . $edate ."')";
584        }
585
586        // 会員、非会員の判定
587        switch($type) {
588            // 全体
589        case 'all':
590            break;
591        case 'member':
592            if ($where != "") {
593                $where.= " AND ";
594            }
595            $where.= " $col_member <> 0";
596            break;
597        case 'nonmember':
598            if ($where != "") {
599                $where.= " AND ";
600            }
601            $where.= " $col_member = 0";
602            break;
603        default:
604            break;
605        }
606
607        return array($where, $arrval);
608    }
609
610    /** 会員別集計 **/
611    function lfGetOrderMember($type, $sdate, $edate, &$objPage, $graph = true) {
612        list($where, $arrval) = $this->lfGetWhereMember('create_date', $sdate, $edate, $type);
613
614        // 会員集計の取得
615        $col = "COUNT(*) AS order_count, SUM(total) AS total, (AVG(total)) AS total_average, order_sex";
616        $from = "dtb_order";
617        $objQuery = new SC_Query();
618        $objQuery->setGroupBy("order_sex");
619
620        $tmp_where = $where . " AND customer_id <> 0 AND del_flg = 0 ";
621        $arrRet = $objQuery->select($col, $from, $tmp_where, $arrval);
622
623        // 会員購入であることを記録する。
624        $max = count($arrRet);
625        for($i = 0; $i < $max; $i++) {
626            $arrRet[$i]['member_name'] = '会員'.$this->arrSex[$arrRet[$i]['order_sex']];
627        }
628        $objPage->arrResults = $arrRet;
629
630        // 非会員集計の取得
631        $tmp_where = $where . " AND customer_id = 0 AND del_flg = 0 ";
632        $arrRet = $objQuery->select($col, $from, $tmp_where, $arrval);
633        // 非会員購入であることを記録する。
634        $max = count($arrRet);
635        for($i = 0; $i < $max; $i++) {
636            $arrRet[$i]['member_name'] = '非会員'.$this->arrSex[$arrRet[$i]['order_sex']];
637        }
638
639        $objPage->arrResults = array_merge($objPage->arrResults, $arrRet);
640
641        // 円グラフの生成
642        if($graph) {
643            $image_key = "member";
644            $objPage->tpl_image = $this->lfGetGraphPie($objPage->arrResults, "member_name", $image_key, "(売上比率)", $sdate, $edate);
645        }
646    }
647
648    /** 商品別集計 **/
649    function lfGetOrderProducts($type, $sdate, $edate, &$objPage, $graph = true, $mode = "") {
650        list($where, $arrval) = $this->lfGetWhereMember('create_date', $sdate, $edate, $type);
651
652        $where .= " and del_flg=0 and status <> " . ORDER_CANCEL;
653
654        $sql = "SELECT T1.product_id, T1.product_code, T1.product_name as name, T1.products_count, T1.order_count, T1.price, T1.total ";
655        $sql.= "FROM ( ";
656        $sql.= "SELECT product_id, product_name, product_code, price, ";
657        $sql.= "COUNT(*) AS order_count, ";
658        $sql.= "SUM(quantity) AS products_count, ";
659        $sql.= "(price * sum(quantity)) AS total ";
660        $sql.= "FROM dtb_order_detail WHERE order_id IN (SELECT order_id FROM dtb_order WHERE $where ) ";
661        $sql.= "GROUP BY product_id, product_name, product_code, price ";
662        $sql.= ") AS T1 ";
663        $sql.= "ORDER BY T1.total DESC ";
664
665        if($mode != "csv") {
666            $sql.= "LIMIT " . PRODUCTS_TOTAL_MAX;
667        }
668
669        $objQuery = new SC_Query();
670        $objPage->arrResults = $objQuery->getall($sql, $arrval);
671
672        // 円グラフの生成
673        if($graph) {
674            $image_key = "products_" . $type;
675            $objPage->tpl_image = $this->lfGetGraphPie($objPage->arrResults, "name", $image_key, "(売上比率)", $sdate, $edate);
676        }
677    }
678
679    /** 職業別集計 **/
680    function lfGetOrderJob($type, $sdate, $edate, &$objPage, $graph = true) {
681        global $arrJob;
682
683        list($where, $arrval) = $this->lfGetWhereMember('T2.create_date', $sdate, $edate, $type);
684
685        $sql = "SELECT job, count(*) AS order_count, SUM(total) AS total, (AVG(total)) AS total_average ";
686        $sql.= "FROM dtb_customer AS T1 LEFT JOIN dtb_order AS T2 USING ( customer_id ) WHERE $where AND T2.del_flg = 0 and T2.status <> " . ORDER_CANCEL;
687        $sql.= " GROUP BY job ORDER BY total DESC";
688
689        $objQuery = new SC_Query();
690        $objPage->arrResults = $objQuery->getall($sql, $arrval);
691
692        $max = count($objPage->arrResults);
693        for($i = 0; $i < $max; $i++) {
694            $job_key = $objPage->arrResults[$i]['job'];
695            if($job_key != "") {
696                $objPage->arrResults[$i]['job_name'] = $arrJob[$job_key];
697            } else {
698                $objPage->arrResults[$i]['job_name'] = "未回答";
699            }
700        }
701
702        // 円グラフの生成
703        if($graph) {
704            $image_key = "job_" . $type;
705            $objPage->tpl_image = lfGetGraphPie($objPage->arrResults, "job_name", $image_key, "(売上比率)", $sdate, $edate);
706        }
707    }
708
709    /** 年代別集計 **/
710    function lfGetOrderAge($type, $sdate, $edate, &$objPage, $graph = true) {
711
712        list($where, $arrval) = $this->lfGetWhereMember('order_date', $sdate, $edate, $type, "member");
713
714        $sql = "SELECT SUM(order_count) AS order_count, SUM(total) AS total, start_age, end_age ";
715        $sql.= "FROM dtb_bat_order_daily_age WHERE $where ";
716        $sql.= "GROUP BY start_age, end_age ORDER BY start_age, end_age";
717
718        $objQuery = new SC_Query();
719        $objPage->arrResults = $objQuery->getall($sql, $arrval);
720
721        $max = count($objPage->arrResults);
722        for($i = 0; $i < $max; $i++) {
723            if($objPage->arrResults[$i]['order_count'] > 0) {
724                $objPage->arrResults[$i]['total_average'] = intval($objPage->arrResults[$i]['total'] / $objPage->arrResults[$i]['order_count']);
725            }
726            $start_age = $objPage->arrResults[$i]['start_age'];
727            $end_age = $objPage->arrResults[$i]['end_age'];
728            if($start_age != "" || $end_age != "") {
729                if($end_age != 999) {
730                    $objPage->arrResults[$i]['age_name'] = $start_age . "〜" . $end_age . "歳";
731                } else {
732                    $objPage->arrResults[$i]['age_name'] = $start_age . "歳〜";
733                }
734            } else {
735                $objPage->arrResults[$i]['age_name'] = "未回答";
736            }
737        }
738
739        // 棒グラフの生成
740        if($graph) {
741            $image_key = "age_" . $type;
742            $xtitle = "(年齢)";
743            $ytitle = "(売上合計)";
744            $objPage->tpl_image = $this->lfGetGraphBar($objPage->arrResults, "age_name", $image_key, $xtitle, $ytitle, $sdate, $edate);
745        }
746    }
747
748    /** 期間別集計 **/
749    function lfGetOrderTerm($type, $sdate, $edate, &$objPage, $graph = true) {
750
751        $tmp_col = "sum(total_order) as total_order, sum(men) as men, sum(women) as women,";
752        $tmp_col.= "sum(men_member) as men_member, sum(men_nonmember) as men_nonmember,";
753        $tmp_col.= "sum(women_member) as women_member, sum(women_nonmember) as women_nonmember,";
754        $tmp_col.= "sum(total) as total, (avg(total_average)) as total_average";
755        $objQuery = new SC_Query();
756
757        switch($type) {
758            // 月別
759        case 'month':
760            $col = $tmp_col . ",key_month";
761            $objQuery->setgroupby("key_month");
762            $objQuery->setOrder("key_month");
763            $objPage->keyname = "key_month";
764            $objPage->tpl_tail = "月";
765            $from = "dtb_bat_order_daily";
766            $xtitle = "(月別)";
767            $ytitle = "(売上合計)";
768            break;
769            // 年別
770        case 'year':
771            $col = $tmp_col . ",key_year";
772            $objQuery->setgroupby("key_year");
773            $objQuery->setOrder("key_year");
774            $objPage->keyname = "key_year";
775            $objPage->tpl_tail = "年";
776            $from = "dtb_bat_order_daily";
777            $xtitle = "(年別)";
778            $ytitle = "(売上合計)";
779            break;
780            // 曜日別
781        case 'wday':
782            $col = $tmp_col . ",key_wday, wday";
783            $objQuery->setgroupby("key_wday, wday");
784            $objQuery->setOrder("wday");
785            $objPage->keyname = "key_wday";
786            $objPage->tpl_tail = "曜日";
787            $from = "dtb_bat_order_daily";
788            $xtitle = "(曜日別)";
789            $ytitle = "(売上合計)";
790            break;
791            // 時間別
792        case 'hour':
793            $col = $tmp_col . ",hour";
794            $objQuery->setgroupby("hour");
795            $objQuery->setOrder("hour");
796            $objPage->keyname = "hour";
797            $objPage->tpl_tail = "時";
798            $from = "dtb_bat_order_daily_hour";
799            $xtitle = "(時間別)";
800            $ytitle = "(売上合計)";
801            break;
802        default:
803            $col = "*";
804            $objQuery->setOrder("key_day");
805            $objPage->keyname = "key_day";
806            $from = "dtb_bat_order_daily";
807            $xtitle = "(日別)";
808            $ytitle = "(売上合計)";
809            break;
810        }
811
812        if (!isset($where)) $where = "";
813
814        // 取得日付の指定
815        if($sdate != "") {
816            if ($where != "") {
817                $where.= " AND ";
818            }
819            $where.= " order_date >= '". $sdate ."'";
820        }
821
822        if($edate != "") {
823            if ($where != "") {
824                $where.= " AND ";
825            }
826            $edate_next = date("Y/m/d",strtotime("1 day" ,strtotime($edate)));
827            $where.= " order_date < date('" . $edate_next ."')";
828        }
829
830        if (!isset($arrval)) $arrval = array();
831
832        // 検索結果の取得
833        $objPage->arrResults = $objQuery->select($col, $from, $where, $arrval);
834
835        // 折れ線グラフの生成
836        if($graph) {
837            $image_key = "term_" . $type;
838            $objPage->tpl_image = $this->lfGetGraphLine($objPage->arrResults, $objPage->keyname, $image_key, $xtitle, $ytitle, $sdate, $edate);
839        }
840
841        // 検索結果が0でない場合
842        if(count($objPage->arrResults) > 0) {
843            // 最終集計行取得する
844            $col = $tmp_col;
845            $objQuery = new SC_Query();
846            $arrRet = $objQuery->select($col, $from, $where, $arrval);
847            $arrRet[0][$objPage->keyname] = "合計";
848            $objPage->arrResults[] = $arrRet[0];
849        }
850
851        // 平均値の計算
852        $max = count($objPage->arrResults);
853        for($i = 0; $i < $max; $i++) {
854            if($objPage->arrResults[$i]['total_order'] > 0) {
855                $objPage->arrResults[$i]['total_average'] = intval($objPage->arrResults[$i]['total'] / $objPage->arrResults[$i]['total_order']);
856            }
857        }
858    }
859}
860?>
Note: See TracBrowser for help on using the repository browser.