source: branches/version-2_13-dev/data/class/SC_Product.php @ 22960

Revision 22960, 30.1 KB checked in by Seasoft, 11 years ago (diff)

#2043 (typo修正・ソース整形・ソースコメントの改善 for 2.13.0)

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