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

Revision 22543, 54.6 KB checked in by pineray, 11 years ago (diff)

#2136 SC_Helper_Deliveryクラスを作成

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2013 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24// {{{ 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    var $arrProductKeys = array(
70        'product_id',
71        'product_class_id',
72        'product_type_id',
73        'point_rate',
74        'product_code',
75        'product_name',
76        'classcategory_name1',
77        'classcategory_name2',
78        'quantity',
79        'price',
80        'tax_rate',
81        'tax_rule'
82    );
83
84    // }}}
85    // {{{ functions
86
87    /**
88     * Page を初期化する.
89     *
90     * @return void
91     */
92    function init() {
93        parent::init();
94        $this->tpl_mainpage = 'order/edit.tpl';
95        $this->tpl_mainno = 'order';
96        $this->tpl_maintitle = '受注管理';
97        $this->tpl_subtitle = '受注登録';
98
99        $masterData = new SC_DB_MasterData_Ex();
100        $this->arrPref = $masterData->getMasterData('mtb_pref');
101        $this->arrORDERSTATUS = $masterData->getMasterData('mtb_order_status');
102        $this->arrDeviceType = $masterData->getMasterData('mtb_device_type');
103
104        $objDate = new SC_Date_Ex(RELEASE_YEAR);
105        $this->arrYearShippingDate = $objDate->getYear('', date('Y'), '');
106        $this->arrMonthShippingDate = $objDate->getMonth(true);
107        $this->arrDayShippingDate = $objDate->getDay(true);
108
109        // 支払い方法の取得
110        $this->arrPayment = SC_Helper_Payment_Ex::getIDValueList();
111
112        // 配送業者の取得
113        $this->arrDeliv = SC_Helper_Delivery_Ex::getIDValueList();
114
115        $this->arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
116
117        $this->httpCacheControl('nocache');
118    }
119
120    /**
121     * Page のプロセス.
122     *
123     * @return void
124     */
125    function process() {
126        $this->action();
127        $this->sendResponse();
128    }
129
130    /**
131     * Page のアクション.
132     *
133     * @return void
134     */
135    function action() {
136
137        $objPurchase = new SC_Helper_Purchase_Ex();
138        $objFormParam = new SC_FormParam_Ex();
139
140        // パラメーター情報の初期化
141        $this->lfInitParam($objFormParam);
142        $objFormParam->setParam($_REQUEST);
143        $objFormParam->convParam();
144        $order_id = $objFormParam->getValue('order_id');
145        $arrValuesBefore = array();
146
147        // DBから受注情報を読み込む
148        if (!SC_Utils_Ex::isBlank($order_id)) {
149            $this->setOrderToFormParam($objFormParam, $order_id);
150            $this->tpl_subno = 'index';
151            $arrValuesBefore['payment_id'] = $objFormParam->getValue('payment_id');
152            $arrValuesBefore['payment_method'] = $objFormParam->getValue('payment_method');
153        } else {
154            $this->tpl_subno = 'add';
155            $this->tpl_mode = 'add';
156            $arrValuesBefore['payment_id'] = NULL;
157            $arrValuesBefore['payment_method'] = NULL;
158            // お届け先情報を空情報で表示
159            $arrShippingIds[] = null;
160            $objFormParam->setValue('shipping_id', $arrShippingIds);
161
162            // 新規受注登録で入力エラーがあった場合の画面表示用に、会員の現在ポイントを取得
163            if (!SC_Utils_Ex::isBlank($objFormParam->getValue('customer_id'))) {
164                $customer_id = $objFormParam->getValue('customer_id');
165                $arrCustomer = SC_Helper_Customer_Ex::sfGetCustomerDataFromId($customer_id);
166                $objFormParam->setValue('customer_point', $arrCustomer['point']);
167
168                // 新規受注登録で、ポイント利用できるように現在ポイントを設定
169                $objFormParam->setValue('point', $arrCustomer['point']);
170            }
171        }
172
173        $this->arrSearchHidden = $objFormParam->getSearchArray();
174
175        switch ($this->getMode()) {
176            case 'pre_edit':
177            case 'order_id':
178                break;
179
180            case 'edit':
181                $objFormParam->setParam($_POST);
182                $objFormParam->convParam();
183                //複数配送時に各商品の総量を設定
184                $this->setProductsQuantity($objFormParam);
185                $this->arrErr = $this->lfCheckError($objFormParam);
186                if (SC_Utils_Ex::isBlank($this->arrErr)) {
187                    $message = '受注を編集しました。';
188                    $order_id = $this->doRegister($order_id, $objPurchase, $objFormParam, $message, $arrValuesBefore);
189                    if ($order_id >= 0) {
190                        $this->setOrderToFormParam($objFormParam, $order_id);
191                    }
192                    $this->tpl_onload = "window.alert('" . $message . "');";
193                }
194                break;
195
196            case 'add':
197                if ($_SERVER['REQUEST_METHOD'] == 'POST') {
198                    $objFormParam->setParam($_POST);
199                    $objFormParam->convParam();
200                    //複数配送時に各商品の総量を設定
201                    $this->setProductsQuantity($objFormParam);
202                    $this->arrErr = $this->lfCheckError($objFormParam);
203                    if (SC_Utils_Ex::isBlank($this->arrErr)) {
204                        $message = '受注を登録しました。';
205                        $order_id = $this->doRegister(null, $objPurchase, $objFormParam, $message, $arrValuesBefore);
206                        if ($order_id >= 0) {
207                            $this->tpl_mode = 'edit';
208                            $objFormParam->setValue('order_id', $order_id);
209                            $this->setOrderToFormParam($objFormParam, $order_id);
210                        }
211                        $this->tpl_onload = "window.alert('" . $message . "');";
212                    }
213                }
214
215                break;
216
217            // 再計算
218            case 'recalculate':
219            //支払い方法の選択
220            case 'payment':
221            // 配送業者の選択
222            case 'deliv':
223                $objFormParam->setParam($_POST);
224                $objFormParam->convParam();
225                //複数配送時に各商品の総量を設定
226                $this->setProductsQuantity($objFormParam);
227                $this->arrErr = $this->lfCheckError($objFormParam);
228                break;
229
230            // 商品削除
231            case 'delete_product':
232                $objFormParam->setParam($_POST);
233                $objFormParam->convParam();
234                $delete_no = $objFormParam->getValue('delete_no');
235                $this->doDeleteProduct($delete_no, $objFormParam);
236                //複数配送時に各商品の総量を設定
237                $this->setProductsQuantity($objFormParam);
238                $this->arrErr = $this->lfCheckError($objFormParam);
239                break;
240
241            // 商品追加ポップアップより商品選択
242            case 'select_product_detail':
243                $objFormParam->setParam($_POST);
244                $objFormParam->convParam();
245                $this->doRegisterProduct($objFormParam);
246                //複数配送時に各商品の総量を設定
247                $this->setProductsQuantity($objFormParam);
248                $this->arrErr = $this->lfCheckError($objFormParam);
249                break;
250
251            // 会員検索ポップアップより会員指定
252            case 'search_customer':
253                $objFormParam->setParam($_POST);
254                $objFormParam->convParam();
255                $customer_birth = $this->setCustomerTo($objFormParam->getValue('edit_customer_id'),
256                                     $objFormParam);
257                // 加算ポイントの計算
258                if (USE_POINT === true && $this->tpl_mode == 'add'){
259                    $birth_point = 0;
260                    if ($customer_birth){
261                        $arrRet = preg_split('|[- :/]|', $customer_birth);
262                        $birth_date = intval($arrRet[1]);
263                        $now_date   = intval(date('m'));
264                        // 誕生日月であった場合
265                        if ($birth_date == $now_date) {
266                            $birth_point = BIRTH_MONTH_POINT;
267                        }
268                    }
269                    $objFormParam->setValue("birth_point",$birth_point);
270                }
271                $this->arrErr = $this->lfCheckError($objFormParam);
272                break;
273
274                // 複数配送設定表示
275            case 'multiple':
276                $objFormParam->setParam($_POST);
277                $objFormParam->convParam();
278                $this->arrErr = $this->lfCheckError($objFormParam);
279                break;
280
281                // 複数配送設定を反映
282            case 'multiple_set_to':
283                $this->lfInitMultipleParam($objFormParam);
284                $objFormParam->setParam($_POST);
285                $objFormParam->convParam();
286                $this->setMultipleItemTo($objFormParam);
287                break;
288
289                // お届け先の追加
290            case 'append_shipping':
291                $objFormParam->setParam($_POST);
292                $objFormParam->convParam();
293                $this->addShipping($objFormParam);
294                break;
295
296            default:
297                break;
298        }
299
300        $this->arrForm        = $objFormParam->getFormParamList();
301        $this->arrAllShipping = $objFormParam->getSwapArray(array_merge($this->arrShippingKeys, $this->arrShipmentItemKeys));
302        $this->top_shipping_id      = array_shift((array_keys($this->arrAllShipping)));
303        $this->arrDelivTime   = $objPurchase->getDelivTime($objFormParam->getValue('deliv_id'));
304        $this->tpl_onload .= $this->getAnchorKey($objFormParam);
305        if ($arrValuesBefore['payment_id'])
306            $this->arrPayment[$arrValuesBefore['payment_id']] = $arrValuesBefore['payment_method'];
307    }
308
309/**
310 * デストラクタ.
311 *
312 * @return void
313 */
314function destroy() {
315    parent::destroy();
316}
317
318/**
319 * パラメーター情報の初期化を行う.
320 *
321 * @param SC_FormParam $objFormParam SC_FormParam インスタンス
322 * @return void
323 */
324function lfInitParam(&$objFormParam) {
325    // 検索条件のパラメーターを初期化
326    parent::lfInitParam($objFormParam);
327
328    // お客様情報
329    $objFormParam->addParam('注文者 お名前(姓)', 'order_name01', STEXT_LEN, 'KVa', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
330    $objFormParam->addParam('注文者 お名前(名)', 'order_name02', STEXT_LEN, 'KVa', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
331    $objFormParam->addParam('注文者 お名前(フリガナ・姓)', 'order_kana01', STEXT_LEN, 'KVCa', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
332    $objFormParam->addParam('注文者 お名前(フリガナ・名)', 'order_kana02', STEXT_LEN, 'KVCa', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
333    $objFormParam->addParam('メールアドレス', 'order_email', null, 'KVCa', array('NO_SPTAB', 'EMAIL_CHECK', 'EMAIL_CHAR_CHECK'));
334    $objFormParam->addParam('郵便番号1', 'order_zip01', ZIP01_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
335    $objFormParam->addParam('郵便番号2', 'order_zip02', ZIP02_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
336    $objFormParam->addParam('都道府県', 'order_pref', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
337    $objFormParam->addParam('住所1', 'order_addr01', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
338    $objFormParam->addParam('住所2', 'order_addr02', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
339    $objFormParam->addParam('電話番号1', 'order_tel01', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
340    $objFormParam->addParam('電話番号2', 'order_tel02', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
341    $objFormParam->addParam('電話番号3', 'order_tel03', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
342    $objFormParam->addParam('FAX番号1', 'order_fax01', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
343    $objFormParam->addParam('FAX番号2', 'order_fax02', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
344    $objFormParam->addParam('FAX番号3', 'order_fax03', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
345
346    // 受注商品情報
347    $objFormParam->addParam('値引き', 'discount', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
348    $objFormParam->addParam('送料', 'deliv_fee', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
349    $objFormParam->addParam('手数料', 'charge', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
350
351    // ポイント機能ON時のみ
352    if (USE_POINT !== false) {
353        $objFormParam->addParam('利用ポイント', 'use_point', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
354    }
355
356    $objFormParam->addParam('配送業者', 'deliv_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
357    $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
358    $objFormParam->addParam('対応状況', 'status', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
359    $objFormParam->addParam('お支払方法名称', 'payment_method');
360
361
362    // 受注詳細情報
363    $objFormParam->addParam('商品種別ID', 'product_type_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
364    $objFormParam->addParam('単価', 'price', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
365    $objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
366    $objFormParam->addParam('商品ID', 'product_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
367    $objFormParam->addParam('商品規格ID', 'product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
368    $objFormParam->addParam('ポイント付与率', 'point_rate');
369    $objFormParam->addParam('商品コード', 'product_code');
370    $objFormParam->addParam('商品名', 'product_name');
371    $objFormParam->addParam('規格名1', 'classcategory_name1');
372    $objFormParam->addParam('規格名2', 'classcategory_name2');
373    $objFormParam->addParam('税率', 'tax_rate');
374    $objFormParam->addParam('課税規則', 'tax_rule');
375    $objFormParam->addParam('メモ', 'note', MTEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
376    $objFormParam->addParam('削除用項番', 'delete_no', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
377
378    // DB読込用
379    $objFormParam->addParam('小計', 'subtotal');
380    $objFormParam->addParam('合計', 'total');
381    $objFormParam->addParam('支払い合計', 'payment_total');
382    $objFormParam->addParam('加算ポイント', 'add_point');
383    $objFormParam->addParam('お誕生日ポイント', 'birth_point', null, 'n', array(), 0);
384    $objFormParam->addParam('消費税合計', 'tax');
385    $objFormParam->addParam('最終保持ポイント', 'total_point');
386    $objFormParam->addParam('会員ID', 'customer_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
387    $objFormParam->addParam('会員ID', 'edit_customer_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
388    $objFormParam->addParam('現在のポイント', 'customer_point');
389    $objFormParam->addParam('受注前ポイント', 'point');
390    $objFormParam->addParam('注文番号', 'order_id');
391    $objFormParam->addParam('受注日', 'create_date');
392    $objFormParam->addParam('発送日', 'commit_date');
393    $objFormParam->addParam('備考', 'message');
394    $objFormParam->addParam('入金日', 'payment_date');
395    $objFormParam->addParam('端末種別', 'device_type_id');
396    $objFormParam->addParam('税率', 'order_tax_rate');
397    $objFormParam->addParam('課税規則', 'order_tax_rule');
398
399    // 複数情報
400    $objFormParam->addParam('配送数', 'shipping_quantity', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
401    $objFormParam->addParam('配送ID', 'shipping_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), 0);
402    $objFormParam->addParam('お名前(姓)', 'shipping_name01', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
403    $objFormParam->addParam('お名前(名)', 'shipping_name02', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
404    $objFormParam->addParam('お名前(フリガナ・姓)', 'shipping_kana01', STEXT_LEN, 'KVCa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
405    $objFormParam->addParam('お名前(フリガナ・名)', 'shipping_kana02', STEXT_LEN, 'KVCa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
406    $objFormParam->addParam('郵便番号1', 'shipping_zip01', ZIP01_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
407    $objFormParam->addParam('郵便番号2', 'shipping_zip02', ZIP02_LEN, 'n', array('NUM_CHECK', 'NUM_COUNT_CHECK'));
408    $objFormParam->addParam('都道府県', 'shipping_pref', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
409    $objFormParam->addParam('住所1', 'shipping_addr01', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
410    $objFormParam->addParam('住所2', 'shipping_addr02', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
411    $objFormParam->addParam('電話番号1', 'shipping_tel01', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
412    $objFormParam->addParam('電話番号2', 'shipping_tel02', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
413    $objFormParam->addParam('電話番号3', 'shipping_tel03', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
414    $objFormParam->addParam('FAX番号1', 'shipping_fax01', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
415    $objFormParam->addParam('FAX番号2', 'shipping_fax02', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
416    $objFormParam->addParam('FAX番号3', 'shipping_fax03', TEL_ITEM_LEN, 'n', array('MAX_LENGTH_CHECK' ,'NUM_CHECK'));
417    $objFormParam->addParam('お届け時間ID', 'time_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
418    $objFormParam->addParam('お届け日(年)', 'shipping_date_year', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
419    $objFormParam->addParam('お届け日(月)', 'shipping_date_month', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
420    $objFormParam->addParam('お届け日(日)', 'shipping_date_day', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
421    $objFormParam->addParam('お届け日', 'shipping_date', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
422    $objFormParam->addParam('配送商品数量', 'shipping_product_quantity', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
423
424    $objFormParam->addParam('商品規格ID', 'shipment_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
425    $objFormParam->addParam('商品コード', 'shipment_product_code');
426    $objFormParam->addParam('商品名', 'shipment_product_name');
427    $objFormParam->addParam('規格名1', 'shipment_classcategory_name1');
428    $objFormParam->addParam('規格名2', 'shipment_classcategory_name2');
429    $objFormParam->addParam('単価', 'shipment_price', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
430    $objFormParam->addParam('数量', 'shipment_quantity', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
431
432    $objFormParam->addParam('商品項番', 'no', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
433    $objFormParam->addParam('追加商品規格ID', 'add_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
434    $objFormParam->addParam('修正商品規格ID', 'edit_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
435    $objFormParam->addParam('対象届け先ID', 'select_shipping_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
436    $objFormParam->addParam('アンカーキー', 'anchor_key', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
437}
438
439/**
440 * 複数配送用フォームの初期化を行う.
441 *
442 * @param SC_FormParam $objFormParam SC_FormParam インスタンス
443 * @return void
444 */
445function lfInitMultipleParam(&$objFormParam) {
446    $objFormParam->addParam('商品規格ID', 'multiple_product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
447    $objFormParam->addParam('商品コード', 'multiple_product_code', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
448    $objFormParam->addParam('商品名', 'multiple_product_name', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
449    $objFormParam->addParam('規格1', 'multiple_classcategory_name1', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
450    $objFormParam->addParam('規格2', 'multiple_classcategory_name2', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
451    $objFormParam->addParam('単価', 'multiple_price', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
452    $objFormParam->addParam('数量', 'multiple_quantity', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), 1);
453    $objFormParam->addParam('お届け先', 'multiple_shipping_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
454}
455
456/**
457 * 複数配送入力フォームで入力された値を SC_FormParam へ設定する.
458 *
459 * @param SC_FormParam $objFormParam SC_FormParam インスタンス
460 * @return void
461 */
462function setMultipleItemTo(&$objFormParam) {
463    $arrMultipleKey = array('multiple_shipping_id',
464            'multiple_product_class_id',
465            'multiple_product_name',
466            'multiple_product_code',
467            'multiple_classcategory_name1',
468            'multiple_classcategory_name2',
469            'multiple_price',
470            'multiple_quantity');
471    $arrMultipleParams = $objFormParam->getSwapArray($arrMultipleKey);
472
473    /*
474     * 複数配送フォームの入力値を shipping_id ごとにマージ
475     *
476     * $arrShipmentItem[お届け先ID][商品規格ID]['shipment_(key)'] = 値
477     */
478    $arrShipmentItem = array();
479    foreach ($arrMultipleParams as $arrMultiple) {
480        $shipping_id = $arrMultiple['multiple_shipping_id'];
481        $product_class_id = $arrMultiple['multiple_product_class_id'];
482        foreach ($arrMultiple as $key => $val) {
483            if ($key == 'multiple_quantity') {
484                $arrShipmentItem[$shipping_id][$product_class_id][str_replace('multiple', 'shipment', $key)] += $val;
485            } else {
486                $arrShipmentItem[$shipping_id][$product_class_id][str_replace('multiple', 'shipment', $key)] = $val;
487            }
488        }
489    }
490
491    /*
492     * フォームのお届け先ごとの配列を生成
493     *
494     * $arrShipmentForm['(key)'][$shipping_id][$item_index] = 値
495     * $arrProductQuantity[$shipping_id] = お届け先ごとの配送商品数量
496     */
497    $arrShipmentForm = array();
498    $arrProductQuantity = array();
499    $arrShippingIds = $objFormParam->getValue('shipping_id');
500    foreach ($arrShippingIds as $shipping_id) {
501        $item_index = 0;
502        foreach ($arrShipmentItem[$shipping_id] as $product_class_id => $shipment_item) {
503            foreach ($shipment_item as $key => $val) {
504                $arrShipmentForm[$key][$shipping_id][$item_index] = $val;
505            }
506            // 受注商品の数量を設定
507            $arrQuantity[$product_class_id] += $shipment_item['shipment_quantity'];
508            $item_index++;
509        }
510        // お届け先ごとの配送商品数量を設定
511        $arrProductQuantity[$shipping_id] = count($arrShipmentItem[$shipping_id]);
512    }
513
514    $objFormParam->setParam($arrShipmentForm);
515    $objFormParam->setValue('shipping_product_quantity', $arrProductQuantity);
516
517    // 受注商品の数量を変更
518    $arrDest = array();
519    foreach ($objFormParam->getValue('product_class_id') as $n => $order_product_class_id) {
520        $arrDest['quantity'][$n] = 0;
521    }
522    foreach ($arrQuantity as $product_class_id => $quantity) {
523        foreach ($objFormParam->getValue('product_class_id') as $n => $order_product_class_id) {
524            if ($product_class_id == $order_product_class_id) {
525                $arrDest['quantity'][$n] = $quantity;
526            }
527        }
528    }
529    $objFormParam->setParam($arrDest);
530}
531
532/**
533 * 受注データを取得して, SC_FormParam へ設定する.
534 *
535 * @param SC_FormParam $objFormParam SC_FormParam インスタンス
536 * @param integer $order_id 取得元の受注ID
537 * @return void
538 */
539function setOrderToFormParam(&$objFormParam, $order_id) {
540    $objPurchase = new SC_Helper_Purchase_Ex();
541
542    // 受注詳細を設定
543    $arrOrderDetail = $objPurchase->getOrderDetail($order_id, false);
544    $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($arrOrderDetail));
545
546    $arrShippingsTmp = $objPurchase->getShippings($order_id);
547    $arrShippings = array();
548    foreach ($arrShippingsTmp as $row) {
549        // お届け日の処理
550        if (!SC_Utils_Ex::isBlank($row['shipping_date'])) {
551            $ts = strtotime($row['shipping_date']);
552            $row['shipping_date_year'] = date('Y', $ts);
553            $row['shipping_date_month'] = date('n', $ts);
554            $row['shipping_date_day'] = date('j', $ts);
555        }
556        $arrShippings[$row['shipping_id']] = $row;
557    }
558    $objFormParam->setValue('shipping_quantity', count($arrShippings));
559    $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($arrShippings));
560
561    /*
562     * 配送商品を設定
563     *
564     * $arrShipmentItem['shipment_(key)'][$shipping_id][$item_index] = 値
565     * $arrProductQuantity[$shipping_id] = お届け先ごとの配送商品数量
566     */
567    $arrProductQuantity = array();
568    $arrShipmentItem = array();
569    foreach ($arrShippings as $shipping_id => $arrShipping) {
570        $arrProductQuantity[$shipping_id] = count($arrShipping['shipment_item']);
571        foreach ($arrShipping['shipment_item'] as $item_index => $arrItem) {
572            foreach ($arrItem as $item_key => $item_val) {
573                $arrShipmentItem['shipment_' . $item_key][$shipping_id][$item_index] = $item_val;
574            }
575        }
576    }
577    $objFormParam->setValue('shipping_product_quantity', $arrProductQuantity);
578    $objFormParam->setParam($arrShipmentItem);
579
580    /*
581     * 受注情報を設定
582     * $arrOrderDetail と項目が重複しており, $arrOrderDetail は連想配列の値
583     * が渡ってくるため, $arrOrder で上書きする.
584     */
585    $arrOrder = $objPurchase->getOrder($order_id);
586    $objFormParam->setParam($arrOrder);
587
588    // ポイントを設定
589    list($db_point, $rollback_point) = SC_Helper_DB_Ex::sfGetRollbackPoint(
590            $order_id, $arrOrder['use_point'], $arrOrder['add_point'], $arrOrder['status']
591            );
592    $objFormParam->setValue('total_point', $db_point);
593    $objFormParam->setValue('point', $rollback_point);
594
595    if (!SC_Utils_Ex::isBlank($objFormParam->getValue('customer_id'))) {
596        $arrCustomer = SC_Helper_Customer_Ex::sfGetCustomerDataFromId($objFormParam->getValue('customer_id'));
597        $objFormParam->setValue('customer_point', $arrCustomer['point']);
598    }
599}
600
601/**
602 * 入力内容のチェックを行う.
603 *
604 * @param SC_FormParam $objFormParam SC_FormParam インスタンス
605 * @return array エラーメッセージの配列
606 */
607function lfCheckError(&$objFormParam) {
608    $objProduct = new SC_Product_Ex();
609
610    $arrErr = $objFormParam->checkError();
611
612    if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
613        return $arrErr;
614    }
615
616    $arrValues = $objFormParam->getHashArray();
617
618    // 商品の種類数
619    $max = count($arrValues['quantity']);
620    $subtotal = 0;
621    $totalpoint = 0;
622    $totaltax = 0;
623    for ($i = 0; $i < $max; $i++) {
624        // 小計の計算
625        $subtotal += SC_Helper_DB_Ex::sfCalcIncTax($arrValues['price'][$i], $arrValues['tax_rate'][$i], $arrValues['tax_rule'][$i]) * $arrValues['quantity'][$i];
626        // 小計の計算
627        $totaltax += SC_Utils_Ex::sfTax($arrValues['price'][$i], $arrValues['tax_rate'][$i], $arrValues['tax_rule'][$i]) * $arrValues['quantity'][$i];
628        // 加算ポイントの計算
629        $totalpoint += SC_Utils_Ex::sfPrePoint($arrValues['price'][$i], $arrValues['point_rate'][$i]) * $arrValues['quantity'][$i];
630
631        // 在庫数のチェック
632        $arrProduct = $objProduct->getDetailAndProductsClass($arrValues['product_class_id'][$i]);
633
634        // 編集前の値と比較するため受注詳細を取得
635        $objPurchase = new SC_Helper_Purchase_Ex();
636        $arrOrderDetail = SC_Utils_Ex::sfSwapArray($objPurchase->getOrderDetail($objFormParam->getValue('order_id'), false));
637
638        if ($arrProduct['stock_unlimited'] != '1'
639                && $arrProduct['stock'] < $arrValues['quantity'][$i] - $arrOrderDetail['quantity'][$i]) {
640            $class_name1 = $arrValues['classcategory_name1'][$i];
641            $class_name1 = SC_Utils_Ex::isBlank($class_name1) ? 'なし' : $class_name1;
642            $class_name2 = $arrValues['classcategory_name2'][$i];
643            $class_name2 = SC_Utils_Ex::isBlank($class_name2) ? 'なし' : $class_name2;
644            $arrErr['quantity'][$i] .= $arrValues['product_name'][$i]
645                . '/(' . $class_name1 . ')/(' . $class_name2 . ') の在庫が不足しています。 設定できる数量は「'
646                . ($arrOrderDetail['quantity'][$i] + $arrProduct['stock']) . '」までです。<br />';
647        }
648    }
649
650    // 消費税
651    $arrValues['tax'] = $totaltax;
652    // 小計
653    $arrValues['subtotal'] = $subtotal;
654    // 合計
655    $arrValues['total'] = $subtotal - $arrValues['discount'] + $arrValues['deliv_fee'] + $arrValues['charge'];
656    // お支払い合計
657    $arrValues['payment_total'] = $arrValues['total'] - ($arrValues['use_point'] * POINT_VALUE);
658
659    // 加算ポイント
660    $arrValues['add_point'] = SC_Helper_DB_Ex::sfGetAddPoint($totalpoint, $arrValues['use_point']) + $arrValues['birth_point'];
661
662    // 最終保持ポイント
663    $arrValues['total_point'] = $objFormParam->getValue('point') - $arrValues['use_point'];
664
665    if ($arrValues['total'] < 0) {
666        $arrErr['total'] = '合計額がマイナス表示にならないように調整して下さい。<br />';
667    }
668
669    if ($arrValues['payment_total'] < 0) {
670        $arrErr['payment_total'] = 'お支払い合計額がマイナス表示にならないように調整して下さい。<br />';
671    }
672
673    if ($arrValues['total_point'] < 0) {
674        $arrErr['use_point'] = '最終保持ポイントがマイナス表示にならないように調整して下さい。<br />';
675    }
676
677    $objFormParam->setParam($arrValues);
678    return $arrErr;
679}
680
681    /**
682     * DB更新処理
683     *
684     * @param integer $order_id 受注ID
685     * @param SC_Helper_Purchase $objPurchase SC_Helper_Purchase インスタンス
686     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
687     * @param string $message 通知メッセージ
688     * @param array $arrValuesBefore 更新前の受注情報
689     * @return integer $order_id 受注ID
690     *
691     * エラー発生時は負数を返す。
692     */
693    function doRegister($order_id, &$objPurchase, &$objFormParam, &$message, &$arrValuesBefore) {
694
695        $objQuery =& SC_Query_Ex::getSingletonInstance();
696        $arrValues = $objFormParam->getDbArray();
697
698        $where = 'order_id = ?';
699
700        $objQuery->begin();
701
702        // 支払い方法が変更されたら、支払い方法名称も更新
703        if ($arrValues['payment_id'] != $arrValuesBefore['payment_id']) {
704            $arrValues['payment_method'] = $this->arrPayment[$arrValues['payment_id']];
705            $arrValuesBefore['payment_id'] = NULL;
706        }
707
708        // 受注テーブルの更新
709        $order_id = $objPurchase->registerOrder($order_id, $arrValues);
710
711        $arrDetail = $objFormParam->getSwapArray(array(
712                'product_id',
713                'product_class_id',
714                'product_code',
715                'product_name',
716                'price', 'quantity',
717                'point_rate',
718                'classcategory_name1',
719                'classcategory_name2',
720                'tax_rate',
721                'tax_rule'
722        ));
723
724        // 変更しようとしている商品情報とDBに登録してある商品情報を比較することで、更新すべき数量を計算
725        $max = count($arrDetail);
726        $k = 0;
727        $arrStockData = array();
728        for ($i = 0; $i < $max; $i++) {
729            if (!empty($arrDetail[$i]['product_id'])) {
730                $arrPreDetail = $objQuery->select('*', 'dtb_order_detail', 'order_id = ? AND product_class_id = ?', array($order_id, $arrDetail[$i]['product_class_id']));
731                if (!empty($arrPreDetail) && $arrPreDetail[0]['quantity'] != $arrDetail[$i]['quantity']) {
732                    // 数量が変更された商品
733                    $arrStockData[$k]['product_class_id'] = $arrDetail[$i]['product_class_id'];
734                    $arrStockData[$k]['quantity'] = $arrPreDetail[0]['quantity'] - $arrDetail[$i]['quantity'];
735                    ++$k;
736                } elseif (empty($arrPreDetail)) {
737                    // 新しく追加された商品 もしくは 違う商品に変更された商品
738                    $arrStockData[$k]['product_class_id'] = $arrDetail[$i]['product_class_id'];
739                    $arrStockData[$k]['quantity'] = -$arrDetail[$i]['quantity'];
740                    ++$k;
741                }
742                $objQuery->delete('dtb_order_detail', 'order_id = ? AND product_class_id = ?', array($order_id, $arrDetail[$i]['product_class_id']));
743            }
744        }
745
746        // 上記の新しい商品のループでDELETEされなかった商品は、注文より削除された商品
747        $arrPreDetail = $objQuery->select('*', 'dtb_order_detail', 'order_id = ?', array($order_id));
748        foreach ($arrPreDetail AS $key=>$val) {
749            $arrStockData[$k]['product_class_id'] = $val['product_class_id'];
750            $arrStockData[$k]['quantity'] = $val['quantity'];
751            ++$k;
752        }
753
754        // 受注詳細データの更新
755        $objPurchase->registerOrderDetail($order_id, $arrDetail);
756
757        // 在庫数調整
758        if (ORDER_DELIV != $arrValues['status']
759            && ORDER_CANCEL != $arrValues['status']) {
760            foreach ($arrStockData AS $stock) {
761                $objQuery->update('dtb_products_class', array(),
762                                  'product_class_id = ?',
763                                  array($stock['product_class_id']),
764                                  array('stock' => 'stock + ?'),
765                                  array($stock['quantity']));
766            }
767        }
768
769        $arrAllShipping = $objFormParam->getSwapArray($this->arrShippingKeys);
770        $arrAllShipmentItem = $objFormParam->getSwapArray($this->arrShipmentItemKeys);
771
772        $arrDelivTime = $objPurchase->getDelivTime($objFormParam->getValue('deliv_id'));
773        //商品単価を複数配送にも適応
774        $arrShippingValues = array();
775        $arrIsNotQuantityUp = array();
776        foreach ($arrAllShipping as $shipping_index => $arrShipping) {
777            $shipping_id = $arrShipping['shipping_id'];
778            $arrShippingValues[$shipping_index] = $arrShipping;
779
780            $arrShippingValues[$shipping_index]['shipping_date']
781                = SC_Utils_Ex::sfGetTimestamp($arrShipping['shipping_date_year'],
782                                              $arrShipping['shipping_date_month'],
783                                              $arrShipping['shipping_date_day']);
784
785            //商品単価を複数配送にも反映する
786            foreach ($arrDetail as $product_detail) {
787                foreach ($arrAllShipmentItem[$shipping_index]['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) {
788                    if($product_detail['product_class_id'] == $shipment_product_class_id){
789                        $arrAllShipmentItem[$shipping_index]['shipment_price'][$relation_index] = $product_detail['price'];
790                    }
791                }
792            }
793            // 配送業者IDを取得
794            $arrShippingValues[$shipping_index]['deliv_id'] = $objFormParam->getValue('deliv_id');
795
796            // お届け時間名称を取得
797            $arrShippingValues[$shipping_index]['shipping_time'] = $arrDelivTime[$arrShipping['time_id']];
798
799            // 複数配送の場合は配送商品を登録
800            if (!SC_Utils_Ex::isBlank($arrAllShipmentItem)) {
801                $arrShipmentValues = array();
802
803                foreach ($arrAllShipmentItem[$shipping_index] as $key => $arrItem) {
804                    $i = 0;
805                    foreach ($arrItem as $item) {
806                        $arrShipmentValues[$shipping_index][$i][str_replace('shipment_', '', $key)] = $item;
807                        $i++;
808                    }
809                }
810                $objPurchase->registerShipmentItem($order_id, $shipping_id,
811                                                   $arrShipmentValues[$shipping_index]);
812            }
813        }
814
815        $objPurchase->registerShipping($order_id, $arrShippingValues, false);
816        $objQuery->commit();
817        return $order_id;
818    }
819
820    /**
821     * 受注商品の追加/更新を行う.
822     *
823     * 小画面で選択した受注商品をフォームに反映させる.
824     *
825     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
826     * @return void
827     */
828    function doRegisterProduct(&$objFormParam) {
829        $product_class_id = $objFormParam->getValue('add_product_class_id');
830        if (SC_Utils_Ex::isBlank($product_class_id)) {
831            $product_class_id = $objFormParam->getValue('edit_product_class_id');
832            $changed_no = $objFormParam->getValue('no');
833            $this->shipmentEditProduct($objFormParam, $product_class_id, $changed_no);
834        }else{
835            $this->shipmentAddProduct($objFormParam, $product_class_id);
836        }
837    }
838
839    /**
840     * 受注商品を削除する.
841     *
842     * @param integer $delete_no 削除する受注商品の項番
843     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
844     * @return void
845     */
846    function doDeleteProduct($delete_no, &$objFormParam) {
847
848        $select_shipping_id    = $objFormParam->getValue('select_shipping_id');
849
850        //変更前のproduct_class_idが他の届け先にも存在するか
851        $arrPreShipmentProductClassIds = $objFormParam->getValue('shipment_product_class_id');
852        $arrPreProductClassIds         = $objFormParam->getValue('product_class_id');
853        $delete_product_class_id       = $arrPreShipmentProductClassIds[$select_shipping_id][$delete_no];
854
855        //配送先データ削除
856        $arrNewShipments = $this->deleteShipment($objFormParam, $this->arrShipmentItemKeys , $select_shipping_id, $delete_no);
857        $objFormParam->setParam($arrNewShipments);
858
859        $is_product_delete = true;
860        foreach ($arrNewShipments['shipment_product_class_id'] as $shipping_id => $arrShipmentProductClassIds) {
861            foreach ($arrShipmentProductClassIds as $relation_index => $shipment_product_class_id) {
862                if(in_array($delete_product_class_id, $arrShipmentProductClassIds)){
863                    $is_product_delete = false;
864                    break;
865                }
866            }
867        }
868
869        //商品情報から削除
870        if($is_product_delete){
871            $this->checkDeleteProducts($objFormParam, $arrPreProductClassIds, $delete_product_class_id, $this->arrProductKeys);
872        }
873    }
874
875    /**
876     * お届け先を追加する.
877     *
878     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
879     * @return void
880     */
881    function addShipping(&$objFormParam) {
882        $objFormParam->setValue('shipping_quantity',
883                                $objFormParam->getValue('shipping_quantity') + 1);
884        $arrShippingIds = $objFormParam->getValue('shipping_id');
885        $arrShippingIds[] = max($arrShippingIds) + 1;
886        $objFormParam->setValue('shipping_id', $arrShippingIds);
887    }
888
889    /**
890     * 会員情報をフォームに設定する.
891     *
892     * @param integer $customer_id 会員ID
893     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
894     * @return void
895     */
896    function setCustomerTo($customer_id, &$objFormParam) {
897        $arrCustomer = SC_Helper_Customer_Ex::sfGetCustomerDataFromId($customer_id);
898        foreach ($arrCustomer as $key => $val) {
899            $objFormParam->setValue('order_' . $key, $val);
900        }
901        $objFormParam->setValue('customer_id', $customer_id);
902        $objFormParam->setValue('customer_point', $arrCustomer['point']);
903
904        return $arrCustomer['birth'];
905    }
906
907    /**
908     * アンカーキーを取得する.
909     *
910     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
911     * @return アンカーキーの文字列
912     */
913    function getAnchorKey(&$objFormParam) {
914        $ancor_key = $objFormParam->getValue('anchor_key');
915        if (!SC_Utils_Ex::isBlank($ancor_key)) {
916            return "location.hash='#" . htmlentities(urlencode($ancor_key), ENT_QUOTES) . "'";
917        }
918        return '';
919    }
920
921    /**
922     * 商品を追加
923     *
924     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
925     * @param integer $add_product_class_id 追加商品規格ID
926     * @return void
927     */
928    function shipmentAddProduct(&$objFormParam, $add_product_class_id){
929
930        //複数配送に商品情報追加
931        $select_shipping_id = $objFormParam->getValue('select_shipping_id');
932
933        //届け先に選択済みの商品がある場合
934        $arrShipmentProducts = $this->getShipmentProducts($objFormParam);
935
936        if(in_array($add_product_class_id, $arrShipmentProducts['shipment_product_class_id'][$select_shipping_id])){
937            foreach ($arrShipmentProducts['shipment_product_class_id'][$select_shipping_id] as $relation_index => $shipment_product_class_id) {
938                if($shipment_product_class_id == $add_product_class_id){
939                    $arrShipmentProducts['shipment_quantity'][$select_shipping_id][$relation_index]++;
940                    break;
941                }
942            }
943        }else{
944
945            //届け先に選択商品がない場合
946            $objProduct = new SC_Product_Ex();
947            $arrAddProductInfo = $objProduct->getDetailAndProductsClass($add_product_class_id);
948
949            $arrShipmentProducts['shipment_product_class_id'][$select_shipping_id][] = $add_product_class_id;
950            $arrShipmentProducts['shipment_product_code'][$select_shipping_id][]     = $arrAddProductInfo['product_code'];
951            $arrShipmentProducts['shipment_product_name'][$select_shipping_id][]     = $arrAddProductInfo['name'];
952            $arrShipmentProducts['shipment_price'][$select_shipping_id][]            = $arrAddProductInfo['price02'];
953            $arrShipmentProducts['shipment_quantity'][$select_shipping_id][]         = 1;
954
955            //受注商品情報に追加
956            $arrPreProductClassIds = $objFormParam->getValue('product_class_id');
957            $arrProducts = $this->checkInsertOrderProducts($objFormParam, $arrPreProductClassIds, $add_product_class_id, $arrAddProductInfo);
958            $objFormParam->setParam($arrProducts);
959        }
960        $objFormParam->setParam($arrShipmentProducts);
961    }
962
963    /**
964     * 商品を変更
965     *
966     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
967     * @param integer $add_product_class_id 変更商品規格ID
968     * @param integer $change_no 変更対象
969     * @return void
970     */
971    function shipmentEditProduct(&$objFormParam, $edit_product_class_id, $change_no){
972        $arrPreProductClassIds = $objFormParam->getValue('product_class_id');
973        $select_shipping_id    = $objFormParam->getValue('select_shipping_id');
974
975        $arrShipmentProducts = $this->getShipmentProducts($objFormParam);
976
977        //既にあるデータは1つだけ数量を1増やす
978        $pre_shipment_product_class_id = $arrShipmentProducts['shipment_product_class_id'][$select_shipping_id][$change_no];
979        if($pre_shipment_product_class_id == $edit_product_class_id) {
980            $arrShipmentProducts['shipment_quantity'][$select_shipping_id][$change_no] ++;
981        }elseif(in_array($edit_product_class_id, $arrShipmentProducts['shipment_product_class_id'][$select_shipping_id])){
982            //配送先データ削除
983            $arrShipmentProducts = $this->deleteShipment($objFormParam, $this->arrShipmentItemKeys , $select_shipping_id, $change_no);
984            foreach ($arrShipmentProducts['shipment_product_class_id'][$select_shipping_id] as $relation_index => $shipment_product_class_id) {
985                if($shipment_product_class_id == $edit_product_class_id){
986                    $arrShipmentProducts['shipment_quantity'][$select_shipping_id][$relation_index] ++;
987                    break;
988                }
989            }
990        }else{
991            $objProduct = new SC_Product_Ex();
992            $arrAddProductInfo = $objProduct->getDetailAndProductsClass($edit_product_class_id);
993
994            //上書き
995            $this->changeShipmentProducts($arrShipmentProducts, $arrAddProductInfo, $select_shipping_id, $change_no);
996            //受注商品情報に追加
997            $arrProducts = $this->checkInsertOrderProducts($objFormParam, $arrPreProductClassIds, $edit_product_class_id, $arrAddProductInfo);
998            $objFormParam->setParam($arrProducts);
999        }
1000        $objFormParam->setParam($arrShipmentProducts);
1001
1002        //更新のみの場合、全配列を持っていないので、新しい配列を取得
1003        $arrNewShipmentProducts = $this->getShipmentProducts($objFormParam);
1004        $is_product_delete = true;
1005        //変更前のproduct_class_idが他の届け先にも存在するか
1006        foreach ($arrNewShipmentProducts['shipment_product_class_id'] as $shipping_id => $arrShipmentProductClassIds) {
1007            if(in_array($pre_shipment_product_class_id, $arrShipmentProductClassIds)){
1008                $is_product_delete = false;
1009                break;
1010            }
1011        }
1012
1013        //商品情報から削除
1014        if($is_product_delete){
1015            $this->checkDeleteProducts($objFormParam, $arrPreProductClassIds, $pre_shipment_product_class_id, $this->arrProductKeys);
1016        }
1017    }
1018
1019    /**
1020     * 複数配送のパラメータを取り出す
1021     *
1022     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
1023     * @return array 配送データ
1024     */
1025    function getShipmentProducts(&$objFormParam){
1026        $arrShipmentProducts['shipment_product_class_id']    = $objFormParam->getValue('shipment_product_class_id');
1027        $arrShipmentProducts['shipment_product_code']        = $objFormParam->getValue('shipment_product_code');
1028        $arrShipmentProducts['shipment_product_name']        = $objFormParam->getValue('shipment_product_name');
1029        $arrShipmentProducts['shipment_classcategory_name1'] = $objFormParam->getValue('shipment_classcategory_name1');
1030        $arrShipmentProducts['shipment_classcategory_name2'] = $objFormParam->getValue('shipment_classcategory_name2');
1031        $arrShipmentProducts['shipment_price']               = $objFormParam->getValue('shipment_price');
1032        $arrShipmentProducts['shipment_quantity']            = $objFormParam->getValue('shipment_quantity');
1033
1034        return $arrShipmentProducts;
1035    }
1036
1037    /**
1038     * 変更対象のデータを上書きする
1039     *
1040     * @param array   $arrShipmentProducts  変更対象配列
1041     * @param array   $arrProductInfo       上書きデータ
1042     * @param integer $shipping_id          配送先ID
1043     * @param array   $no                   変更対象
1044     * @return void
1045     */
1046    function changeShipmentProducts(&$arrShipmentProducts, $arrProductInfo, $shipping_id, $no){
1047        $arrShipmentProducts['shipment_product_class_id'][$shipping_id][$no]    = $arrProductInfo['product_class_id'];
1048        $arrShipmentProducts['shipment_product_code'][$shipping_id][$no]        = $arrProductInfo['product_code'];
1049        $arrShipmentProducts['shipment_product_name'][$shipping_id][$no]        = $arrProductInfo['name'];
1050        $arrShipmentProducts['shipment_classcategory_name1'][$shipping_id][$no] = $arrProductInfo['classcategory_name1'];
1051        $arrShipmentProducts['shipment_classcategory_name2'][$shipping_id][$no] = $arrProductInfo['classcategory_name2'];
1052        $arrShipmentProducts['shipment_price'][$shipping_id][$no]               = $arrProductInfo['price02'];
1053        $arrShipmentProducts['shipment_quantity'][$shipping_id][$no]            = 1;
1054    }
1055
1056    /**
1057     * 商品側の総量計算&セット
1058     *
1059     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
1060     * @return void
1061     */
1062    function setProductsQuantity(&$objFormParam){
1063        $arrShipmentsItems = $objFormParam->getSwapArray(array('shipment_product_class_id','shipment_quantity'));
1064        foreach ($arrShipmentsItems as $arritems) {
1065            foreach ($arritems['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) {
1066                $arrUpdateQuantity[$shipment_product_class_id] += $arritems['shipment_quantity'][$relation_index];
1067            }
1068        }
1069
1070        $arrProductsClass = $objFormParam->getValue('product_class_id');
1071        $arrProductsQuantity = $objFormParam->getValue('quantity');
1072        foreach ($arrProductsClass as $relation_key => $product_class_id) {
1073            $arrQuantity['quantity'][$relation_key] = $arrUpdateQuantity[$product_class_id];
1074        }
1075        $objFormParam->setParam($arrQuantity);
1076    }
1077
1078    /**
1079     * 削除対象の確認、削除をする
1080     *
1081     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
1082     * @param array   $arrProductClassIds      削除対象配列の商品規格ID
1083     * @param integer $delete_product_class_id 削除商品規格ID
1084     * @param array   $arrDeleteKeys            削除項目
1085     * @return void
1086     */
1087    function checkDeleteProducts(&$objFormParam, $arrProductClassIds, $delete_product_class_id, $arrDeleteKeys){
1088        foreach ($arrProductClassIds as $relation_index => $product_class_id) {
1089            //product_class_idの重複はないので、1つ削除したら完了
1090            if($product_class_id == $delete_product_class_id){
1091                foreach ($arrDeleteKeys as $delete_key) {
1092                    $arrProducts = $objFormParam->getValue($delete_key);
1093                    foreach ($arrProducts as $index => $product_info) {
1094                        if($index != $relation_index){
1095                            $arrUpdateParams[$delete_key][] = $product_info;
1096                        }
1097                    }
1098                    $objFormParam->setParam($arrUpdateParams);
1099                }
1100                break;
1101            }
1102        }
1103    }
1104
1105    /**
1106     * 配送先商品の削除の削除
1107     *
1108     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
1109     * @param array   $arrShipmentDeleteKeys   削除項目
1110     * @param integer $delete_shipping_id     削除配送ID
1111     * @param array   $delete_no               削除対象
1112     * @return void
1113     */
1114    function deleteShipment(&$objFormParam, $arrShipmentDeletKeys, $delete_shipping_id, $delete_no){
1115            foreach ($arrShipmentDeletKeys as $delete_key) {
1116                $arrShipments = $objFormParam->getValue($delete_key);
1117                foreach ($arrShipments as $shipp_id => $arrKeyData){
1118                    foreach ($arrKeyData as $relation_index => $shipment_info) {
1119                        if($relation_index != $delete_no || $shipp_id != $delete_shipping_id){
1120                            $arrUpdateParams[$delete_key][$shipp_id][] = $shipment_info;
1121                        }
1122                    }
1123                }
1124            }
1125            //$objFormParam->setParam($arrUpdateParams);
1126            return $arrUpdateParams;
1127        }
1128
1129
1130    /**
1131     * 受注商品一覧側に商品を追加
1132     *
1133     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
1134     * @param array   $arrProductClassIds      対象配列の商品規格ID
1135     * @param integer $indert_product_class_id 追加商品規格ID
1136     * @param array   $arrAddProductInfo        追加データ
1137     * @return array  $arrAddProducts           更新データ
1138     */
1139    function checkInsertOrderProducts(&$objFormParam, $arrProductClassIds, $insert_product_class_id, $arrAddProductInfo){
1140        if(!in_array($insert_product_class_id, $arrProductClassIds)){
1141            $arrAddProductInfo['product_name'] = ($arrAddProductInfo['product_name'])? $arrAddProductInfo['product_name']:$arrAddProductInfo['name'];
1142            $arrAddProductInfo['price']        = ($arrAddProductInfo['price'])? $arrAddProductInfo['price']:$arrAddProductInfo['price02'];
1143            $arrAddProductInfo['quantity']     = 1;
1144            $arrAddProductInfo['tax_rate']     = ($objFormParam->getValue('order_tax_rate') == '')? $this->arrInfo['tax']     :$objFormParam->getValue('order_tax_rate');
1145            $arrAddProductInfo['tax_rule']     = ($objFormParam->getValue('order_tax_rule') == '')? $this->arrInfo['tax_rule']:$objFormParam->getValue('order_tax_rule');
1146            foreach ($this->arrProductKeys as $insert_key) {
1147                $arrAddProducts[$insert_key]   = $objFormParam->getValue($insert_key);
1148                $arrAddProducts[$insert_key][] = $arrAddProductInfo[$insert_key];
1149            }
1150            return $arrAddProducts;
1151        }else{
1152            //受注商品の数量は、複数配送側の集計で出しているので、重複しても数量を増やさない。
1153            return null;
1154        }
1155    }
1156}
Note: See TracBrowser for help on using the repository browser.