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

Revision 20129, 31.0 KB checked in by kimoto, 11 years ago (diff)

売上集計リファクタリング #962

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