source: branches/version-2_12-dev/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php @ 21774

Revision 21774, 42.0 KB checked in by shutta, 9 years ago (diff)

#1767 新規受注登録時に利用ポイントを指定できない

  • 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// {{{ requires
25require_once CLASS_EX_REALDIR . 'page_extends/admin/order/LC_Page_Admin_Order_Ex.php';
26
27/**
28 * 受注修正 のページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
34class LC_Page_Admin_Order_Edit extends LC_Page_Admin_Order_Ex {
35
36    var $arrShippingKeys = array(
37        'shipping_id',
38        'shipping_name01',
39        'shipping_name02',
40        'shipping_kana01',
41        'shipping_kana02',
42        'shipping_tel01',
43        'shipping_tel02',
44        'shipping_tel03',
45        'shipping_fax01',
46        'shipping_fax02',
47        'shipping_fax03',
48        'shipping_pref',
49        'shipping_zip01',
50        'shipping_zip02',
51        'shipping_addr01',
52        'shipping_addr02',
53        'shipping_date_year',
54        'shipping_date_month',
55        'shipping_date_day',
56        'time_id',
57    );
58
59    var $arrShipmentItemKeys = array(
60        'shipment_product_class_id',
61        'shipment_product_code',
62        'shipment_product_name',
63        'shipment_classcategory_name1',
64        'shipment_classcategory_name2',
65        'shipment_price',
66        'shipment_quantity',
67    );
68
69    // }}}
70    // {{{ functions
71
72    /**
73     * Page を初期化する.
74     *
75     * @return void
76     */
77    function init() {
78        parent::init();
79        $this->tpl_mainpage = 'order/edit.tpl';
80        $this->tpl_mainno = 'order';
81        $this->tpl_maintitle = '受注管理';
82        $this->tpl_subtitle = '受注登録';
83
84        $masterData = new SC_DB_MasterData_Ex();
85        $this->arrPref = $masterData->getMasterData('mtb_pref');
86        $this->arrORDERSTATUS = $masterData->getMasterData('mtb_order_status');
87        $this->arrDeviceType = $masterData->getMasterData('mtb_device_type');
88
89        $objDate = new SC_Date_Ex(RELEASE_YEAR);
90        $this->arrYearShippingDate = $objDate->getYear('', date('Y'), '');
91        $this->arrMonthShippingDate = $objDate->getMonth(true);
92        $this->arrDayShippingDate = $objDate->getDay(true);
93
94        // 支払い方法の取得
95        $this->arrPayment = SC_Helper_DB_Ex::sfGetIDValueList('dtb_payment', 'payment_id', 'payment_method');
96
97        // 配送業者の取得
98        $this->arrDeliv = SC_Helper_DB_Ex::sfGetIDValueList('dtb_deliv', 'deliv_id', 'name');
99
100        $this->httpCacheControl('nocache');
101    }
102
103    /**
104     * Page のプロセス.
105     *
106     * @return void
107     */
108    function process() {
109        $this->action();
110        $this->sendResponse();
111    }
112
113    /**
114     * Page のアクション.
115     *
116     * @return void
117     */
118    function action() {
119
120        $objPurchase = new SC_Helper_Purchase_Ex();
121        $objFormParam = new SC_FormParam_Ex();
122
123        // パラメーター情報の初期化
124        $this->lfInitParam($objFormParam);
125        $objFormParam->setParam($_REQUEST);
126        $objFormParam->convParam();
127        $order_id = $objFormParam->getValue('order_id');
128        $arrValuesBefore = array();
129
130        // DBから受注情報を読み込む
131        if (!SC_Utils_Ex::isBlank($order_id)) {
132            $this->setOrderToFormParam($objFormParam, $order_id);
133            $this->tpl_subno = 'index';
134            $arrValuesBefore['payment_id'] = $objFormParam->getValue('payment_id');
135            $arrValuesBefore['payment_method'] = $objFormParam->getValue('payment_method');
136        } else {
137            $this->tpl_subno = 'add';
138            $this->tpl_mode = 'add';
139            $arrValuesBefore['payment_id'] = NULL;
140            $arrValuesBefore['payment_method'] = NULL;
141            // お届け先情報を空情報で表示
142            $arrShippingIds[] = null;
143            $objFormParam->setValue('shipping_id', $arrShippingIds);
144
145            // 新規受注登録で入力エラーがあった場合の画面表示用に、会員の現在ポイントを取得
146            if (!SC_Utils_Ex::isBlank($objFormParam->getValue('customer_id'))) {
147                $customer_id = $objFormParam->getValue('customer_id');
148                $arrCustomer = SC_Helper_Customer_Ex::sfGetCustomerDataFromId($customer_id);
149                $objFormParam->setValue('customer_point', $arrCustomer['point']);
150
151                // 新規受注登録で、ポイント利用できるように現在ポイントを設定
152                $objFormParam->setValue('point', $arrCustomer['point']);
153            }
154        }
155
156        $this->arrSearchHidden = $objFormParam->getSearchArray();
157
158        switch ($this->getMode()) {
159            case 'pre_edit':
160            case 'order_id':
161                break;
162
163            case 'edit':
164                $objFormParam->setParam($_POST);
165                $objFormParam->convParam();
166                $this->arrErr = $this->lfCheckError($objFormParam);
167                if (SC_Utils_Ex::isBlank($this->arrErr)) {
168                    $message = '受注を編集しました。';
169                    $order_id = $this->doRegister($order_id, $objPurchase, $objFormParam, $message, $arrValuesBefore);
170                    if ($order_id >= 0) {
171                        $this->setOrderToFormParam($objFormParam, $order_id);
172                    }
173                    $this->tpl_onload = "window.alert('" . $message . "');";
174                }
175                break;
176
177            case 'add':
178                if ($_SERVER['REQUEST_METHOD'] == 'POST') {
179                    $objFormParam->setParam($_POST);
180                    $objFormParam->convParam();
181                    $this->arrErr = $this->lfCheckError($objFormParam);
182                    if (SC_Utils_Ex::isBlank($this->arrErr)) {
183                        $message = '受注を登録しました。';
184                        $order_id = $this->doRegister(null, $objPurchase, $objFormParam, $message, $arrValuesBefore);
185                        if ($order_id >= 0) {
186                            $this->tpl_mode = 'edit';
187                            $objFormParam->setValue('order_id', $order_id);
188                            $this->setOrderToFormParam($objFormParam, $order_id);
189                        }
190                        $this->tpl_onload = "window.alert('" . $message . "');";
191                    }
192                }
193
194                break;
195
196            // 再計算
197            case 'recalculate':
198            //支払い方法の選択
199            case 'payment':
200            // 配送業者の選択
201            case 'deliv':
202                $objFormParam->setParam($_POST);
203                $objFormParam->convParam();
204                $this->arrErr = $this->lfCheckError($objFormParam);
205                break;
206
207            // 商品削除
208            case 'delete_product':
209                $objFormParam->setParam($_POST);
210                $objFormParam->convParam();
211                $delete_no = $objFormParam->getValue('delete_no');
212                $this->doDeleteProduct($delete_no, $objFormParam);
213                $this->arrErr = $this->lfCheckError($objFormParam);
214                break;
215
216            // 商品追加ポップアップより商品選択
217            case 'select_product_detail':
218                $objFormParam->setParam($_POST);
219                $objFormParam->convParam();
220                $this->doRegisterProduct($objFormParam);
221                $this->arrErr = $this->lfCheckError($objFormParam);
222                break;
223
224            // 会員検索ポップアップより会員指定
225            case 'search_customer':
226                $objFormParam->setParam($_POST);
227                $objFormParam->convParam();
228                $this->setCustomerTo($objFormParam->getValue('edit_customer_id'),
229                                     $objFormParam);
230                $this->arrErr = $this->lfCheckError($objFormParam);
231                break;
232
233            // 複数配送設定表示
234            case 'multiple':
235                $objFormParam->setParam($_POST);
236                $objFormParam->convParam();
237                $this->arrErr = $this->lfCheckError($objFormParam);
238                break;
239
240            // 複数配送設定を反映
241            case 'multiple_set_to':
242                $this->lfInitMultipleParam($objFormParam);
243                $objFormParam->setParam($_POST);
244                $objFormParam->convParam();
245                $this->setMultipleItemTo($objFormParam);
246                break;
247
248            // お届け先の追加
249            case 'append_shipping':
250                $objFormParam->setParam($_POST);
251                $objFormParam->convParam();
252                $this->addShipping($objFormParam);
253                break;
254
255            default:
256                break;
257        }
258
259        $this->arrForm = $objFormParam->getFormParamList();
260        $this->arrAllShipping = $objFormParam->getSwapArray(array_merge($this->arrShippingKeys, $this->arrShipmentItemKeys));
261        $this->arrDelivTime = $objPurchase->getDelivTime($objFormParam->getValue('deliv_id'));
262        $this->tpl_onload .= $this->getAnchorKey($objFormParam);
263        $this->arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
264        if ($arrValuesBefore['payment_id'])
265            $this->arrPayment[$arrValuesBefore['payment_id']] = $arrValuesBefore['payment_method'];
266
267    }
268
269    /**
270     * デストラクタ.
271     *
272     * @return void
273     */
274    function destroy() {
275        parent::destroy();
276    }
277
278    /**
279     * パラメーター情報の初期化を行う.
280     *
281     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
282     * @return void
283     */
284    function lfInitParam(&$objFormParam) {
285        // 検索条件のパラメーターを初期化
286        parent::lfInitParam($objFormParam);
287
288        // お客様情報
289        $objFormParam->addParam('注文者 お名前(姓)', 'order_name01', STEXT_LEN, 'KVa', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
290        $objFormParam->addParam('注文者 お名前(名)', 'order_name02', STEXT_LEN, 'KVa', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
291        $objFormParam->addParam('注文者 お名前(フリガナ・姓)', 'order_kana01', STEXT_LEN, 'KVCa', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
292        $objFormParam->addParam('注文者 お名前(フリガナ・名)', 'order_kana02', STEXT_LEN, 'KVCa', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
293        $objFormParam->addParam('メールアドレス', 'order_email', null, 'KVCa', array('NO_SPTAB', 'EMAIL_CHECK', 'EMAIL_CHAR_CHECK'));
294        $objFormParam->addParam('郵便番号1', 'order_zip01', ZIP01_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
295        $objFormParam->addParam('郵便番号2', 'order_zip02', ZIP02_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
296        $objFormParam->addParam('都道府県', 'order_pref', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
297        $objFormParam->addParam('住所1', 'order_addr01', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
298        $objFormParam->addParam('住所2', 'order_addr02', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
299        $objFormParam->addParam('電話番号1', 'order_tel01', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
300        $objFormParam->addParam('電話番号2', 'order_tel02', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
301        $objFormParam->addParam('電話番号3', 'order_tel03', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
302
303        // 受注商品情報
304        $objFormParam->addParam('値引き', 'discount', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
305        $objFormParam->addParam('送料', 'deliv_fee', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
306        $objFormParam->addParam('手数料', 'charge', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
307
308        // ポイント機能ON時のみ
309        if (USE_POINT !== false) {
310            $objFormParam->addParam('利用ポイント', 'use_point', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
311        }
312
313        $objFormParam->addParam('配送業者', 'deliv_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
314        $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
315        $objFormParam->addParam('対応状況', 'status', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
316        $objFormParam->addParam('お支払方法名称', 'payment_method');
317
318        // 受注詳細情報
319        $objFormParam->addParam('商品種別ID', 'product_type_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
320        $objFormParam->addParam('単価', 'price', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
321        $objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
322        $objFormParam->addParam('商品ID', 'product_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
323        $objFormParam->addParam('商品規格ID', 'product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
324        $objFormParam->addParam('ポイント付与率', 'point_rate');
325        $objFormParam->addParam('商品コード', 'product_code');
326        $objFormParam->addParam('商品名', 'product_name');
327        $objFormParam->addParam('規格名1', 'classcategory_name1');
328        $objFormParam->addParam('規格名2', 'classcategory_name2');
329        $objFormParam->addParam('メモ', 'note', MTEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
330        $objFormParam->addParam('削除用項番', 'delete_no', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
331
332        // DB読込用
333        $objFormParam->addParam('小計', 'subtotal');
334        $objFormParam->addParam('合計', 'total');
335        $objFormParam->addParam('支払い合計', 'payment_total');
336        $objFormParam->addParam('加算ポイント', 'add_point');
337        $objFormParam->addParam('お誕生日ポイント', 'birth_point', null, 'n', array(), 0);
338        $objFormParam->addParam('消費税合計', 'tax');
339        $objFormParam->addParam('最終保持ポイント', 'total_point');
340        $objFormParam->addParam('会員ID', 'customer_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
341        $objFormParam->addParam('会員ID', 'edit_customer_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
342        $objFormParam->addParam('現在のポイント', 'customer_point');
343        $objFormParam->addParam('受注前ポイント', 'point');
344        $objFormParam->addParam('注文番号', 'order_id');
345        $objFormParam->addParam('受注日', 'create_date');
346        $objFormParam->addParam('発送日', 'commit_date');
347        $objFormParam->addParam('備考', 'message');
348        $objFormParam->addParam('入金日', 'payment_date');
349        $objFormParam->addParam('端末種別', 'device_type_id');
350
351        // 複数情報
352        $objFormParam->addParam('配送数', 'shipping_quantity', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
353        $objFormParam->addParam('配送ID', 'shipping_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), 0);
354        $objFormParam->addParam('お名前(姓)', 'shipping_name01', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
355        $objFormParam->addParam('お名前(名)', 'shipping_name02', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
356        $objFormParam->addParam('お名前(フリガナ・姓)', 'shipping_kana01', STEXT_LEN, 'KVCa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
357        $objFormParam->addParam('お名前(フリガナ・名)', 'shipping_kana02', STEXT_LEN, 'KVCa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
358        $objFormParam->addParam('郵便番号1', 'shipping_zip01', ZIP01_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
359        $objFormParam->addParam('郵便番号2', 'shipping_zip02', ZIP02_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
360        $objFormParam->addParam('都道府県', 'shipping_pref', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
361        $objFormParam->addParam('住所1', 'shipping_addr01', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
362        $objFormParam->addParam('住所2', 'shipping_addr02', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
363        $objFormParam->addParam('電話番号1', 'shipping_tel01', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
364        $objFormParam->addParam('電話番号2', 'shipping_tel02', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
365        $objFormParam->addParam('電話番号3', 'shipping_tel03', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
366        $objFormParam->addParam('お届け時間ID', 'time_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
367        $objFormParam->addParam('お届け日(年)', 'shipping_date_year', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
368        $objFormParam->addParam('お届け日(月)', 'shipping_date_month', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
369        $objFormParam->addParam('お届け日(日)', 'shipping_date_day', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
370        $objFormParam->addParam('お届け日', 'shipping_date', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
371        $objFormParam->addParam('配送商品数量', 'shipping_product_quantity', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
372
373        $objFormParam->addParam('商品規格ID', 'shipment_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
374        $objFormParam->addParam('商品コード', 'shipment_product_code');
375        $objFormParam->addParam('商品名', 'shipment_product_name');
376        $objFormParam->addParam('規格名1', 'shipment_classcategory_name1');
377        $objFormParam->addParam('規格名2', 'shipment_classcategory_name2');
378        $objFormParam->addParam('単価', 'shipment_price', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
379        $objFormParam->addParam('数量', 'shipment_quantity', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
380
381        $objFormParam->addParam('商品項番', 'no', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
382        $objFormParam->addParam('追加商品規格ID', 'add_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
383        $objFormParam->addParam('修正商品規格ID', 'edit_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
384        $objFormParam->addParam('アンカーキー', 'anchor_key', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
385    }
386
387    /**
388     * 複数配送用フォームの初期化を行う.
389     *
390     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
391     * @return void
392     */
393    function lfInitMultipleParam(&$objFormParam) {
394        $objFormParam->addParam('商品規格ID', 'multiple_product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
395        $objFormParam->addParam('商品コード', 'multiple_product_code', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
396        $objFormParam->addParam('商品名', 'multiple_product_name', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
397        $objFormParam->addParam('規格1', 'multiple_classcategory_name1', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
398        $objFormParam->addParam('規格2', 'multiple_classcategory_name2', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
399        $objFormParam->addParam('単価', 'multiple_price', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
400        $objFormParam->addParam('数量', 'multiple_quantity', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
401        $objFormParam->addParam('お届け先', 'multiple_shipping_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
402    }
403
404    /**
405     * 複数配送入力フォームで入力された値を SC_FormParam へ設定する.
406     *
407     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
408     * @return void
409     */
410    function setMultipleItemTo(&$objFormParam) {
411        $arrMultipleKey = array('multiple_shipping_id',
412                                'multiple_product_class_id',
413                                'multiple_product_name',
414                                'multiple_product_code',
415                                'multiple_classcategory_name1',
416                                'multiple_classcategory_name2',
417                                'multiple_price',
418                                'multiple_quantity');
419        $arrMultipleParams = $objFormParam->getSwapArray($arrMultipleKey);
420
421        /*
422         * 複数配送フォームの入力値を shipping_id ごとにマージ
423         *
424         * $arrShipmentItem[お届け先ID][商品規格ID]['shipment_(key)'] = 値
425         */
426        $arrShipmentItem = array();
427        foreach ($arrMultipleParams as $arrMultiple) {
428            $shipping_id = $arrMultiple['multiple_shipping_id'];
429            $product_class_id = $arrMultiple['multiple_product_class_id'];
430            foreach ($arrMultiple as $key => $val) {
431                if ($key == 'multiple_quantity') {
432                    $arrShipmentItem[$shipping_id][$product_class_id][str_replace('multiple', 'shipment', $key)] += $val;
433                } else {
434                    $arrShipmentItem[$shipping_id][$product_class_id][str_replace('multiple', 'shipment', $key)] = $val;
435                }
436            }
437        }
438
439        /*
440         * フォームのお届け先ごとの配列を生成
441         *
442         * $arrShipmentForm['(key)'][$shipping_id][$item_index] = 値
443         * $arrProductQuantity[$shipping_id] = お届け先ごとの配送商品数量
444         */
445        $arrShipmentForm = array();
446        $arrProductQuantity = array();
447        $arrShippingIds = $objFormParam->getValue('shipping_id');
448        foreach ($arrShippingIds as $shipping_id) {
449            $item_index = 0;
450            foreach ($arrShipmentItem[$shipping_id] as $product_class_id => $shipment_item) {
451                foreach ($shipment_item as $key => $val) {
452                    $arrShipmentForm[$key][$shipping_id][$item_index] = $val;
453                }
454                // 受注商品の数量を設定
455                $arrQuantity[$product_class_id] += $shipment_item['shipment_quantity'];
456                $item_index++;
457            }
458            // お届け先ごとの配送商品数量を設定
459            $arrProductQuantity[$shipping_id] = count($arrShipmentItem[$shipping_id]);
460        }
461
462        $objFormParam->setParam($arrShipmentForm);
463        $objFormParam->setValue('shipping_product_quantity', $arrProductQuantity);
464
465        // 受注商品の数量を変更
466        $arrDest = array();
467        foreach ($objFormParam->getValue('product_class_id') as $n => $order_product_class_id) {
468            $arrDest['quantity'][$n] = 0;
469        }
470        foreach ($arrQuantity as $product_class_id => $quantity) {
471            foreach ($objFormParam->getValue('product_class_id') as $n => $order_product_class_id) {
472                if ($product_class_id == $order_product_class_id) {
473                    $arrDest['quantity'][$n] = $quantity;
474                }
475            }
476        }
477        $objFormParam->setParam($arrDest);
478    }
479
480    /**
481     * 受注データを取得して, SC_FormParam へ設定する.
482     *
483     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
484     * @param integer $order_id 取得元の受注ID
485     * @return void
486     */
487    function setOrderToFormParam(&$objFormParam, $order_id) {
488        $objPurchase = new SC_Helper_Purchase_Ex();
489
490        // 受注詳細を設定
491        $arrOrderDetail = $objPurchase->getOrderDetail($order_id, false);
492        $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($arrOrderDetail));
493
494        $arrShippingsTmp = $objPurchase->getShippings($order_id);
495        $arrShippings = array();
496        foreach ($arrShippingsTmp as $row) {
497            // お届け日の処理
498            if (!SC_Utils_Ex::isBlank($row['shipping_date'])) {
499                $ts = strtotime($row['shipping_date']);
500                $row['shipping_date_year'] = date('Y', $ts);
501                $row['shipping_date_month'] = date('n', $ts);
502                $row['shipping_date_day'] = date('j', $ts);
503            }
504            $arrShippings[$row['shipping_id']] = $row;
505        }
506        $objFormParam->setValue('shipping_quantity', count($arrShippings));
507        $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($arrShippings));
508
509        /*
510         * 配送商品を設定
511         *
512         * $arrShipmentItem['shipment_(key)'][$shipping_id][$item_index] = 値
513         * $arrProductQuantity[$shipping_id] = お届け先ごとの配送商品数量
514         */
515        $arrProductQuantity = array();
516        $arrShipmentItem = array();
517        foreach ($arrShippings as $shipping_id => $arrShipping) {
518            $arrProductQuantity[$shipping_id] = count($arrShipping['shipment_item']);
519            foreach ($arrShipping['shipment_item'] as $item_index => $arrItem) {
520                foreach ($arrItem as $item_key => $item_val) {
521                    $arrShipmentItem['shipment_' . $item_key][$shipping_id][$item_index] = $item_val;
522                }
523            }
524        }
525        $objFormParam->setValue('shipping_product_quantity', $arrProductQuantity);
526        $objFormParam->setParam($arrShipmentItem);
527
528        /*
529         * 受注情報を設定
530         * $arrOrderDetail と項目が重複しており, $arrOrderDetail は連想配列の値
531         * が渡ってくるため, $arrOrder で上書きする.
532         */
533        $arrOrder = $objPurchase->getOrder($order_id);
534        $objFormParam->setParam($arrOrder);
535
536        // ポイントを設定
537        list($db_point, $rollback_point) = SC_Helper_DB_Ex::sfGetRollbackPoint(
538            $order_id, $arrOrder['use_point'], $arrOrder['add_point'], $arrOrder['status']
539        );
540        $objFormParam->setValue('total_point', $db_point);
541        $objFormParam->setValue('point', $rollback_point);
542
543        if (!SC_Utils_Ex::isBlank($objFormParam->getValue('customer_id'))) {
544            $arrCustomer = SC_Helper_Customer_Ex::sfGetCustomerDataFromId($objFormParam->getValue('customer_id'));
545            $objFormParam->setValue('customer_point', $arrCustomer['point']);
546        }
547    }
548
549    /**
550     * 入力内容のチェックを行う.
551     *
552     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
553     * @return array エラーメッセージの配列
554     */
555    function lfCheckError(&$objFormParam) {
556        $objProduct = new SC_Product_Ex();
557
558        $arrErr = $objFormParam->checkError();
559
560        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
561            return $arrErr;
562        }
563
564        $arrValues = $objFormParam->getHashArray();
565
566        // 商品の種類数
567        $max = count($arrValues['quantity']);
568        $subtotal = 0;
569        $totalpoint = 0;
570        $totaltax = 0;
571        for ($i = 0; $i < $max; $i++) {
572            // 小計の計算
573            $subtotal += SC_Helper_DB_Ex::sfCalcIncTax($arrValues['price'][$i]) * $arrValues['quantity'][$i];
574            // 小計の計算
575            $totaltax += SC_Helper_DB_Ex::sfTax($arrValues['price'][$i]) * $arrValues['quantity'][$i];
576            // 加算ポイントの計算
577            $totalpoint += SC_Utils_Ex::sfPrePoint($arrValues['price'][$i], $arrValues['point_rate'][$i]) * $arrValues['quantity'][$i];
578
579            // 在庫数のチェック
580            $arrProduct = $objProduct->getDetailAndProductsClass($arrValues['product_class_id'][$i]);
581
582            // 編集前の値と比較するため受注詳細を取得
583            $objPurchase = new SC_Helper_Purchase_Ex();
584            $arrOrderDetail = SC_Utils_Ex::sfSwapArray($objPurchase->getOrderDetail($objFormParam->getValue('order_id'), false));
585
586            if ($arrProduct['stock_unlimited'] != '1'
587                && $arrProduct['stock'] < $arrValues['quantity'][$i] - $arrOrderDetail['quantity'][$i]) {
588                $class_name1 = $arrValues['classcategory_name1'][$i];
589                $class_name1 = SC_Utils_Ex::isBlank($class_name1) ? 'なし' : $class_name1;
590                $class_name2 = $arrValues['classcategory_name2'][$i];
591                $class_name2 = SC_Utils_Ex::isBlank($class_name2) ? 'なし' : $class_name2;
592                $arrErr['quantity'][$i] .= $arrValues['product_name'][$i]
593                    . '/(' . $class_name1 . ')/(' . $class_name2 . ') の在庫が不足しています。 設定できる数量は「'
594                    . ($arrOrderDetail['quantity'][$i] + $arrProduct['stock']) . '」までです。<br />';
595            }
596        }
597
598        // 消費税
599        $arrValues['tax'] = $totaltax;
600        // 小計
601        $arrValues['subtotal'] = $subtotal;
602        // 合計
603        $arrValues['total'] = $subtotal - $arrValues['discount'] + $arrValues['deliv_fee'] + $arrValues['charge'];
604        // お支払い合計
605        $arrValues['payment_total'] = $arrValues['total'] - ($arrValues['use_point'] * POINT_VALUE);
606
607        // 加算ポイント
608        $arrValues['add_point'] = SC_Helper_DB_Ex::sfGetAddPoint($totalpoint, $arrValues['use_point']);
609
610        // 最終保持ポイント
611        $arrValues['total_point'] = $objFormParam->getValue('point') - $arrValues['use_point'];
612
613        if ($arrValues['total'] < 0) {
614            $arrErr['total'] = '合計額がマイナス表示にならないように調整して下さい。<br />';
615        }
616
617        if ($arrValues['payment_total'] < 0) {
618            $arrErr['payment_total'] = 'お支払い合計額がマイナス表示にならないように調整して下さい。<br />';
619        }
620
621        if ($arrValues['total_point'] < 0) {
622            $arrErr['use_point'] = '最終保持ポイントがマイナス表示にならないように調整して下さい。<br />';
623        }
624
625        $objFormParam->setParam($arrValues);
626        return $arrErr;
627    }
628
629    /**
630     * DB更新処理
631     *
632     * @param integer $order_id 受注ID
633     * @param SC_Helper_Purchase $objPurchase SC_Helper_Purchase インスタンス
634     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
635     * @param string $message 通知メッセージ
636     * @param array $arrValuesBefore 更新前の受注情報
637     * @return integer $order_id 受注ID
638     *
639     * エラー発生時は負数を返す。
640     */
641    function doRegister($order_id, &$objPurchase, &$objFormParam, &$message, &$arrValuesBefore) {
642
643        $objQuery =& SC_Query_Ex::getSingletonInstance();
644        $arrValues = $objFormParam->getDbArray();
645
646        $where = 'order_id = ?';
647
648        $objQuery->begin();
649
650        // 支払い方法が変更されたら、支払い方法名称も更新
651        if ($arrValues['payment_id'] != $arrValuesBefore['payment_id']) {
652            $arrValues['payment_method'] = $this->arrPayment[$arrValues['payment_id']];
653            $arrValuesBefore['payment_id'] = NULL;
654        }
655
656        // 受注テーブルの更新
657        $order_id = $objPurchase->registerOrder($order_id, $arrValues);
658
659        $arrDetail = $objFormParam->getSwapArray(array(
660                'product_id',
661                'product_class_id',
662                'product_code',
663                'product_name',
664                'price', 'quantity',
665                'point_rate',
666                'classcategory_name1',
667                'classcategory_name2',
668        ));
669
670        // 変更しようとしている商品情報とDBに登録してある商品情報を比較することで、更新すべき数量を計算
671        $max = count($arrDetail);
672        $k = 0;
673        $arrStockData = array();
674        for ($i = 0; $i < $max; $i++) {
675            if (!empty($arrDetail[$i]['product_id'])) {
676                $arrPreDetail = $objQuery->select('*', 'dtb_order_detail', 'order_id = ? AND product_class_id = ?', array($order_id, $arrDetail[$i]['product_class_id']));
677                if (!empty($arrPreDetail) && $arrPreDetail[0]['quantity'] != $arrDetail[$i]['quantity']) {
678                    // 数量が変更された商品
679                    $arrStockData[$k]['product_class_id'] = $arrDetail[$i]['product_class_id'];
680                    $arrStockData[$k]['quantity'] = $arrPreDetail[0]['quantity'] - $arrDetail[$i]['quantity'];
681                    ++$k;
682                } elseif (empty($arrPreDetail)) {
683                    // 新しく追加された商品 もしくは 違う商品に変更された商品
684                    $arrStockData[$k]['product_class_id'] = $arrDetail[$i]['product_class_id'];
685                    $arrStockData[$k]['quantity'] = -$arrDetail[$i]['quantity'];
686                    ++$k;
687                }
688                $objQuery->delete('dtb_order_detail', 'order_id = ? AND product_class_id = ?', array($order_id, $arrDetail[$i]['product_class_id']));
689            }
690        }
691
692        // 上記の新しい商品のループでDELETEされなかった商品は、注文より削除された商品
693        $arrPreDetail = $objQuery->select('*', 'dtb_order_detail', 'order_id = ?', array($order_id));
694        foreach ($arrPreDetail AS $key=>$val) {
695            $arrStockData[$k]['product_class_id'] = $val['product_class_id'];
696            $arrStockData[$k]['quantity'] = $val['quantity'];
697            ++$k;
698        }
699
700        // 受注詳細データの更新
701        $objPurchase->registerOrderDetail($order_id, $arrDetail);
702
703        // 在庫数調整
704        if (ORDER_DELIV != $arrValues['status']
705            && ORDER_CANCEL != $arrValues['status']) {
706            foreach ($arrStockData AS $stock) {
707                $objQuery->update('dtb_products_class', array(),
708                                  'product_class_id = ?',
709                                  array($stock['product_class_id']),
710                                  array('stock' => 'stock + ?'),
711                                  array($stock['quantity']));
712            }
713        }
714
715        $arrAllShipping = $objFormParam->getSwapArray($this->arrShippingKeys);
716        $arrAllShipmentItem = $objFormParam->getSwapArray($this->arrShipmentItemKeys);
717
718        $arrDelivTime = $objPurchase->getDelivTime($objFormParam->getValue('deliv_id'));
719
720        $arrShippingValues = array();
721        foreach ($arrAllShipping as $shipping_index => $arrShipping) {
722            $shipping_id = $arrShipping['shipping_id'];
723            $arrShippingValues[$shipping_index] = $arrShipping;
724
725            $arrShippingValues[$shipping_index]['shipping_date']
726                = SC_Utils_Ex::sfGetTimestamp($arrShipping['shipping_date_year'],
727                                              $arrShipping['shipping_date_month'],
728                                              $arrShipping['shipping_date_day']);
729
730            // 配送業者IDを取得
731            $arrShippingValues[$shipping_index]['deliv_id'] = $objFormParam->getValue('deliv_id');
732
733            // お届け時間名称を取得
734            $arrShippingValues[$shipping_index]['shipping_time'] = $arrDelivTime[$arrShipping['time_id']];
735
736            // 複数配送の場合は配送商品を登録
737            if (!SC_Utils_Ex::isBlank($arrAllShipmentItem)) {
738                $arrShipmentValues = array();
739
740                foreach ($arrAllShipmentItem[$shipping_index] as $key => $arrItem) {
741                    $i = 0;
742                    foreach ($arrItem as $item) {
743                        $arrShipmentValues[$shipping_index][$i][str_replace('shipment_', '', $key)] = $item;
744                        $i++;
745                    }
746                }
747                $objPurchase->registerShipmentItem($order_id, $shipping_id,
748                                                   $arrShipmentValues[$shipping_index]);
749            }
750        }
751        $objPurchase->registerShipping($order_id, $arrShippingValues, false);
752        $objQuery->commit();
753        return $order_id;
754    }
755
756    /**
757     * 受注商品の追加/更新を行う.
758     *
759     * 小画面で選択した受注商品をフォームに反映させる.
760     *
761     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
762     * @return void
763     */
764    function doRegisterProduct(&$objFormParam) {
765        $product_class_id = $objFormParam->getValue('add_product_class_id');
766        if (SC_Utils_Ex::isBlank($product_class_id)) {
767            $product_class_id = $objFormParam->getValue('edit_product_class_id');
768            $changed_no = $objFormParam->getValue('no');
769        }
770        // FXIME バリデーションを通さず $objFormParam の値で DB 問い合わせしている。(管理機能ため、さほど問題は無いと思うものの…)
771
772        // 商品規格IDが指定されていない場合、例外エラーを発生
773        if (strlen($product_class_id) === 0) {
774            trigger_error('商品規格指定なし', E_USER_ERROR);
775        }
776
777        // 選択済みの商品であれば数量を1増やす
778        $exists = false;
779        $arrExistsProductClassIds = $objFormParam->getValue('product_class_id');
780        foreach (array_keys($arrExistsProductClassIds) as $key) {
781            $exists_product_class_id = $arrExistsProductClassIds[$key];
782            if ($exists_product_class_id == $product_class_id) {
783                $exists = true;
784                $exists_no = $key;
785                $arrExistsQuantity = $objFormParam->getValue('quantity');
786                $arrExistsQuantity[$key]++;
787                $objFormParam->setValue('quantity', $arrExistsQuantity);
788            }
789        }
790
791        // 新しく商品を追加した場合はフォームに登録
792        // 商品を変更した場合は、該当行を変更
793        if (!$exists) {
794            $objProduct = new SC_Product_Ex();
795            $arrProduct = $objProduct->getDetailAndProductsClass($product_class_id);
796
797            // 一致する商品規格がない場合、例外エラーを発生
798            if (empty($arrProduct)) {
799                trigger_error('商品規格一致なし', E_USER_ERROR);
800            }
801
802            $arrProduct['quantity'] = 1;
803            $arrProduct['price'] = $arrProduct['price02'];
804            $arrProduct['product_name'] = $arrProduct['name'];
805
806            $arrUpdateKeys = array(
807                'product_id', 'product_class_id', 'product_type_id', 'point_rate',
808                'product_code', 'product_name', 'classcategory_name1', 'classcategory_name2',
809                'quantity', 'price',
810            );
811            foreach ($arrUpdateKeys as $key) {
812                $arrValues = $objFormParam->getValue($key);
813                if (isset($changed_no)) {
814                    $arrValues[$changed_no] = $arrProduct[$key];
815                } else {
816                    $added_no = 0;
817                    if (is_array($arrExistsProductClassIds)) {
818                        $added_no = count($arrExistsProductClassIds);
819                    }
820                    $arrValues[$added_no] = $arrProduct[$key];
821                }
822                $objFormParam->setValue($key, $arrValues);
823            }
824        } elseif (isset($changed_no) && $exists_no != $changed_no) {
825            // 変更したが、選択済みの商品だった場合は、変更対象行を削除。
826            $this->doDeleteProduct($changed_no, $objFormParam);
827        }
828    }
829
830    /**
831     * 受注商品を削除する.
832     *
833     * @param integer $delete_no 削除する受注商品の項番
834     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
835     * @return void
836     */
837    function doDeleteProduct($delete_no, &$objFormParam) {
838        $arrDeleteKeys = array(
839            'product_id', 'product_class_id', 'product_type_id', 'point_rate',
840            'product_code', 'product_name', 'classcategory_name1', 'classcategory_name2',
841            'quantity', 'price',
842        );
843        foreach ($arrDeleteKeys as $key) {
844            $arrNewValues = array();
845            $arrValues = $objFormParam->getValue($key);
846            foreach ($arrValues as $index => $val) {
847                if ($index != $delete_no) {
848                    $arrNewValues[] = $val;
849                }
850            }
851            $objFormParam->setValue($key, $arrNewValues);
852        }
853    }
854
855    /**
856     * お届け先を追加する.
857     *
858     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
859     * @return void
860     */
861    function addShipping(&$objFormParam) {
862        $objFormParam->setValue('shipping_quantity',
863                                $objFormParam->getValue('shipping_quantity') + 1);
864        $arrShippingIds = $objFormParam->getValue('shipping_id');
865        $arrShippingIds[] = max($arrShippingIds) + 1;
866        $objFormParam->setValue('shipping_id', $arrShippingIds);
867    }
868
869    /**
870     * 会員情報をフォームに設定する.
871     *
872     * @param integer $customer_id 会員ID
873     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
874     * @return void
875     */
876    function setCustomerTo($customer_id, &$objFormParam) {
877        $arrCustomer = SC_Helper_Customer_Ex::sfGetCustomerDataFromId($customer_id);
878        foreach ($arrCustomer as $key => $val) {
879            $objFormParam->setValue('order_' . $key, $val);
880        }
881        $objFormParam->setValue('customer_id', $customer_id);
882        $objFormParam->setValue('customer_point', $arrCustomer['point']);
883    }
884
885    /**
886     * アンカーキーを取得する.
887     *
888     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
889     * @return アンカーキーの文字列
890     */
891    function getAnchorKey(&$objFormParam) {
892        $ancor_key = $objFormParam->getValue('anchor_key');
893        if (!SC_Utils_Ex::isBlank($ancor_key)) {
894            return "location.hash='#" . htmlentities(urlencode($ancor_key), ENT_QUOTES) . "'";
895        }
896        return '';
897    }
898}
Note: See TracBrowser for help on using the repository browser.