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

Revision 21870, 42.9 KB checked in by h_yoshimoto, 12 years ago (diff)

#1818 受注管理>受注登録にて、最初に登録する商品の価格がおかしいバグを修正

  • 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-2012 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        $objFormParam->addParam('FAX番号1', 'order_fax01', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
303        $objFormParam->addParam('FAX番号2', 'order_fax02', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
304        $objFormParam->addParam('FAX番号3', 'order_fax03', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
305
306        // 受注商品情報
307        $objFormParam->addParam('値引き', 'discount', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
308        $objFormParam->addParam('送料', 'deliv_fee', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
309        $objFormParam->addParam('手数料', 'charge', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
310
311        // ポイント機能ON時のみ
312        if (USE_POINT !== false) {
313            $objFormParam->addParam('利用ポイント', 'use_point', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
314        }
315
316        $objFormParam->addParam('配送業者', 'deliv_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
317        $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
318        $objFormParam->addParam('対応状況', 'status', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
319        $objFormParam->addParam('お支払方法名称', 'payment_method');
320
321        // 受注詳細情報
322        $objFormParam->addParam('商品種別ID', 'product_type_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
323        $objFormParam->addParam('単価', 'price', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
324        $objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
325        $objFormParam->addParam('商品ID', 'product_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
326        $objFormParam->addParam('商品規格ID', 'product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
327        $objFormParam->addParam('ポイント付与率', 'point_rate');
328        $objFormParam->addParam('商品コード', 'product_code');
329        $objFormParam->addParam('商品名', 'product_name');
330        $objFormParam->addParam('規格名1', 'classcategory_name1');
331        $objFormParam->addParam('規格名2', 'classcategory_name2');
332        $objFormParam->addParam('メモ', 'note', MTEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
333        $objFormParam->addParam('削除用項番', 'delete_no', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
334
335        // DB読込用
336        $objFormParam->addParam('小計', 'subtotal');
337        $objFormParam->addParam('合計', 'total');
338        $objFormParam->addParam('支払い合計', 'payment_total');
339        $objFormParam->addParam('加算ポイント', 'add_point');
340        $objFormParam->addParam('お誕生日ポイント', 'birth_point', null, 'n', array(), 0);
341        $objFormParam->addParam('消費税合計', 'tax');
342        $objFormParam->addParam('最終保持ポイント', 'total_point');
343        $objFormParam->addParam('会員ID', 'customer_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
344        $objFormParam->addParam('会員ID', 'edit_customer_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
345        $objFormParam->addParam('現在のポイント', 'customer_point');
346        $objFormParam->addParam('受注前ポイント', 'point');
347        $objFormParam->addParam('注文番号', 'order_id');
348        $objFormParam->addParam('受注日', 'create_date');
349        $objFormParam->addParam('発送日', 'commit_date');
350        $objFormParam->addParam('備考', 'message');
351        $objFormParam->addParam('入金日', 'payment_date');
352        $objFormParam->addParam('端末種別', 'device_type_id');
353
354        // 複数情報
355        $objFormParam->addParam('配送数', 'shipping_quantity', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
356        $objFormParam->addParam('配送ID', 'shipping_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), 0);
357        $objFormParam->addParam('お名前(姓)', 'shipping_name01', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
358        $objFormParam->addParam('お名前(名)', 'shipping_name02', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
359        $objFormParam->addParam('お名前(フリガナ・姓)', 'shipping_kana01', STEXT_LEN, 'KVCa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
360        $objFormParam->addParam('お名前(フリガナ・名)', 'shipping_kana02', STEXT_LEN, 'KVCa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
361        $objFormParam->addParam('郵便番号1', 'shipping_zip01', ZIP01_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
362        $objFormParam->addParam('郵便番号2', 'shipping_zip02', ZIP02_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
363        $objFormParam->addParam('都道府県', 'shipping_pref', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
364        $objFormParam->addParam('住所1', 'shipping_addr01', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
365        $objFormParam->addParam('住所2', 'shipping_addr02', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
366        $objFormParam->addParam('電話番号1', 'shipping_tel01', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
367        $objFormParam->addParam('電話番号2', 'shipping_tel02', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
368        $objFormParam->addParam('電話番号3', 'shipping_tel03', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
369        $objFormParam->addParam('FAX番号1', 'shipping_fax01', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
370        $objFormParam->addParam('FAX番号2', 'shipping_fax02', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
371        $objFormParam->addParam('FAX番号3', 'shipping_fax03', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
372        $objFormParam->addParam('お届け時間ID', 'time_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
373        $objFormParam->addParam('お届け日(年)', 'shipping_date_year', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
374        $objFormParam->addParam('お届け日(月)', 'shipping_date_month', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
375        $objFormParam->addParam('お届け日(日)', 'shipping_date_day', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
376        $objFormParam->addParam('お届け日', 'shipping_date', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
377        $objFormParam->addParam('配送商品数量', 'shipping_product_quantity', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
378
379        $objFormParam->addParam('商品規格ID', 'shipment_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
380        $objFormParam->addParam('商品コード', 'shipment_product_code');
381        $objFormParam->addParam('商品名', 'shipment_product_name');
382        $objFormParam->addParam('規格名1', 'shipment_classcategory_name1');
383        $objFormParam->addParam('規格名2', 'shipment_classcategory_name2');
384        $objFormParam->addParam('単価', 'shipment_price', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
385        $objFormParam->addParam('数量', 'shipment_quantity', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
386
387        $objFormParam->addParam('商品項番', 'no', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
388        $objFormParam->addParam('追加商品規格ID', 'add_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
389        $objFormParam->addParam('修正商品規格ID', 'edit_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
390        $objFormParam->addParam('アンカーキー', 'anchor_key', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
391    }
392
393    /**
394     * 複数配送用フォームの初期化を行う.
395     *
396     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
397     * @return void
398     */
399    function lfInitMultipleParam(&$objFormParam) {
400        $objFormParam->addParam('商品規格ID', 'multiple_product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
401        $objFormParam->addParam('商品コード', 'multiple_product_code', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
402        $objFormParam->addParam('商品名', 'multiple_product_name', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
403        $objFormParam->addParam('規格1', 'multiple_classcategory_name1', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
404        $objFormParam->addParam('規格2', 'multiple_classcategory_name2', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
405        $objFormParam->addParam('単価', 'multiple_price', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
406        $objFormParam->addParam('数量', 'multiple_quantity', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
407        $objFormParam->addParam('お届け先', 'multiple_shipping_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
408    }
409
410    /**
411     * 複数配送入力フォームで入力された値を SC_FormParam へ設定する.
412     *
413     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
414     * @return void
415     */
416    function setMultipleItemTo(&$objFormParam) {
417        $arrMultipleKey = array('multiple_shipping_id',
418                                'multiple_product_class_id',
419                                'multiple_product_name',
420                                'multiple_product_code',
421                                'multiple_classcategory_name1',
422                                'multiple_classcategory_name2',
423                                'multiple_price',
424                                'multiple_quantity');
425        $arrMultipleParams = $objFormParam->getSwapArray($arrMultipleKey);
426
427        /*
428         * 複数配送フォームの入力値を shipping_id ごとにマージ
429         *
430         * $arrShipmentItem[お届け先ID][商品規格ID]['shipment_(key)'] = 値
431         */
432        $arrShipmentItem = array();
433        foreach ($arrMultipleParams as $arrMultiple) {
434            $shipping_id = $arrMultiple['multiple_shipping_id'];
435            $product_class_id = $arrMultiple['multiple_product_class_id'];
436            foreach ($arrMultiple as $key => $val) {
437                if ($key == 'multiple_quantity') {
438                    $arrShipmentItem[$shipping_id][$product_class_id][str_replace('multiple', 'shipment', $key)] += $val;
439                } else {
440                    $arrShipmentItem[$shipping_id][$product_class_id][str_replace('multiple', 'shipment', $key)] = $val;
441                }
442            }
443        }
444
445        /*
446         * フォームのお届け先ごとの配列を生成
447         *
448         * $arrShipmentForm['(key)'][$shipping_id][$item_index] = 値
449         * $arrProductQuantity[$shipping_id] = お届け先ごとの配送商品数量
450         */
451        $arrShipmentForm = array();
452        $arrProductQuantity = array();
453        $arrShippingIds = $objFormParam->getValue('shipping_id');
454        foreach ($arrShippingIds as $shipping_id) {
455            $item_index = 0;
456            foreach ($arrShipmentItem[$shipping_id] as $product_class_id => $shipment_item) {
457                foreach ($shipment_item as $key => $val) {
458                    $arrShipmentForm[$key][$shipping_id][$item_index] = $val;
459                }
460                // 受注商品の数量を設定
461                $arrQuantity[$product_class_id] += $shipment_item['shipment_quantity'];
462                $item_index++;
463            }
464            // お届け先ごとの配送商品数量を設定
465            $arrProductQuantity[$shipping_id] = count($arrShipmentItem[$shipping_id]);
466        }
467
468        $objFormParam->setParam($arrShipmentForm);
469        $objFormParam->setValue('shipping_product_quantity', $arrProductQuantity);
470
471        // 受注商品の数量を変更
472        $arrDest = array();
473        foreach ($objFormParam->getValue('product_class_id') as $n => $order_product_class_id) {
474            $arrDest['quantity'][$n] = 0;
475        }
476        foreach ($arrQuantity as $product_class_id => $quantity) {
477            foreach ($objFormParam->getValue('product_class_id') as $n => $order_product_class_id) {
478                if ($product_class_id == $order_product_class_id) {
479                    $arrDest['quantity'][$n] = $quantity;
480                }
481            }
482        }
483        $objFormParam->setParam($arrDest);
484    }
485
486    /**
487     * 受注データを取得して, SC_FormParam へ設定する.
488     *
489     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
490     * @param integer $order_id 取得元の受注ID
491     * @return void
492     */
493    function setOrderToFormParam(&$objFormParam, $order_id) {
494        $objPurchase = new SC_Helper_Purchase_Ex();
495
496        // 受注詳細を設定
497        $arrOrderDetail = $objPurchase->getOrderDetail($order_id, false);
498        $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($arrOrderDetail));
499
500        $arrShippingsTmp = $objPurchase->getShippings($order_id);
501        $arrShippings = array();
502        foreach ($arrShippingsTmp as $row) {
503            // お届け日の処理
504            if (!SC_Utils_Ex::isBlank($row['shipping_date'])) {
505                $ts = strtotime($row['shipping_date']);
506                $row['shipping_date_year'] = date('Y', $ts);
507                $row['shipping_date_month'] = date('n', $ts);
508                $row['shipping_date_day'] = date('j', $ts);
509            }
510            $arrShippings[$row['shipping_id']] = $row;
511        }
512        $objFormParam->setValue('shipping_quantity', count($arrShippings));
513        $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($arrShippings));
514
515        /*
516         * 配送商品を設定
517         *
518         * $arrShipmentItem['shipment_(key)'][$shipping_id][$item_index] = 値
519         * $arrProductQuantity[$shipping_id] = お届け先ごとの配送商品数量
520         */
521        $arrProductQuantity = array();
522        $arrShipmentItem = array();
523        foreach ($arrShippings as $shipping_id => $arrShipping) {
524            $arrProductQuantity[$shipping_id] = count($arrShipping['shipment_item']);
525            foreach ($arrShipping['shipment_item'] as $item_index => $arrItem) {
526                foreach ($arrItem as $item_key => $item_val) {
527                    $arrShipmentItem['shipment_' . $item_key][$shipping_id][$item_index] = $item_val;
528                }
529            }
530        }
531        $objFormParam->setValue('shipping_product_quantity', $arrProductQuantity);
532        $objFormParam->setParam($arrShipmentItem);
533
534        /*
535         * 受注情報を設定
536         * $arrOrderDetail と項目が重複しており, $arrOrderDetail は連想配列の値
537         * が渡ってくるため, $arrOrder で上書きする.
538         */
539        $arrOrder = $objPurchase->getOrder($order_id);
540        $objFormParam->setParam($arrOrder);
541
542        // ポイントを設定
543        list($db_point, $rollback_point) = SC_Helper_DB_Ex::sfGetRollbackPoint(
544            $order_id, $arrOrder['use_point'], $arrOrder['add_point'], $arrOrder['status']
545        );
546        $objFormParam->setValue('total_point', $db_point);
547        $objFormParam->setValue('point', $rollback_point);
548
549        if (!SC_Utils_Ex::isBlank($objFormParam->getValue('customer_id'))) {
550            $arrCustomer = SC_Helper_Customer_Ex::sfGetCustomerDataFromId($objFormParam->getValue('customer_id'));
551            $objFormParam->setValue('customer_point', $arrCustomer['point']);
552        }
553    }
554
555    /**
556     * 入力内容のチェックを行う.
557     *
558     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
559     * @return array エラーメッセージの配列
560     */
561    function lfCheckError(&$objFormParam) {
562        $objProduct = new SC_Product_Ex();
563
564        $arrErr = $objFormParam->checkError();
565
566        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
567            return $arrErr;
568        }
569
570        $arrValues = $objFormParam->getHashArray();
571
572        // 商品の種類数
573        $max = count($arrValues['quantity']);
574        $subtotal = 0;
575        $totalpoint = 0;
576        $totaltax = 0;
577        for ($i = 0; $i < $max; $i++) {
578            // 小計の計算
579            $subtotal += SC_Helper_DB_Ex::sfCalcIncTax($arrValues['price'][$i]) * $arrValues['quantity'][$i];
580            // 小計の計算
581            $totaltax += SC_Helper_DB_Ex::sfTax($arrValues['price'][$i]) * $arrValues['quantity'][$i];
582            // 加算ポイントの計算
583            $totalpoint += SC_Utils_Ex::sfPrePoint($arrValues['price'][$i], $arrValues['point_rate'][$i]) * $arrValues['quantity'][$i];
584
585            // 在庫数のチェック
586            $arrProduct = $objProduct->getDetailAndProductsClass($arrValues['product_class_id'][$i]);
587
588            // 編集前の値と比較するため受注詳細を取得
589            $objPurchase = new SC_Helper_Purchase_Ex();
590            $arrOrderDetail = SC_Utils_Ex::sfSwapArray($objPurchase->getOrderDetail($objFormParam->getValue('order_id'), false));
591
592            if ($arrProduct['stock_unlimited'] != '1'
593                && $arrProduct['stock'] < $arrValues['quantity'][$i] - $arrOrderDetail['quantity'][$i]) {
594                $class_name1 = $arrValues['classcategory_name1'][$i];
595                $class_name1 = SC_Utils_Ex::isBlank($class_name1) ? 'なし' : $class_name1;
596                $class_name2 = $arrValues['classcategory_name2'][$i];
597                $class_name2 = SC_Utils_Ex::isBlank($class_name2) ? 'なし' : $class_name2;
598                $arrErr['quantity'][$i] .= $arrValues['product_name'][$i]
599                    . '/(' . $class_name1 . ')/(' . $class_name2 . ') の在庫が不足しています。 設定できる数量は「'
600                    . ($arrOrderDetail['quantity'][$i] + $arrProduct['stock']) . '」までです。<br />';
601            }
602        }
603
604        // 消費税
605        $arrValues['tax'] = $totaltax;
606        // 小計
607        $arrValues['subtotal'] = $subtotal;
608        // 合計
609        $arrValues['total'] = $subtotal - $arrValues['discount'] + $arrValues['deliv_fee'] + $arrValues['charge'];
610        // お支払い合計
611        $arrValues['payment_total'] = $arrValues['total'] - ($arrValues['use_point'] * POINT_VALUE);
612
613        // 加算ポイント
614        $arrValues['add_point'] = SC_Helper_DB_Ex::sfGetAddPoint($totalpoint, $arrValues['use_point']);
615
616        // 最終保持ポイント
617        $arrValues['total_point'] = $objFormParam->getValue('point') - $arrValues['use_point'];
618
619        if ($arrValues['total'] < 0) {
620            $arrErr['total'] = '合計額がマイナス表示にならないように調整して下さい。<br />';
621        }
622
623        if ($arrValues['payment_total'] < 0) {
624            $arrErr['payment_total'] = 'お支払い合計額がマイナス表示にならないように調整して下さい。<br />';
625        }
626
627        if ($arrValues['total_point'] < 0) {
628            $arrErr['use_point'] = '最終保持ポイントがマイナス表示にならないように調整して下さい。<br />';
629        }
630
631        $objFormParam->setParam($arrValues);
632        return $arrErr;
633    }
634
635    /**
636     * DB更新処理
637     *
638     * @param integer $order_id 受注ID
639     * @param SC_Helper_Purchase $objPurchase SC_Helper_Purchase インスタンス
640     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
641     * @param string $message 通知メッセージ
642     * @param array $arrValuesBefore 更新前の受注情報
643     * @return integer $order_id 受注ID
644     *
645     * エラー発生時は負数を返す。
646     */
647    function doRegister($order_id, &$objPurchase, &$objFormParam, &$message, &$arrValuesBefore) {
648
649        $objQuery =& SC_Query_Ex::getSingletonInstance();
650        $arrValues = $objFormParam->getDbArray();
651
652        $where = 'order_id = ?';
653
654        $objQuery->begin();
655
656        // 支払い方法が変更されたら、支払い方法名称も更新
657        if ($arrValues['payment_id'] != $arrValuesBefore['payment_id']) {
658            $arrValues['payment_method'] = $this->arrPayment[$arrValues['payment_id']];
659            $arrValuesBefore['payment_id'] = NULL;
660        }
661
662        // 受注テーブルの更新
663        $order_id = $objPurchase->registerOrder($order_id, $arrValues);
664
665        $arrDetail = $objFormParam->getSwapArray(array(
666                'product_id',
667                'product_class_id',
668                'product_code',
669                'product_name',
670                'price', 'quantity',
671                'point_rate',
672                'classcategory_name1',
673                'classcategory_name2',
674        ));
675
676        // 変更しようとしている商品情報とDBに登録してある商品情報を比較することで、更新すべき数量を計算
677        $max = count($arrDetail);
678        $k = 0;
679        $arrStockData = array();
680        for ($i = 0; $i < $max; $i++) {
681            if (!empty($arrDetail[$i]['product_id'])) {
682                $arrPreDetail = $objQuery->select('*', 'dtb_order_detail', 'order_id = ? AND product_class_id = ?', array($order_id, $arrDetail[$i]['product_class_id']));
683                if (!empty($arrPreDetail) && $arrPreDetail[0]['quantity'] != $arrDetail[$i]['quantity']) {
684                    // 数量が変更された商品
685                    $arrStockData[$k]['product_class_id'] = $arrDetail[$i]['product_class_id'];
686                    $arrStockData[$k]['quantity'] = $arrPreDetail[0]['quantity'] - $arrDetail[$i]['quantity'];
687                    ++$k;
688                } elseif (empty($arrPreDetail)) {
689                    // 新しく追加された商品 もしくは 違う商品に変更された商品
690                    $arrStockData[$k]['product_class_id'] = $arrDetail[$i]['product_class_id'];
691                    $arrStockData[$k]['quantity'] = -$arrDetail[$i]['quantity'];
692                    ++$k;
693                }
694                $objQuery->delete('dtb_order_detail', 'order_id = ? AND product_class_id = ?', array($order_id, $arrDetail[$i]['product_class_id']));
695            }
696        }
697
698        // 上記の新しい商品のループでDELETEされなかった商品は、注文より削除された商品
699        $arrPreDetail = $objQuery->select('*', 'dtb_order_detail', 'order_id = ?', array($order_id));
700        foreach ($arrPreDetail AS $key=>$val) {
701            $arrStockData[$k]['product_class_id'] = $val['product_class_id'];
702            $arrStockData[$k]['quantity'] = $val['quantity'];
703            ++$k;
704        }
705
706        // 受注詳細データの更新
707        $objPurchase->registerOrderDetail($order_id, $arrDetail);
708
709        // 在庫数調整
710        if (ORDER_DELIV != $arrValues['status']
711            && ORDER_CANCEL != $arrValues['status']) {
712            foreach ($arrStockData AS $stock) {
713                $objQuery->update('dtb_products_class', array(),
714                                  'product_class_id = ?',
715                                  array($stock['product_class_id']),
716                                  array('stock' => 'stock + ?'),
717                                  array($stock['quantity']));
718            }
719        }
720
721        $arrAllShipping = $objFormParam->getSwapArray($this->arrShippingKeys);
722        $arrAllShipmentItem = $objFormParam->getSwapArray($this->arrShipmentItemKeys);
723
724        $arrDelivTime = $objPurchase->getDelivTime($objFormParam->getValue('deliv_id'));
725
726        $arrShippingValues = array();
727        foreach ($arrAllShipping as $shipping_index => $arrShipping) {
728            $shipping_id = $arrShipping['shipping_id'];
729            $arrShippingValues[$shipping_index] = $arrShipping;
730
731            $arrShippingValues[$shipping_index]['shipping_date']
732                = SC_Utils_Ex::sfGetTimestamp($arrShipping['shipping_date_year'],
733                                              $arrShipping['shipping_date_month'],
734                                              $arrShipping['shipping_date_day']);
735
736            // 配送業者IDを取得
737            $arrShippingValues[$shipping_index]['deliv_id'] = $objFormParam->getValue('deliv_id');
738
739            // お届け時間名称を取得
740            $arrShippingValues[$shipping_index]['shipping_time'] = $arrDelivTime[$arrShipping['time_id']];
741
742            // 複数配送の場合は配送商品を登録
743            if (!SC_Utils_Ex::isBlank($arrAllShipmentItem)) {
744                $arrShipmentValues = array();
745
746                foreach ($arrAllShipmentItem[$shipping_index] as $key => $arrItem) {
747                    $i = 0;
748                    foreach ($arrItem as $item) {
749                        $arrShipmentValues[$shipping_index][$i][str_replace('shipment_', '', $key)] = $item;
750                        $i++;
751                    }
752                }
753                $objPurchase->registerShipmentItem($order_id, $shipping_id,
754                                                   $arrShipmentValues[$shipping_index]);
755            }
756        }
757        $objPurchase->registerShipping($order_id, $arrShippingValues, false);
758        $objQuery->commit();
759        return $order_id;
760    }
761
762    /**
763     * 受注商品の追加/更新を行う.
764     *
765     * 小画面で選択した受注商品をフォームに反映させる.
766     *
767     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
768     * @return void
769     */
770    function doRegisterProduct(&$objFormParam) {
771        $product_class_id = $objFormParam->getValue('add_product_class_id');
772        if (SC_Utils_Ex::isBlank($product_class_id)) {
773            $product_class_id = $objFormParam->getValue('edit_product_class_id');
774            $changed_no = $objFormParam->getValue('no');
775        }
776        // FXIME バリデーションを通さず $objFormParam の値で DB 問い合わせしている。(管理機能ため、さほど問題は無いと思うものの…)
777
778        // 商品規格IDが指定されていない場合、例外エラーを発生
779        if (strlen($product_class_id) === 0) {
780            trigger_error('商品規格指定なし', E_USER_ERROR);
781        }
782
783        // 選択済みの商品であれば数量を1増やす
784        $exists = false;
785        $arrExistsProductClassIds = $objFormParam->getValue('product_class_id');
786        foreach (array_keys($arrExistsProductClassIds) as $key) {
787            $exists_product_class_id = $arrExistsProductClassIds[$key];
788            if ($exists_product_class_id == $product_class_id) {
789                $exists = true;
790                $exists_no = $key;
791                $arrExistsQuantity = $objFormParam->getValue('quantity');
792                $arrExistsQuantity[$key]++;
793                $objFormParam->setValue('quantity', $arrExistsQuantity);
794            }
795        }
796
797        // 新しく商品を追加した場合はフォームに登録
798        // 商品を変更した場合は、該当行を変更
799        if (!$exists) {
800            $objProduct = new SC_Product_Ex();
801            $arrProduct = $objProduct->getDetailAndProductsClass($product_class_id);
802
803            // 一致する商品規格がない場合、例外エラーを発生
804            if (empty($arrProduct)) {
805                trigger_error('商品規格一致なし', E_USER_ERROR);
806            }
807
808            $arrProduct['quantity'] = 1;
809            $arrProduct['price'] = $arrProduct['price02'];
810            $arrProduct['product_name'] = $arrProduct['name'];
811           
812            $arrUpdateKeys = array(
813                'product_id', 'product_class_id', 'product_type_id', 'point_rate',
814                'product_code', 'product_name', 'classcategory_name1', 'classcategory_name2',
815                'quantity', 'price',
816            );
817            foreach ($arrUpdateKeys as $key) {
818                $arrValues = $objFormParam->getValue($key);
819                // FIXME getValueで文字列が返る場合があるので配列であるかをチェック
820                if(!is_array($arrValues)) {
821                    $arrValues = array();
822                }
823               
824                if (isset($changed_no)) {
825                    $arrValues[$changed_no] = $arrProduct[$key];
826                } else {
827                    $added_no = 0;
828                    if (is_array($arrExistsProductClassIds)) {
829                        $added_no = count($arrExistsProductClassIds);
830                    }
831                    $arrValues[$added_no] = $arrProduct[$key];
832                }
833                $objFormParam->setValue($key, $arrValues);
834            }
835        } elseif (isset($changed_no) && $exists_no != $changed_no) {
836            // 変更したが、選択済みの商品だった場合は、変更対象行を削除。
837            $this->doDeleteProduct($changed_no, $objFormParam);
838        }
839    }
840
841    /**
842     * 受注商品を削除する.
843     *
844     * @param integer $delete_no 削除する受注商品の項番
845     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
846     * @return void
847     */
848    function doDeleteProduct($delete_no, &$objFormParam) {
849        $arrDeleteKeys = array(
850            'product_id', 'product_class_id', 'product_type_id', 'point_rate',
851            'product_code', 'product_name', 'classcategory_name1', 'classcategory_name2',
852            'quantity', 'price',
853        );
854        foreach ($arrDeleteKeys as $key) {
855            $arrNewValues = array();
856            $arrValues = $objFormParam->getValue($key);
857            foreach ($arrValues as $index => $val) {
858                if ($index != $delete_no) {
859                    $arrNewValues[] = $val;
860                }
861            }
862            $objFormParam->setValue($key, $arrNewValues);
863        }
864    }
865
866    /**
867     * お届け先を追加する.
868     *
869     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
870     * @return void
871     */
872    function addShipping(&$objFormParam) {
873        $objFormParam->setValue('shipping_quantity',
874                                $objFormParam->getValue('shipping_quantity') + 1);
875        $arrShippingIds = $objFormParam->getValue('shipping_id');
876        $arrShippingIds[] = max($arrShippingIds) + 1;
877        $objFormParam->setValue('shipping_id', $arrShippingIds);
878    }
879
880    /**
881     * 会員情報をフォームに設定する.
882     *
883     * @param integer $customer_id 会員ID
884     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
885     * @return void
886     */
887    function setCustomerTo($customer_id, &$objFormParam) {
888        $arrCustomer = SC_Helper_Customer_Ex::sfGetCustomerDataFromId($customer_id);
889        foreach ($arrCustomer as $key => $val) {
890            $objFormParam->setValue('order_' . $key, $val);
891        }
892        $objFormParam->setValue('customer_id', $customer_id);
893        $objFormParam->setValue('customer_point', $arrCustomer['point']);
894    }
895
896    /**
897     * アンカーキーを取得する.
898     *
899     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
900     * @return アンカーキーの文字列
901     */
902    function getAnchorKey(&$objFormParam) {
903        $ancor_key = $objFormParam->getValue('anchor_key');
904        if (!SC_Utils_Ex::isBlank($ancor_key)) {
905            return "location.hash='#" . htmlentities(urlencode($ancor_key), ENT_QUOTES) . "'";
906        }
907        return '';
908    }
909}
Note: See TracBrowser for help on using the repository browser.