source: branches/version-2_12-dev/data/class/SC_Product.php @ 21390

Revision 21390, 34.7 KB checked in by kotani, 12 years ago (diff)

Merge from version-2_11-dev

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