source: branches/version-2_12-dev/data/class/pages/admin/total/LC_Page_Admin_Total.php @ 21693

Revision 21693, 32.3 KB checked in by h_yoshimoto, 12 years ago (diff)

#1692 フックポイント名を変更

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • 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-2011 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// {{{ requires
24require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php';
25
26/**
27 * 売上集計 のページクラス.
28 *
29 * @package Page
30 * @author LOCKON CO.,LTD.
31 * @version $Id$
32 */
33class LC_Page_Admin_Total extends LC_Page_Admin_Ex {
34
35    // }}}
36    // {{{ functions
37
38    /**
39     * Page を初期化する.
40     *
41     * @return void
42     */
43    function init() {
44        parent::init();
45        // GDライブラリのインストール判定
46        $this->install_GD = function_exists('gd_info') ? true : false;
47        $this->tpl_mainpage         = 'total/index.tpl';
48        $this->tpl_graphsubtitle    = 'total/subtitle.tpl';
49        $this->tpl_titleimage       = ROOT_URLPATH.'img/title/title_sale.jpg';
50        $this->tpl_maintitle = '売上集計';
51        $this->tpl_mainno           = 'total';
52
53        $masterData                 = new SC_DB_MasterData_Ex();
54        $this->arrWDAY              = $masterData->getMasterData('mtb_wday');
55        $this->arrSex               = $masterData->getMasterData('mtb_sex');
56        $this->arrJob               = $masterData->getMasterData('mtb_job');
57
58        // 登録・更新日検索用
59        $objDate                    = new SC_Date_Ex();
60        $objDate->setStartYear(RELEASE_YEAR);
61        $objDate->setEndYear(DATE('Y'));
62        $this->arrYear              = $objDate->getYear();
63        $this->arrMonth             = $objDate->getMonth();
64        $this->arrDay               = $objDate->getDay();
65
66        // ページタイトル todo あとでなおす
67        $this->arrTitle['']         = '期間別集計';
68        $this->arrTitle['term']     = '期間別集計';
69        $this->arrTitle['products'] = '商品別集計';
70        $this->arrTitle['age']      = '年代別集計';
71        $this->arrTitle['job']      = '職業別集計';
72        $this->arrTitle['member']   = '会員別集計';
73
74        // 月度集計のkey名
75        $this->arrSearchForm1       = array('search_startyear_m', 'search_startmonth_m');
76
77        // 期間別集計のkey名
78        $this->arrSearchForm2 = array(
79            'search_startyear',
80            'search_startmonth',
81            'search_startday',
82            'search_endyear',
83            'search_endmonth',
84            'search_endday',
85        );
86    }
87
88    /**
89     * Page のプロセス.
90     *
91     * @return void
92     */
93    function process() {
94        $this->action();
95        $this->sendResponse();
96    }
97
98    /**
99     * Page のアクション.
100     *
101     * @return void
102     */
103    function action() {
104        // フックポイント.
105        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg);
106        $objPlugin->doAction('LC_Page_Admin_Total_action_before', array($this));
107
108        if (isset($_GET['draw_image']) && $_GET['draw_image'] != '') {
109            define('DRAW_IMAGE' , true);
110        } else {
111            define('DRAW_IMAGE' , false);
112        }
113
114        // パラメーター管理クラス
115        $objFormParam = new SC_FormParam_Ex();
116        // パラメーター情報の初期化
117        $this->lfInitParam($objFormParam);
118        $objFormParam->setParam($_POST);
119        $objFormParam->setParam($_GET);
120
121        // 検索ワードの引き継ぎ
122        $this->arrHidden = $objFormParam->getSearchArray();
123
124        switch ($this->getMode()) {
125            case 'csv':
126            case 'search':
127
128                $this->arrErr = $this->lfCheckError($objFormParam);
129                if (empty($this->arrErr)) {
130
131                    // 日付
132                    list($sdate, $edate) = $this->lfSetStartEndDate($objFormParam);
133
134                    // ページ
135                    $page = ($objFormParam->getValue('page')) ? $objFormParam->getValue('page') : 'term';
136
137                    // 集計種類
138                    $type = ($objFormParam->getValue('type')) ? $objFormParam->getValue('type'): 'all';
139
140                    $this->tpl_page_type = 'total/page_'. $page .'.tpl';
141                    list($this->arrResults, $this->tpl_image) = call_user_func_array(array($this, 'lfGetOrder'.$page),
142                                                                                     array($type, $sdate, $edate));
143                    if ($this->getMode() == 'csv') {
144                        // CSV出力タイトル行の取得
145                        list($arrTitleCol, $arrDataCol) = $this->lfGetCSVColum($page);
146                        $head = SC_Utils_Ex::sfGetCSVList($arrTitleCol);
147                        $data = $this->lfGetDataColCSV($this->arrResults, $arrDataCol);
148
149                        // CSVを送信する。
150                        list($fime_name, $data) = SC_Utils_Ex::sfGetCSVData($head.$data);
151
152                        // フックポイント.
153                        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg);
154                        $objPlugin->doAction('LC_Page_Admin_Total_action_csv', array($this));
155
156                        $this->sendResponseCSV($fime_name, $data);
157                        exit;
158                    }
159                }
160                break;
161            default:
162                break;
163        }
164
165        // 画面宣しても日付が保存される
166        $_SESSION           = $this->lfSaveDateSession($_SESSION, $this->arrHidden);
167        $objFormParam->setParam($_SESSION['total']);
168        // 入力値の取得
169        $this->arrForm      = $objFormParam->getFormParamList();
170        $this->tpl_subtitle = $this->arrTitle[$objFormParam->getValue('page')];
171
172        // フックポイント.
173        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg);
174        $objPlugin->doAction('LC_Page_Admin_Total_action_after', array($this));
175    }
176
177    /**
178     * デストラクタ.
179     *
180     * @return void
181     */
182    function destroy() {
183        parent::destroy();
184    }
185
186    /* デフォルト値の取得 */
187    function lfGetDateDefault() {
188        $year = date('Y');
189        $month = date('m');
190        $day = date('d');
191
192        $list = isset($_SESSION['total']) ? $_SESSION['total'] : '';
193
194        // セッション情報に開始月度が保存されていない。
195        if (empty($_SESSION['total']['startyear_m'])) {
196            $list['startyear_m'] = $year;
197            $list['startmonth_m'] = $month;
198        }
199
200        // セッション情報に開始日付、終了日付が保存されていない。
201        if (empty($_SESSION['total']['startyear']) && empty($_SESSION['total']['endyear'])) {
202            $list['startyear'] = $year;
203            $list['startmonth'] = $month;
204            $list['startday'] = $day;
205            $list['endyear'] = $year;
206            $list['endmonth'] = $month;
207            $list['endday'] = $day;
208        }
209
210        return $list;
211    }
212
213    /* パラメーター情報の初期化 */
214    function lfInitParam(&$objFormParam) {
215        // デフォルト値の取得
216        $arrList = $this->lfGetDateDefault();
217
218        // 月度集計
219        $objFormParam->addParam('月度', 'search_startyear_m', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), $arrList['startyear_m']);
220        $objFormParam->addParam('月度', 'search_startmonth_m', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), $arrList['startmonth_m']);
221        // 期間集計
222        $objFormParam->addParam('開始日', 'search_startyear', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), $arrList['startyear']);
223        $objFormParam->addParam('開始日', 'search_startmonth', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), $arrList['startmonth']);
224        $objFormParam->addParam('開始日', 'search_startday', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), $arrList['startday']);
225        $objFormParam->addParam('終了日', 'search_endyear', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), $arrList['endyear']);
226        $objFormParam->addParam('終了日', 'search_endmonth', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), $arrList['endmonth']);
227        $objFormParam->addParam('終了日', 'search_endday', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), $arrList['endday']);
228
229        // hiddenデータの取得用
230        $objFormParam->addParam('', 'page');
231        $objFormParam->addParam('', 'type');
232        $objFormParam->addParam('', 'mode');
233        $objFormParam->addParam('', 'form');
234    }
235
236    /* 入力内容のチェック */
237    function lfCheckError(&$objFormParam) {
238
239        $objFormParam->convParam();
240        $objErr         = new SC_CheckError_Ex();
241        $objErr->arrErr = $objFormParam->checkError();
242
243        // 特殊項目チェック
244        if ($objFormParam->getValue('form') == 1) {
245            $objErr->doFunc(array('月度', 'search_startyear_m'), array('ONE_EXIST_CHECK'));
246        }
247
248        if ($objFormParam->getValue('form') == 2) {
249            $objErr->doFunc(array('期間', 'search_startyear', 'search_startmonth', 'search_startday', 'search_endyear', 'search_endmonth', 'search_endday'), array('FULL_EXIST_CHECK'));
250        }
251        $objErr->doFunc(array('月度', 'search_startyear_m', 'search_startmonth_m'), array('ALL_EXIST_CHECK'));
252        $objErr->doFunc(array('開始日', 'search_startyear', 'search_startmonth', 'search_startday'), array('CHECK_DATE'));
253        $objErr->doFunc(array('終了日', 'search_endyear', 'search_endmonth', 'search_endday'), array('CHECK_DATE'));
254        $objErr->doFunc(array('開始日', '終了日', 'search_startyear', 'search_startmonth', 'search_startday', 'search_endyear', 'search_endmonth', 'search_endday'), array('CHECK_SET_TERM'));
255        return $objErr->arrErr;
256    }
257
258    /* サブナビを移動しても日付が残るようにセッションに入力期間を記録する */
259    function lfSaveDateSession($session, $arrForm) {
260
261        // session の初期化をする
262        if (!isset($session['total'])) {
263            $session['total'] = $this->lfGetDateInit();
264        }
265
266        if (!empty($arrForm)) {
267            $session['total'] = array_merge($session['total'], $arrForm);
268        }
269
270        return $session;
271    }
272
273    /* 日付の初期値 */
274    function lfGetDateInit() {
275        $search_startyear_m     = $search_startyear  = $search_endyear  = date('Y');
276        $search_startmonth_m    = $search_startmonth = $search_endmonth = date('m');
277        $search_startday        = $search_endday     = date('d');
278
279        return compact($this->arrSearchForm1, $this->arrSearchForm2);
280    }
281
282    /* フォームで入力された日付を適切な形にする */
283    function lfSetStartEndDate(&$objFormParam) {
284
285        $arrRet = $objFormParam->getHashArray();
286
287        foreach ($arrRet as $key => $val) {
288            if ($val == '') {
289                continue;
290            }
291            switch ($key) {
292                case 'search_startyear':
293                    $sdate = $objFormParam->getValue('search_startyear') . '/' . $objFormParam->getValue('search_startmonth') . '/' . $objFormParam->getValue('search_startday');
294                    break;
295                case 'search_endyear':
296                    $edate = $objFormParam->getValue('search_endyear') . '/' . $objFormParam->getValue('search_endmonth') . '/' . $objFormParam->getValue('search_endday');
297                    break;
298                case 'search_startyear_m':
299                    list($sdate, $edate) = SC_Utils_Ex::sfTermMonth($objFormParam->getValue('search_startyear_m'),
300                                                                    $objFormParam->getValue('search_startmonth_m'),
301                                                                    CLOSE_DAY);
302                    break;
303                default:
304                    break;
305            }
306        }
307
308        return array($sdate, $edate);
309    }
310
311    /* 折れ線グラフの作成 */
312    function lfGetGraphLine($arrResults, $keyname, $type, $xtitle, $ytitle, $sdate, $edate, $xincline) {
313
314        $ret_path = '';
315
316        // 結果が0行以上ある場合のみグラフを生成する。
317        if (count($arrResults) > 0 && $this->install_GD) {
318
319            // グラフの生成
320            $arrList = SC_Utils_Ex::sfArrKeyValue($arrResults, $keyname, 'total');
321
322            // 一時ファイル名の取得
323            $pngname = $this->lfGetGraphPng($type);
324
325            $path = GRAPH_REALDIR . $pngname;
326
327            // ラベル表示インターバルを求める
328            $interval = intval(count($arrList) / 20);
329            if ($interval < 1) {
330                $interval = 1;
331            }
332            $objGraphLine = new SC_Graph_Line();
333
334            // 値のセット
335            $objGraphLine->setData($arrList);
336            $objGraphLine->setXLabel(array_keys($arrList));
337
338            // ラベル回転(日本語不可)
339            if ($xincline == true) {
340                $objGraphLine->setXLabelAngle(45);
341            }
342
343            // タイトルセット
344            $objGraphLine->setXTitle($xtitle);
345            $objGraphLine->setYTitle($ytitle);
346
347            // メインタイトル作成
348            list($sy, $sm, $sd) = preg_split('|[/ ]|' , $sdate);
349            list($ey, $em, $ed) = preg_split('|[/ ]|' , $edate);
350            $start_date = $sy . '年' . $sm . '月' . $sd . '日';
351            $end_date = $ey . '年' . $em . '月' . $ed . '日';
352            $objGraphLine->drawTitle('集計期間:' . $start_date . ' - ' . $end_date);
353
354            // グラフ描画
355            $objGraphLine->drawGraph();
356
357            // グラフの出力
358            if (DRAW_IMAGE) {
359                $objGraphLine->outputGraph();
360                exit();
361            }
362
363            // ファイルパスを返す
364            $ret_path = GRAPH_URLPATH . $pngname;
365        }
366        return $ret_path;
367    }
368
369    // 円グラフの作成
370    function lfGetGraphPie($arrResults, $keyname, $type, $title = '', $sdate = '', $edate = '') {
371
372        $ret_path = '';
373        // 結果が0行以上ある場合のみグラフを生成する。
374        if (count($arrResults) > 0 && $this->install_GD) {
375            // グラフの生成
376            $arrList = SC_Utils_Ex::sfArrKeyValue($arrResults, $keyname,
377                                                  'total', GRAPH_PIE_MAX,
378                                                  GRAPH_LABEL_MAX);
379
380            // 一時ファイル名の取得
381            $pngname = $this->lfGetGraphPng($type);
382            $path = GRAPH_REALDIR . $pngname;
383
384            $objGraphPie = new SC_Graph_Pie();
385
386            // データをセットする
387            $objGraphPie->setData($arrList);
388            // 凡例をセットする
389            $objGraphPie->setLegend(array_keys($arrList));
390
391            // メインタイトル作成
392            list($sy, $sm, $sd) = preg_split('|[/ ]|' , $sdate);
393            list($ey, $em, $ed) = preg_split('|[/ ]|' , $edate);
394            $start_date = $sy . '年' . $sm . '月' . $sd . '日';
395            $end_date = $ey . '年' . $em . '月' . $ed . '日';
396            $objGraphPie->drawTitle('集計期間:' . $start_date . ' - ' . $end_date);
397
398            // 円グラフ描画
399            $objGraphPie->drawGraph();
400
401            // グラフの出力
402            if (DRAW_IMAGE) {
403                $objGraphPie->outputGraph();
404                exit();
405            }
406
407            // ファイルパスを返す
408            $ret_path = GRAPH_URLPATH . $pngname;
409        }
410        return $ret_path;
411    }
412
413    // 棒グラフの作成
414    function lfGetGraphBar($arrResults, $keyname, $type, $xtitle, $ytitle, $sdate, $edate) {
415        $ret_path = '';
416
417        // 結果が0行以上ある場合のみグラフを生成する。
418        if (count($arrResults) > 0 && $this->install_GD) {
419            // グラフの生成
420            $arrList = SC_Utils_Ex::sfArrKeyValue($arrResults, $keyname, 'total', GRAPH_PIE_MAX, GRAPH_LABEL_MAX);
421
422            // 一時ファイル名の取得
423            $pngname = $this->lfGetGraphPng($type);
424            $path = GRAPH_REALDIR . $pngname;
425
426            $objGraphBar = new SC_Graph_Bar();
427
428            foreach (array_keys($arrList) as $val) {
429                $arrKey[] = ereg_replace('~', '-', $val);
430            }
431
432            // グラフ描画
433            $objGraphBar->setXLabel($arrKey);
434            $objGraphBar->setXTitle($xtitle);
435            $objGraphBar->setYTitle($ytitle);
436            $objGraphBar->setData($arrList);
437
438            // メインタイトル作成
439            $arrKey = array_keys($arrList);
440            list($sy, $sm, $sd) = preg_split('|[/ ]|' , $sdate);
441            list($ey, $em, $ed) = preg_split('|[/ ]|' , $edate);
442            $start_date = $sy . '年' . $sm . '月' . $sd . '日';
443            $end_date = $ey . '年' . $em . '月' . $ed . '日';
444            $objGraphBar->drawTitle('集計期間:' . $start_date . ' - ' . $end_date);
445
446            $objGraphBar->drawGraph();
447
448            if (DRAW_IMAGE) {
449                $objGraphBar->outputGraph();
450                exit();
451            }
452
453            // ファイルパスを返す
454            $ret_path = GRAPH_URLPATH . $pngname;
455        }
456        return $ret_path;
457    }
458
459    // グラフ用のPNGファイル名
460    function lfGetGraphPng($keyname) {
461
462        if ($_POST['search_startyear_m'] != '') {
463            $pngname = sprintf('%s_%02d%02d.png', $keyname, substr($_POST['search_startyear_m'],2), $_POST['search_startmonth_m']);
464        } else {
465            $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']);
466        }
467        return $pngname;
468    }
469
470    // 会員、非会員集計のWHERE分の作成
471    function lfGetWhereMember($col_date, $sdate, $edate, $type, $col_member = 'customer_id') {
472        $where = '';
473        // 取得日付の指定
474        if ($sdate != '') {
475            if ($where != '') {
476                $where.= ' AND ';
477            }
478            $where.= " $col_date >= '". $sdate ."'";
479        }
480
481        if ($edate != '') {
482            if ($where != '') {
483                $where.= ' AND ';
484            }
485            $edate = date('Y/m/d',strtotime('1 day' ,strtotime($edate)));
486            $where.= " $col_date < date('" . $edate ."')";
487        }
488
489        // 会員、非会員の判定
490        switch ($type) {
491            // 全体
492            case 'all':
493                break;
494            case 'member':
495                if ($where != '') {
496                    $where.= ' AND ';
497                }
498                $where.= " $col_member <> 0";
499                break;
500            case 'nonmember':
501                if ($where != '') {
502                    $where.= ' AND ';
503                }
504                $where.= " $col_member = 0";
505                break;
506            default:
507                break;
508        }
509
510        return array($where, array());
511    }
512
513    /** 会員別集計 **/
514    function lfGetOrderMember($type, $sdate, $edate) {
515        $objQuery = SC_Query_Ex::getSingletonInstance();
516
517        list($where, $arrWhereVal) = $this->lfGetWhereMember('create_date', $sdate, $edate, $type);
518        $where .= ' AND del_flg = 0 AND status <> ?';
519        $arrWhereVal[] = ORDER_CANCEL;
520
521        // 会員集計の取得
522        $col = <<< __EOS__
523            COUNT(order_id) AS order_count,
524            SUM(total) AS total,
525            AVG(total) AS total_average,
526            CASE
527                WHEN customer_id <> 0 THEN 1
528                ELSE 0
529            END AS member,
530            order_sex
531__EOS__;
532
533        $from       = 'dtb_order';
534
535        $objQuery->setGroupBy('member, order_sex');
536
537        $arrTotalResults = $objQuery->select($col, $from, $where, $arrWhereVal);
538
539        foreach (array_keys($arrTotalResults) as $key) {
540            $arrResult =& $arrTotalResults[$key];
541            $member_key = $arrResult['order_sex'];
542            if ($member_key != '') {
543                $arrResult['member_name'] = (($arrResult['member']) ? '会員' : '非会員') . $this->arrSex[$member_key];
544            } else {
545                $arrResult['member_name'] = '未回答';
546            }
547        }
548
549        $tpl_image = $this->lfGetGraphPie($arrTotalResults, 'member_name', 'member', '(売上比率)', $sdate, $edate);
550
551        return array($arrTotalResults, $tpl_image);
552    }
553
554    /** 商品別集計 **/
555    function lfGetOrderProducts($type, $sdate, $edate) {
556        $objQuery = SC_Query_Ex::getSingletonInstance();
557
558        list($where, $arrWhereVal) = $this->lfGetWhereMember('create_date', $sdate, $edate, $type);
559
560        $where .= ' AND dtb_order.del_flg = 0 AND dtb_order.status <> ?';
561        $arrWhereVal[] = ORDER_CANCEL;
562
563        $col = <<< __EOS__
564                product_id,
565                product_code,
566                product_name,
567                SUM(quantity) AS products_count,
568                COUNT(order_id) AS order_count,
569                price,
570                (price * SUM(quantity)) AS total
571__EOS__;
572
573        $from = 'dtb_order_detail JOIN dtb_order USING(order_id)';
574
575        /*
576        if ($mode != 'csv') {
577            $sql.= 'LIMIT ' . PRODUCTS_TOTAL_MAX;
578        }*/
579
580        // 要index
581        $objQuery->setGroupBy('product_id, product_name, product_code, price');
582        //$objQuery->setGroupBy('product_id');
583        $objQuery->setOrder('total DESC');
584        $arrTotalResults = $objQuery->select($col, $from, $where, $arrWhereVal);
585
586        $tpl_image  = $this->lfGetGraphPie($arrTotalResults, 'product_name', 'products_' . $type, '(売上比率)', $sdate, $edate);
587
588        return array($arrTotalResults, $tpl_image);
589    }
590
591    /** 職業別集計 **/
592    function lfGetOrderJob($type, $sdate, $edate) {
593        $objQuery = SC_Query_Ex::getSingletonInstance();
594        list($where, $arrWhereVal) = $this->lfGetWhereMember('dtb_order.create_date', $sdate, $edate, $type);
595
596        $col = <<< __EOS__
597            job,
598            COUNT(order_id) AS order_count,
599            SUM(total) AS total,
600            AVG(total) AS total_average
601__EOS__;
602
603        $from   = 'dtb_order JOIN dtb_customer USING ( customer_id)';
604
605        $where .= ' AND dtb_order.del_flg = 0 AND dtb_order.status <> ?';
606        $arrWhereVal[] = ORDER_CANCEL;
607
608        $objQuery->setGroupBy('job');
609        $objQuery->setOrder('total DESC');
610        $arrTotalResults = $objQuery->select($col, $from, $where, $arrWhereVal);
611
612        foreach (array_keys($arrTotalResults) as $key) {
613            $arrResult =& $arrTotalResults[$key];
614            $job_key = $arrResult['job'];
615            if ($job_key != '') {
616                $arrResult['job_name'] = $this->arrJob[$job_key];
617            } else {
618                $arrResult['job_name'] = '未回答';
619            }
620
621        }
622        $tpl_image     = $this->lfGetGraphPie($arrTotalResults, 'job_name', 'job_' . $type, '(売上比率)', $sdate, $edate);
623
624        return array($arrTotalResults, $tpl_image);
625    }
626
627    /** 年代別集計 **/
628    function lfGetOrderAge($type, $sdate, $edate) {
629
630        $objQuery = SC_Query_Ex::getSingletonInstance();
631
632        list($where, $arrWhereVal) = $this->lfGetWhereMember('create_date', $sdate, $edate, $type);
633
634        $dbFactory = SC_DB_DBFactory_Ex::getInstance();
635        $col = $dbFactory->getOrderTotalAgeColSql() . ' AS age';
636        $col .= ',COUNT(order_id) AS order_count';
637        $col .= ',SUM(total) AS total';
638        $col .= ',AVG(total) AS total_average';
639
640        $from   = 'dtb_order';
641
642        $where .= ' AND del_flg = 0 AND status <> ?';
643        $arrWhereVal[] = ORDER_CANCEL;
644
645        $objQuery->setGroupBy('age');
646        $objQuery->setOrder('age DESC');
647        $arrTotalResults = $objQuery->select($col, $from, $where, $arrWhereVal);
648
649        foreach (array_keys($arrTotalResults) as $key) {
650            $arrResult =& $arrTotalResults[$key];
651            $age_key = $arrResult['age'];
652            if ($age_key != '') {
653                $arrResult['age_name'] = $arrResult['age'] . '代';
654            } else {
655                $arrResult['age_name'] = '未回答';
656            }
657
658        }
659        $tpl_image = $this->lfGetGraphBar($arrTotalResults, 'age_name', 'age_' . $type, '(年齢)', '(売上合計)', $sdate, $edate);
660
661        return array($arrTotalResults, $tpl_image);
662    }
663
664    /** 期間別集計 **/
665    // todo あいだの日付埋める
666    function lfGetOrderTerm($type, $sdate, $edate) {
667        $objQuery   = SC_Query_Ex::getSingletonInstance();
668
669        list($where, $arrWhereVal) = $this->lfGetWhereMember('create_date', $sdate, $edate);
670        $where .= ' AND del_flg = 0 AND status <> ?';
671        $arrWhereVal[] = ORDER_CANCEL;
672
673        switch ($type) {
674            case 'month':
675                $xtitle = '(月別)';
676                $ytitle = '(売上合計)';
677                $format = '%m';
678                break;
679            case 'year':
680                $xtitle = '(年別)';
681                $ytitle = '(売上合計)';
682                $format = '%Y';
683                break;
684            case 'wday':
685                $xtitle = '(曜日別)';
686                $ytitle = '(売上合計)';
687                $format = '%a';
688                break;
689            case 'hour':
690                $xtitle = '(時間別)';
691                $ytitle = '(売上合計)';
692                $format = '%H';
693                break;
694            default:
695                $xtitle = '(日別)';
696                $ytitle = '(売上合計)';
697                $format = '%Y-%m-%d';
698                $xincline = true;
699                break;
700        }
701
702        $dbFactory = SC_DB_DBFactory_Ex::getInstance();
703        // todo postgres
704        $col = $dbFactory->getOrderTotalDaysWhereSql($type);
705
706        $objQuery->setGroupBy('str_date');
707        $objQuery->setOrder('str_date');
708        // 検索結果の取得
709        $arrTotalResults = $objQuery->select($col, 'dtb_order', $where, $arrWhereVal);
710
711        $arrTotalResults = $this->lfAddBlankLine($arrTotalResults, $type, $sdate, $edate);
712        // todo GDない場合の処理
713        $tpl_image       = $this->lfGetGraphLine($arrTotalResults, 'str_date', 'term_' . $type, $xtitle, $ytitle, $sdate, $edate, $xincline);
714        $arrTotalResults = $this->lfAddTotalLine($arrTotalResults);
715
716        return array($arrTotalResults, $tpl_image);
717    }
718
719    /*
720     * 期間中の日付を埋める
721     */
722    function lfAddBlankLine($arrResults, $type, $st, $ed) {
723
724        $arrDateList = $this->lfDateTimeArray($type, $st, $ed);
725
726        foreach ($arrResults as $arrResult) {
727            $strdate                = $arrResult['str_date'];
728            $arrDateResults[$strdate] = $arrResult;
729        }
730
731        foreach ($arrDateList as $date) {
732
733            if (array_key_exists($date, $arrDateResults)) {
734
735                $arrRet[] = $arrDateResults[$date];
736
737            } else {
738                $arrRet[]['str_date'] = $date;
739            }
740        }
741        return $arrRet;
742    }
743
744    /*
745     * 日付の配列を作成する
746     *
747     */
748    function lfDateTimeArray($type, $st, $ed) {
749        switch ($type) {
750            case 'month':
751                $format        = 'm';
752                break;
753            case 'year':
754                $format        = 'Y';
755                break;
756            case 'wday':
757                $format        = 'D';
758                break;
759            case 'hour':
760                $format        = 'H';
761                break;
762            default:
763                $format        = 'Y-m-d';
764                break;
765        }
766
767        if ($type == 'hour') {
768            $arrDateList = array('00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23');
769
770        } else {
771            $arrDateList = array();
772            $tmp    = strtotime($st);
773            $nAday  = 60*60*24;
774            $edx    = strtotime($ed);
775            while ($tmp <= $edx) {
776                $sDate = date($format, $tmp);
777                if (!in_array($sDate, $arrDateList)) {
778                    $arrDateList[] = $sDate;
779                }
780                $tmp += $nAday;
781            }
782        }
783        return $arrDateList;
784    }
785
786    /*
787     * 合計を付与する
788     */
789    function lfAddTotalLine($arrResults) {
790        // 検索結果が0でない場合
791        if (count($arrResults) > 0) {
792
793            // 合計の計算
794            foreach ($arrResults as $arrResult) {
795                foreach (array_keys($arrResult) as $value) {
796                    $arrTotal[$value] += $arrResult[$value];
797                }
798            }
799            // 平均値の計算
800            $arrTotal['total_average'] = $arrTotal['total'] / $arrTotal['total_order'];
801            $arrResults[] = $arrTotal;
802        }
803
804        return $arrResults;
805    }
806
807    // 必要なカラムのみ抽出する(CSVデータで取得する)
808    function lfGetDataColCSV($arrData, $arrDataCol) {
809        $max = count($arrData);
810        $csv_data = '';
811        for ($i = 0; $i < $max; $i++) {
812            foreach ($arrDataCol as $val) {
813                $arrRet[$i][$val] = $arrData[$i][$val];
814            }
815            $csv_data.= SC_Utils_Ex::sfGetCSVList($arrRet[$i]);
816        }
817        return $csv_data;
818    }
819
820    function lfGetCSVColum($page) {
821        switch ($page) {
822            // 商品別集計
823            case 'products':
824                $arrTitleCol = array(
825                    '商品コード',
826                    '商品名',
827                    '購入件数',
828                    '数量',
829                    '単価',
830                    '金額',
831                );
832                $arrDataCol = array(
833                    'product_code',
834                    'product_name',
835                    'order_count',
836                    'products_count',
837                    'price',
838                    'total',
839                );
840                break;
841            // 職業別集計
842            case 'job':
843                $arrTitleCol = array(
844                    '職業',
845                    '購入件数',
846                    '購入合計',
847                    '購入平均',
848                );
849                $arrDataCol = array(
850                    'job_name',
851                    'order_count',
852                    'total',
853                    'total_average',
854                );
855                break;
856            // 会員別集計
857            case 'member':
858                $arrTitleCol = array(
859                    '会員',
860                    '購入件数',
861                    '購入合計',
862                    '購入平均',
863                );
864                $arrDataCol = array(
865                    'member_name',
866                    'order_count',
867                    'total',
868                    'total_average',
869                );
870                break;
871            // 年代別集計
872            case 'age':
873                $arrTitleCol = array(
874                    '年齢',
875                    '購入件数',
876                    '購入合計',
877                    '購入平均',
878                );
879                $arrDataCol = array(
880                    'age_name',
881                    'order_count',
882                    'total',
883                    'total_average',
884                );
885                break;
886            // 期間別集計
887            default:
888                $arrTitleCol = array(
889                    '期間',
890                    '購入件数',
891                    '男性',
892                    '女性',
893                    '男性(会員)',
894                    '男性(非会員)',
895                    '女性(会員)',
896                    '女性(非会員)',
897                    '購入合計',
898                    '購入平均',
899                );
900                $arrDataCol = array(
901                    'str_date',
902                    'total_order',
903                    'men',
904                    'women',
905                    'men_member',
906                    'men_nonmember',
907                    'women_member',
908                    'women_nonmember',
909                    'total',
910                    'total_average',
911                );
912                break;
913        }
914
915        return array($arrTitleCol, $arrDataCol);
916    }
917}
Note: See TracBrowser for help on using the repository browser.