source: branches/camp/camp-2_13-tax/data/class/SC_Product.php @ 22626

Revision 22626, 29.9 KB checked in by AMUAMU, 11 years ago (diff)

商品詳細の表示のみはdtb_tax_ruleに従うように。

  • 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-2013 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24/**
25 * 商品を扱うサービスクラス.
26 *
27 * @author LOCKON CO.,LTD.
28 * @author Kentaro Ohkouchi
29 * @version $Id$
30 */
31class SC_Product
32{
33
34    /** 規格名一覧 */
35    var $arrClassName;
36    /** 規格分類名一覧 */
37    var $arrClassCatName;
38    /** このプロパティが保持する price01 及び price02 は、税金付与した金額である。 */
39    var $classCategories = array();
40    var $stock_find;
41    /** 規格1クラス名 */
42    var $className1 = '';
43    /** 規格2クラス名 */
44    var $className2 = '';
45    /** 規格1が設定されている */
46    var $classCat1_find;
47    /** 規格2が設定されている */
48    var $classCat2_find;
49    var $classCats1;
50    /** 検索用並び替え条件配列 */
51    var $arrOrderData;
52
53    /**
54     * 商品検索結果の並び順を指定する。
55     *
56     * ただし指定できるテーブルはproduct_idを持っているテーブルであることが必要.
57     *
58     * @param string $col 並び替えの基準とするフィールド
59     * @param string $table 並び替えの基準とするフィールドがあるテーブル
60     * @param string $order 並び替えの順序 ASC / DESC
61     * @return void
62     */
63    function setProductsOrder($col, $table = 'dtb_products', $order = 'ASC')
64    {
65        $this->arrOrderData = array('col' => $col, 'table' => $table, 'order' => $order);
66    }
67
68    /**
69     * SC_Queryインスタンスに設定された検索条件を元に並び替え済みの検索結果商品IDの配列を取得する。
70     *
71     * 検索条件は, SC_Query::setWhere() 関数で設定しておく必要があります.
72     *
73     * @param SC_Query $objQuery SC_Query インスタンス
74     * @param array $arrVal 検索パラメーターの配列
75     * @return array 商品IDの配列
76     */
77    function findProductIdsOrder(&$objQuery, $arrVal = array())
78    {
79        $table = 'dtb_products AS alldtl';
80
81        $objQuery->setGroupBy('alldtl.product_id');
82        if (is_array($this->arrOrderData) and $objQuery->order == '') {
83            $o_col = $this->arrOrderData['col'];
84            $o_table = $this->arrOrderData['table'];
85            $o_order = $this->arrOrderData['order'];
86            $order = <<< __EOS__
87                    (
88                        SELECT $o_col
89                        FROM
90                            $o_table as T2
91                        WHERE T2.product_id = alldtl.product_id
92                        ORDER BY T2.$o_col $o_order
93                        LIMIT 1
94                    ) $o_order, product_id
95__EOS__;
96            $objQuery->setOrder($order);
97        }
98        $arrReturn = $objQuery->getCol('alldtl.product_id', $table, '', $arrVal);
99
100        return $arrReturn;
101    }
102
103    /**
104     * SC_Queryインスタンスに設定された検索条件をもとに対象商品数を取得する.
105     *
106     * 検索条件は, SC_Query::setWhere() 関数で設定しておく必要があります.
107     *
108     * @param SC_Query $objQuery SC_Query インスタンス
109     * @param array $arrVal 検索パラメーターの配列
110     * @return array 対象商品ID数
111     */
112    function findProductCount(&$objQuery, $arrVal = array())
113    {
114        $table = 'dtb_products AS alldtl';
115
116        return $objQuery->count($table, '', $arrVal);
117    }
118
119    /**
120     * SC_Queryインスタンスに設定された検索条件をもとに商品一覧の配列を取得する.
121     *
122     * 主に SC_Product::findProductIds() で取得した商品IDを検索条件にし,
123     * SC_Query::setOrder() や SC_Query::setLimitOffset() を設定して, 商品一覧
124     * の配列を取得する.
125     *
126     * @param SC_Query $objQuery SC_Query インスタンス
127     * @return array 商品一覧の配列
128     */
129    function lists(&$objQuery)
130    {
131        $col = <<< __EOS__
132             product_id
133            ,product_code_min
134            ,product_code_max
135            ,name
136            ,comment1
137            ,comment2
138            ,comment3
139            ,main_list_comment
140            ,main_image
141            ,main_list_image
142            ,price01_min
143            ,price01_max
144            ,price02_min
145            ,price02_max
146            ,stock_min
147            ,stock_max
148            ,stock_unlimited_min
149            ,stock_unlimited_max
150            ,deliv_date_id
151            ,status
152            ,del_flg
153            ,update_date
154__EOS__;
155        $res = $objQuery->select($col, $this->alldtlSQL());
156
157        return $res;
158    }
159
160
161    /**
162     * 商品IDを指定し、商品一覧を取得する
163     *
164     * SC_Query::setOrder() や SC_Query::setLimitOffset() を設定して, 商品一覧
165     * の配列を取得する.
166     * FIXME: 呼び出し元で設定した、SC_Query::setWhere() も有効に扱いたい。
167     *
168     * @param SC_Query $objQuery SC_Query インスタンス
169     * @param array $arrProductId 商品ID
170     * @return array 商品一覧の配列 (キー: 商品ID)
171     */
172    function getListByProductIds(&$objQuery, $arrProductId = array())
173    {
174        if (empty($arrProductId)) {
175            return array();
176        }
177
178        $where = 'alldtl.product_id IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', count($arrProductId)) . ')';
179        $where .= ' AND alldtl.del_flg = 0';
180
181        $objQuery->setWhere($where, $arrProductId);
182        $arrProducts = $this->lists($objQuery);
183
184        // 配列のキーを商品IDに
185        $arrProducts = SC_Utils_Ex::makeArrayIDToKey('product_id', $arrProducts);
186
187        // SC_Query::setOrder() の指定がない場合、$arrProductId で指定された商品IDの順に配列要素を並び替え
188        if (strlen($objQuery->order) === 0) {
189            $arrTmp = array();
190            foreach ($arrProductId as $product_id) {
191                $arrTmp[$product_id] = $arrProducts[$product_id];
192            }
193            $arrProducts =& $arrTmp;
194            unset($arrTmp);
195        }
196
197        // 税込金額を設定する
198        SC_Product_Ex::setIncTaxToProducts($arrProducts);
199
200        return $arrProducts;
201    }
202
203    /**
204     * 商品詳細を取得する.
205     *
206     * @param integer $productId 商品ID
207     * @return array 商品詳細情報の配列
208     */
209    function getDetail($productId)
210    {
211        $objQuery =& SC_Query_Ex::getSingletonInstance();
212        $arrProduct = $objQuery->getRow('*', $this->alldtlSQL('product_id = ?'),
213                                    'product_id = ?',
214                                    array($productId, $productId));
215        $arrProduct = (array)$arrProduct;
216
217        // 税込金額を設定する
218        SC_Product_Ex::setIncTaxToProduct($arrProduct);
219
220        return $arrProduct;
221    }
222
223    /**
224     * 商品詳細情報と商品規格を取得する.
225     *
226     * @param integer $productClassId 商品規格ID
227     * @return array 商品詳細情報と商品規格の配列
228     */
229    function getDetailAndProductsClass($productClassId)
230    {
231        $result = $this->getProductsClass($productClassId);
232        $result = array_merge($result, $this->getDetail($result['product_id']));
233
234        return $result;
235    }
236
237    /**
238     * 商品IDに紐づく商品規格を自分自身に設定する.
239     *
240     * 引数の商品IDの配列に紐づく商品規格を取得し, 自分自身のフィールドに
241     * 設定する.
242     *
243     * @param array $arrProductId 商品ID の配列
244     * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
245     * @return void
246     */
247    function setProductsClassByProductIds($arrProductId, $has_deleted = false)
248    {
249
250        foreach ($arrProductId as $productId) {
251            $arrProductClasses = $this->getProductsClassFullByProductId($productId, $has_deleted);
252
253            $classCats1 = array();
254            $classCats1['__unselected'] = '選択してください';
255
256            // 規格1クラス名
257            $this->className1[$productId] =
258                isset($arrProductClasses[0]['class_name1'])
259                ? $arrProductClasses[0]['class_name1']
260                : '';
261
262            // 規格2クラス名
263            $this->className2[$productId] =
264                isset($arrProductClasses[0]['class_name2'])
265                ? $arrProductClasses[0]['class_name2']
266                : '';
267
268            // 規格1が設定されている
269            $this->classCat1_find[$productId] = $arrProductClasses[0]['classcategory_id1'] > 0; // 要変更ただし、他にも改修が必要となる
270            // 規格2が設定されている
271            $this->classCat2_find[$productId] = $arrProductClasses[0]['classcategory_id2'] > 0; // 要変更ただし、他にも改修が必要となる
272
273            $this->stock_find[$productId] = false;
274            $classCategories = array();
275            $classCategories['__unselected']['__unselected']['name'] = '選択してください';
276            $classCategories['__unselected']['__unselected']['product_class_id'] = $arrProductClasses[0]['product_class_id'];
277            // 商品種別
278            $classCategories['__unselected']['__unselected']['product_type'] = $arrProductClasses[0]['product_type_id'];
279            $this->product_class_id[$productId] = $arrProductClasses[0]['product_class_id'];
280            // 商品種別
281            $this->product_type[$productId] = $arrProductClasses[0]['product_type_id'];
282            foreach ($arrProductClasses as $arrProductsClass) {
283                $arrClassCats2 = array();
284                $classcategory_id1 = $arrProductsClass['classcategory_id1'];
285                $classcategory_id2 = $arrProductsClass['classcategory_id2'];
286                // 在庫
287                $stock_find_class = ($arrProductsClass['stock_unlimited'] || $arrProductsClass['stock'] > 0);
288
289                $arrClassCats2['classcategory_id2'] = $classcategory_id2;
290                $arrClassCats2['name'] = $arrProductsClass['classcategory_name2'] . ($stock_find_class ? '' : ' (品切れ中)');
291
292                $arrClassCats2['stock_find'] = $stock_find_class;
293
294                if ($stock_find_class) {
295                    $this->stock_find[$productId] = true;
296                }
297
298                if (!in_array($classcat_id1, $classCats1)) {
299                    $classCats1[$classcategory_id1] = $arrProductsClass['classcategory_name1']
300                        . ($classcategory_id2 == 0 && !$stock_find_class ? ' (品切れ中)' : '');
301                }
302
303                // 価格
304                $arrClassCats2['price01']
305                    = strlen($arrProductsClass['price01'])
306                    ? number_format(SC_Helper_TaxRule_Ex::sfCalcIncTax($arrProductsClass['price01'], $productId, $arrProductsClass['product_class_id']))
307                    : '';
308
309                $arrClassCats2['price02']
310                    = strlen($arrProductsClass['price02'])
311                    ? number_format(SC_Helper_TaxRule_Ex::sfCalcIncTax($arrProductsClass['price02'], $productId, $arrProductsClass['product_class_id']))
312                    : '';
313
314                // ポイント
315                $arrClassCats2['point']
316                    = number_format(SC_Utils_Ex::sfPrePoint($arrProductsClass['price02'], $arrProductsClass['point_rate']));
317
318                // 商品コード
319                $arrClassCats2['product_code'] = $arrProductsClass['product_code'];
320                // 商品規格ID
321                $arrClassCats2['product_class_id'] = $arrProductsClass['product_class_id'];
322                // 商品種別
323                $arrClassCats2['product_type'] = $arrProductsClass['product_type_id'];
324
325                // #929(GC8 規格のプルダウン順序表示不具合)対応のため、2次キーは「#」を前置
326                if (!$this->classCat1_find[$productId]) {
327                    $classcategory_id1 = '__unselected2';
328                }
329                $classCategories[$classcategory_id1]['#'] = array(
330                    'classcategory_id2' => '',
331                    'name' => '選択してください',
332                );
333                $classCategories[$classcategory_id1]['#' . $classcategory_id2] = $arrClassCats2;
334            }
335
336            $this->classCategories[$productId] = $classCategories;
337
338            // 規格1
339            $this->classCats1[$productId] = $classCats1;
340        }
341    }
342
343    /**
344     * SC_Query インスタンスに設定された検索条件を使用して商品規格を取得する.
345     *
346     * @param SC_Query $objQuery SC_Queryインスタンス
347     * @param array $params 検索パラメーターの配列
348     * @return array 商品規格の配列
349     */
350    function getProductsClassByQuery(&$objQuery, $params)
351    {
352        // 末端の規格を取得
353        $col = <<< __EOS__
354            T1.product_id,
355            T1.stock,
356            T1.stock_unlimited,
357            T1.sale_limit,
358            T1.price01,
359            T1.price02,
360            T1.point_rate,
361            T1.product_code,
362            T1.product_class_id,
363            T1.del_flg,
364            T1.product_type_id,
365            T1.down_filename,
366            T1.down_realfilename,
367            T3.name AS classcategory_name1,
368            T3.rank AS rank1,
369            T4.name AS class_name1,
370            T4.class_id AS class_id1,
371            T1.classcategory_id1,
372            T1.classcategory_id2,
373            dtb_classcategory2.name AS classcategory_name2,
374            dtb_classcategory2.rank AS rank2,
375            dtb_class2.name AS class_name2,
376            dtb_class2.class_id AS class_id2
377__EOS__;
378        $table = <<< __EOS__
379            dtb_products_class T1
380            LEFT JOIN dtb_classcategory T3
381                ON T1.classcategory_id1 = T3.classcategory_id
382            LEFT JOIN dtb_class T4
383                ON T3.class_id = T4.class_id
384            LEFT JOIN dtb_classcategory dtb_classcategory2
385                ON T1.classcategory_id2 = dtb_classcategory2.classcategory_id
386            LEFT JOIN dtb_class dtb_class2
387                ON dtb_classcategory2.class_id = dtb_class2.class_id
388__EOS__;
389
390        $objQuery->setOrder('T3.rank DESC, dtb_classcategory2.rank DESC'); // XXX
391        $arrRet = $objQuery->select($col, $table, '', $params);
392
393        return $arrRet;
394    }
395
396    /**
397     * 商品規格IDから商品規格を取得する.
398     *
399     * 削除された商品規格は取得しない.
400     *
401     * @param integer $productClassId 商品規格ID
402     * @return array 商品規格の配列
403     */
404    function getProductsClass($productClassId)
405    {
406        $objQuery =& SC_Query_Ex::getSingletonInstance();
407        $objQuery->setWhere('product_class_id = ? AND T1.del_flg = 0');
408        $arrRes = $this->getProductsClassByQuery($objQuery, $productClassId);
409
410        return (array)$arrRes[0];
411    }
412
413    /**
414     * 複数の商品IDに紐づいた, 商品規格を取得する.
415     *
416     * @param array $productIds 商品IDの配列
417     * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
418     * @return array 商品規格の配列
419     */
420    function getProductsClassByProductIds($productIds = array(), $has_deleted = false)
421    {
422        if (empty($productIds)) {
423            return array();
424        }
425        $objQuery =& SC_Query_Ex::getSingletonInstance();
426        $where = 'product_id IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', count($productIds)) . ')';
427        if (!$has_deleted) {
428            $where .= ' AND T1.del_flg = 0';
429        }
430        $objQuery->setWhere($where);
431
432        return $this->getProductsClassByQuery($objQuery, $productIds);
433    }
434
435    /**
436     * 商品IDに紐づいた, 商品規格をすべての組み合わせごとに取得する.
437     *
438     * @param array $productId 商品ID
439     * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
440     * @return array すべての組み合わせの商品規格の配列
441     */
442    function getProductsClassFullByProductId($productId, $has_deleted = false)
443    {
444        $arrRet = $this->getProductsClassByProductIds(array($productId), $has_deleted);
445
446        return $arrRet;
447    }
448
449    /**
450     * 商品IDをキーにした, 商品ステータスIDの配列を取得する.
451     *
452     * @param array 商品ID の配列
453     * @return array 商品IDをキーにした商品ステータスIDの配列
454     */
455    function getProductStatus($productIds)
456    {
457        if (empty($productIds)) {
458            return array();
459        }
460        $objQuery =& SC_Query_Ex::getSingletonInstance();
461        $cols = 'product_id, product_status_id';
462        $from = 'dtb_product_status';
463        $where = 'del_flg = 0 AND product_id IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', count($productIds)) . ')';
464        $productStatus = $objQuery->select($cols, $from, $where, $productIds);
465        $results = array();
466        foreach ($productStatus as $status) {
467            $results[$status['product_id']][] = $status['product_status_id'];
468        }
469
470        return $results;
471    }
472
473    /**
474     * 商品ステータスを設定する.
475     *
476     * TODO 現在は DELETE/INSERT だが, UPDATE を検討する.
477     *
478     * @param integer $productId 商品ID
479     * @param array $productStatusIds ON にする商品ステータスIDの配列
480     */
481    function setProductStatus($productId, $productStatusIds)
482    {
483
484        $val['product_id'] = $productId;
485        $val['creator_id'] = $_SESSION['member_id'];
486        $val['create_date'] = 'CURRENT_TIMESTAMP';
487        $val['update_date'] = 'CURRENT_TIMESTAMP';
488        $val['del_flg'] = '0';
489
490        $objQuery =& SC_Query_Ex::getSingletonInstance();
491        $objQuery->delete('dtb_product_status', 'product_id = ?', array($productId));
492        foreach ($productStatusIds as $productStatusId) {
493            if ($productStatusId == '') continue;
494            $val['product_status_id'] = $productStatusId;
495            $objQuery->insert('dtb_product_status', $val);
496        }
497    }
498
499    /**
500     * 商品詳細の結果から, 販売制限数を取得する.
501     *
502     * getDetailAndProductsClass() の結果から, 販売制限数を取得する.
503     *
504     * @param array $p 商品詳細の検索結果の配列
505     * @return integer 商品詳細の結果から求めた販売制限数.
506     * @see getDetailAndProductsClass()
507     */
508    function getBuyLimit($p)
509    {
510        $limit = null;
511        if ($p['stock_unlimited'] != '1' && is_numeric($p['sale_limit'])) {
512            $limit = min($p['sale_limit'], $p['stock']);
513        } elseif (is_numeric($p['sale_limit'])) {
514            $limit = $p['sale_limit'];
515        } elseif ($p['stock_unlimited'] != '1') {
516            $limit = $p['stock'];
517        }
518
519        return $limit;
520    }
521
522    /**
523     * 在庫を減少させる.
524     *
525     * 指定の在庫数まで, 在庫を減少させる.
526     * 減少させた結果, 在庫数が 0 未満になった場合, 引数 $quantity が 0 の場合は,
527     * 在庫の減少を中止し, false を返す.
528     * 在庫の減少に成功した場合は true を返す.
529     *
530     * @param integer $productClassId 商品規格ID
531     * @param integer $quantity 減少させる在庫数
532     * @return boolean 在庫の減少に成功した場合 true; 失敗した場合 false
533     */
534    function reduceStock($productClassId, $quantity)
535    {
536
537        if ($quantity == 0) {
538            return false;
539        }
540
541        $objQuery =& SC_Query_Ex::getSingletonInstance();
542        $objQuery->update('dtb_products_class', array(),
543                          'product_class_id = ?', array($productClassId),
544                          array('stock' => 'stock - ?'), array($quantity));
545        // TODO エラーハンドリング
546
547        $productsClass = $this->getDetailAndProductsClass($productClassId);
548        if ($productsClass['stock_unlimited'] != '1' && $productsClass['stock'] < 0) {
549            return false;
550        }
551
552        return true;
553    }
554
555    /**
556     * 商品情報の配列に, 税込金額を設定して返す.
557     *
558     * この関数は, 主にスマートフォンで使用します.
559     *
560     * @param array $arrProducts 商品情報の配列
561     * @return array 旧バージョン互換用のデータ
562     */
563    static function setPriceTaxTo(&$arrProducts)
564    {
565        foreach ($arrProducts as &$arrProduct) {
566            $arrProduct['price01_min_format'] = number_format($arrProduct['price01_min']);
567            $arrProduct['price01_max_format'] = number_format($arrProduct['price01_max']);
568            $arrProduct['price02_min_format'] = number_format($arrProduct['price02_min']);
569            $arrProduct['price02_max_format'] = number_format($arrProduct['price02_max']);
570
571            SC_Product_Ex::setIncTaxToProduct($arrProduct);
572
573            $arrProduct['price01_min_inctax_format'] = number_format($arrProduct['price01_min_inctax']);
574            $arrProduct['price01_max_inctax_format'] = number_format($arrProduct['price01_max_inctax']);
575            $arrProduct['price02_min_inctax_format'] = number_format($arrProduct['price02_min_inctax']);
576            $arrProduct['price02_max_inctax_format'] = number_format($arrProduct['price02_max_inctax']);
577
578            // @deprecated 2.12.4
579            // 旧バージョン互換用
580            // 本来は、税額の代入で使用すべきキー名。
581            $arrProduct['price01_min_tax_format'] =& $arrProduct['price01_min_inctax_format'];
582            $arrProduct['price01_max_tax_format'] =& $arrProduct['price01_max_inctax_format'];
583            $arrProduct['price02_min_tax_format'] =& $arrProduct['price02_min_inctax_format'];
584            $arrProduct['price02_max_tax_format'] =& $arrProduct['price02_max_inctax_format'];
585        }
586        // @deprecated 2.12.4
587        // 旧バージョン互換用
588        // 現在は参照渡しで戻せる
589        return $arrProducts;
590    }
591
592    /**
593     * 商品情報の配列に税込金額を設定する
594     *
595     * @param array $arrProducts 商品情報の配列
596     * @return void
597     */
598    static function setIncTaxToProducts(&$arrProducts)
599    {
600        foreach ($arrProducts as &$arrProduct) {
601            SC_Product_Ex::setIncTaxToProduct($arrProduct);
602        }
603    }
604
605    /**
606     * 商品情報の配列に税込金額を設定する
607     *
608     * @param array $arrProducts 商品情報の配列
609     * @return void
610     */
611    static function setIncTaxToProduct(&$arrProduct)
612    {
613        $arrProduct['price01_min_inctax'] = isset($arrProduct['price01_min']) ? SC_Helper_TaxRule_Ex::sfCalcIncTax($arrProduct['price01_min'], $arrProduct['product_id']) : null;
614        $arrProduct['price01_max_inctax'] = isset($arrProduct['price01_max']) ? SC_Helper_TaxRule_Ex::sfCalcIncTax($arrProduct['price01_max'], $arrProduct['product_id']) : null;
615        $arrProduct['price02_min_inctax'] = isset($arrProduct['price02_min']) ? SC_Helper_TaxRule_Ex::sfCalcIncTax($arrProduct['price02_min'], $arrProduct['product_id']) : null;
616        $arrProduct['price02_max_inctax'] = isset($arrProduct['price02_max']) ? SC_Helper_TaxRule_Ex::sfCalcIncTax($arrProduct['price02_max'], $arrProduct['product_id']) : null;
617    }
618
619    /**
620     * 商品詳細の SQL を取得する.
621     *
622     * @param string $where_products_class 商品規格情報の WHERE 句
623     * @return string 商品詳細の SQL
624     */
625    function alldtlSQL($where_products_class = '')
626    {
627        if (!SC_Utils_Ex::isBlank($where_products_class)) {
628            $where_products_class = 'AND (' . $where_products_class . ')';
629        }
630        /*
631         * point_rate, deliv_fee は商品規格(dtb_products_class)ごとに保持しているが,
632         * 商品(dtb_products)ごとの設定なので MAX のみを取得する.
633         */
634        $sql = <<< __EOS__
635            (
636                SELECT
637                     dtb_products.product_id
638                    ,dtb_products.name
639                    ,dtb_products.maker_id
640                    ,dtb_products.status
641                    ,dtb_products.comment1
642                    ,dtb_products.comment2
643                    ,dtb_products.comment3
644                    ,dtb_products.comment4
645                    ,dtb_products.comment5
646                    ,dtb_products.comment6
647                    ,dtb_products.note
648                    ,dtb_products.main_list_comment
649                    ,dtb_products.main_list_image
650                    ,dtb_products.main_comment
651                    ,dtb_products.main_image
652                    ,dtb_products.main_large_image
653                    ,dtb_products.sub_title1
654                    ,dtb_products.sub_comment1
655                    ,dtb_products.sub_image1
656                    ,dtb_products.sub_large_image1
657                    ,dtb_products.sub_title2
658                    ,dtb_products.sub_comment2
659                    ,dtb_products.sub_image2
660                    ,dtb_products.sub_large_image2
661                    ,dtb_products.sub_title3
662                    ,dtb_products.sub_comment3
663                    ,dtb_products.sub_image3
664                    ,dtb_products.sub_large_image3
665                    ,dtb_products.sub_title4
666                    ,dtb_products.sub_comment4
667                    ,dtb_products.sub_image4
668                    ,dtb_products.sub_large_image4
669                    ,dtb_products.sub_title5
670                    ,dtb_products.sub_comment5
671                    ,dtb_products.sub_image5
672                    ,dtb_products.sub_large_image5
673                    ,dtb_products.sub_title6
674                    ,dtb_products.sub_comment6
675                    ,dtb_products.sub_image6
676                    ,dtb_products.sub_large_image6
677                    ,dtb_products.del_flg
678                    ,dtb_products.creator_id
679                    ,dtb_products.create_date
680                    ,dtb_products.update_date
681                    ,dtb_products.deliv_date_id
682                    ,T4.product_code_min
683                    ,T4.product_code_max
684                    ,T4.price01_min
685                    ,T4.price01_max
686                    ,T4.price02_min
687                    ,T4.price02_max
688                    ,T4.stock_min
689                    ,T4.stock_max
690                    ,T4.stock_unlimited_min
691                    ,T4.stock_unlimited_max
692                    ,T4.point_rate
693                    ,T4.deliv_fee
694                    ,T4.class_count
695                    ,dtb_maker.name AS maker_name
696                FROM dtb_products
697                    JOIN (
698                        SELECT product_id,
699                            MIN(product_code) AS product_code_min,
700                            MAX(product_code) AS product_code_max,
701                            MIN(price01) AS price01_min,
702                            MAX(price01) AS price01_max,
703                            MIN(price02) AS price02_min,
704                            MAX(price02) AS price02_max,
705                            MIN(stock) AS stock_min,
706                            MAX(stock) AS stock_max,
707                            MIN(stock_unlimited) AS stock_unlimited_min,
708                            MAX(stock_unlimited) AS stock_unlimited_max,
709                            MAX(point_rate) AS point_rate,
710                            MAX(deliv_fee) AS deliv_fee,
711                            COUNT(*) as class_count
712                        FROM dtb_products_class
713                        WHERE del_flg = 0 $where_products_class
714                        GROUP BY product_id
715                    ) AS T4
716                        ON dtb_products.product_id = T4.product_id
717                    LEFT JOIN dtb_maker
718                        ON dtb_products.maker_id = dtb_maker.maker_id
719            ) AS alldtl
720__EOS__;
721
722        return $sql;
723    }
724
725    /**
726     * 商品規格詳細の SQL を取得する.
727     *
728     * MEMO: 2.4系 vw_product_classに相当(?)するイメージ
729     *
730     * @param string $where 商品詳細の WHERE 句
731     * @return string 商品規格詳細の SQL
732     */
733    function prdclsSQL($where = '')
734    {
735        $where_clause = '';
736        if (!SC_Utils_Ex::isBlank($where)) {
737            $where_clause = ' WHERE ' . $where;
738        }
739        $sql = <<< __EOS__
740        (
741            SELECT dtb_products.*,
742                dtb_products_class.product_class_id,
743                dtb_products_class.product_type_id,
744                dtb_products_class.product_code,
745                dtb_products_class.stock,
746                dtb_products_class.stock_unlimited,
747                dtb_products_class.sale_limit,
748                dtb_products_class.price01,
749                dtb_products_class.price02,
750                dtb_products_class.deliv_fee,
751                dtb_products_class.point_rate,
752                dtb_products_class.down_filename,
753                dtb_products_class.down_realfilename,
754                dtb_products_class.classcategory_id1 AS classcategory_id, /* 削除 */
755                dtb_products_class.classcategory_id1,
756                dtb_products_class.classcategory_id2 AS parent_classcategory_id, /* 削除 */
757                dtb_products_class.classcategory_id2,
758                Tcc1.class_id as class_id,
759                Tcc1.name as classcategory_name,
760                Tcc2.class_id as parent_class_id,
761                Tcc2.name as parent_classcategory_name
762            FROM dtb_products
763                LEFT JOIN dtb_products_class
764                    ON dtb_products.product_id = dtb_products_class.product_id
765                LEFT JOIN dtb_classcategory as Tcc1
766                    ON dtb_products_class.classcategory_id1 = Tcc1.classcategory_id
767                LEFT JOIN dtb_classcategory as Tcc2
768                    ON dtb_products_class.classcategory_id2 = Tcc2.classcategory_id
769            $where_clause
770        ) as prdcls
771__EOS__;
772
773        return $sql;
774    }
775}
Note: See TracBrowser for help on using the repository browser.