[Svn-src-all:3581] [version-2_12-dev 22493] IssueID #2035 【受注編集画面】商品の追加、削除、変更を行った時も、複数配送の商品の更新がされない

undertree admin @ mail.ec-cube.net
2013年 2月 2日 (土) 19:25:53 JST


Subversion committed to /home/svn/open 22493
http://svn.ec-cube.net/open_trac/changeset/22493
┌────────────────────────────┐
│更新者 :  undertree                                    │
│更新日時:  2013-02-02 19:25:52 +0900 (土, 02  2月 2013)│
└────────────────────────────┘

Log:
--------------------------------------------------------
IssueID #2035 【受注編集画面】商品の追加、削除、変更を行った時も、複数配送の商品の更新がされない

Changed:                      [U:修正,A:追加,D:削除]
--------------------------------------------------------
U   branches/version-2_12-dev/data/Smarty/templates/admin/order/edit.tpl
U   branches/version-2_12-dev/data/Smarty/templates/admin/order/product_select.tpl
U   branches/version-2_12-dev/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php
U   branches/version-2_12-dev/data/class/pages/admin/order/LC_Page_Admin_Order_ProductSelect.php

変更: branches/version-2_12-dev/data/Smarty/templates/admin/order/edit.tpl
===================================================================
--- branches/version-2_12-dev/data/Smarty/templates/admin/order/edit.tpl	2013-02-01 09:26:53 UTC (rev 22492)
+++ branches/version-2_12-dev/data/Smarty/templates/admin/order/edit.tpl	2013-02-02 10:25:52 UTC (rev 22493)
@@ -38,7 +38,7 @@
         // お届け先名のinputタグのnameを取得
         var shipping_data = $('input[name^=shipping_name01]').attr('name'); 
         var shipping_slt  = shipping_data.split("shipping_name01");
-        
+
         var shipping_key = "[0]";
         if(shipping_slt.length > 1) {
             shipping_key = shipping_slt[1];
@@ -81,6 +81,12 @@
         return false;
     }
 
+    $(document).ready(function() {
+        if(<!--{$arrForm.shipping_quantity.value}--> > 1){
+            $("input[name^='quantity[']").attr("disabled","disabled");
+        }
+    });
+
 //-->
 </script>
 <form name="form1" id="form1" method="post" action="?">
@@ -91,6 +97,7 @@
 <input type="hidden" name="anchor_key" value="" />
 <input type="hidden" id="add_product_id" name="add_product_id" value="" />
 <input type="hidden" id="add_product_class_id" name="add_product_class_id" value="" />
+<input type="hidden" id="select_shipping_id" name="select_shipping_id" value="" />
 <input type="hidden" id="edit_product_id" name="edit_product_id" value="" />
 <input type="hidden" id="edit_product_class_id" name="edit_product_class_id" value="" />
 <input type="hidden" id="no" name="no" value="" />
@@ -273,7 +280,9 @@
     <h2 id="order_products">
         受注商品情報
         <a class="btn-normal" href="javascript:;" name="recalculate" onclick="fnModeSubmit('recalculate','anchor_key','order_products');">計算結果の確認</a>
-        <a class="btn-normal" href="javascript:;" name="add_product" onclick="win03('<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->order/product_select.php?order_id=<!--{$arrForm.order_id.value|h}-->', 'search', '615', '500'); return false;">商品の追加</a>
+        <!--{if $arrForm.shipping_quantity.value <= 1}-->
+        <a class="btn-normal" href="javascript:;" name="add_product" onclick="win03('<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->order/product_select.php?order_id=<!--{$arrForm.order_id.value|h}-->&amp;shipping_id=<!--{$top_shipping_id}-->', 'search', '615', '500'); return false;">商品の追加</a>
+        <!--{/if}-->
     </h2>
 
     <!--{if $arrErr.product_id}-->
@@ -302,9 +311,11 @@
                 <input type="hidden" name="classcategory_name1[<!--{$product_index}-->]" value="<!--{$arrForm.classcategory_name1.value[$product_index]|h}-->" id="classcategory_name1_<!--{$product_index}-->" />
                 <input type="hidden" name="classcategory_name2[<!--{$product_index}-->]" value="<!--{$arrForm.classcategory_name2.value[$product_index]|h}-->" id="classcategory_name2_<!--{$product_index}-->" />
                 <br />
-                <a class="btn-normal" href="javascript:;" name="change" onclick="win03('<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->order/product_select.php?no=<!--{$product_index}-->&amp;order_id=<!--{$arrForm.order_id.value|h}-->', 'search', '615', '500'); return false;">変更</a>
-                <!--{if count($arrForm.quantity.value) > 1}-->
-                    <a class="btn-normal" href="javascript:;" name="delete" onclick="fnSetFormVal('form1', 'delete_no', <!--{$product_index}-->); fnModeSubmit('delete_product','anchor_key','order_products'); return false;">削除</a>
+                <!--{if $arrForm.shipping_quantity.value <= 1}-->
+                    <a class="btn-normal" href="javascript:;" name="change" onclick="win03('<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->order/product_select.php?no=<!--{$product_index}-->&amp;order_id=<!--{$arrForm.order_id.value|h}-->&amp;shipping_id=<!--{$top_shipping_id}-->', 'search', '615', '500'); return false;">変更</a>
+                    <!--{if count($arrForm.quantity.value) > 1}-->
+                        <a class="btn-normal" href="javascript:;" name="delete" onclick="fnSetFormVal('form1', 'delete_no', <!--{$product_index}-->); fnSetFormVal('form1', 'select_shipping_id', '<!--{$top_shipping_id}-->'); fnModeSubmit('delete_product','anchor_key','order_products'); return false;">削除</a>
+                    <!--{/if}-->
                 <!--{/if}-->
             <input type="hidden" name="product_type_id[<!--{$product_index}-->]" value="<!--{$arrForm.product_type_id.value[$product_index]|h}-->" id="product_type_id_<!--{$product_index}-->" />
             <input type="hidden" name="product_id[<!--{$product_index}-->]" value="<!--{$arrForm.product_id.value[$product_index]|h}-->" id="product_id_<!--{$product_index}-->" />
@@ -428,6 +439,8 @@
         <!--{assign var=key value="shipping_id"}-->
         <input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->]" value="<!--{$arrShipping[$key]|default:"0"|h}-->" id="<!--{$key}-->_<!--{$shipping_index}-->" />
         <!--{if $arrForm.shipping_quantity.value > 1}-->
+            <h2>届け先商品情報&nbsp;<a class="btn-normal" href="javascript:;" name="add_product" onclick="win03('<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->order/product_select.php?order_id=<!--{$arrForm.order_id.value|h}-->&shipping_id=<!--{$shipping_index}-->', 'search', '615', '500'); return false;">商品の追加</a>
+            </h2>
             <!--{assign var=product_quantity value="shipping_product_quantity"}-->
             <input type="hidden" name="<!--{$product_quantity}-->[<!--{$shipping_index}-->]" value="<!--{$arrShipping[$product_quantity]|h}-->" />
 
@@ -458,6 +471,11 @@
                                 <input type="hidden" name="<!--{$key2}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key2][$item_index]|h}-->" />
                                 <input type="hidden" name="<!--{$key3}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key3][$item_index]|h}-->" />
                                 <!--{$arrShipping[$key1][$item_index]|h}-->/<!--{$arrShipping[$key2][$item_index]|default:"(なし)"|h}-->/<!--{$arrShipping[$key3][$item_index]|default:"(なし)"|h}-->
+                                <br />
+                                <a class="btn-normal" href="javascript:;" name="change" onclick="win03('<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->order/product_select.php?no=<!--{$item_index}-->&amp;order_id=<!--{$arrForm.order_id.value|h}-->&amp;shipping_id=<!--{$shipping_index}-->', 'search', '615', '500'); return false;">変更</a>
+                                <!--{if count($arrForm.quantity.value) > 1}-->
+                                <a class="btn-normal" href="javascript:;" name="delete" onclick="fnSetFormVal('form1', 'delete_no', <!--{$item_index}-->);fnSetFormVal('form1', 'select_shipping_id', <!--{$shipping_index}-->); fnModeSubmit('delete_product','anchor_key','order_products'); return false;">削除</a>
+                                <!--{/if}-->
                             </td>
                             <td class="right">
                                 <!--{assign var=key value="shipment_price"}-->
@@ -466,13 +484,34 @@
                             </td>
                             <td class="right">
                                 <!--{assign var=key value="shipment_quantity"}-->
-                                <!--{$arrShipping[$key][$item_index]|h}-->
-                                <input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key][$item_index]|h}-->" />
+                                <span class="attention"><!--{$arrErr[$key][$shipping_index][$item_index]}--></span>
+                                <input type="text" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key][$item_index]|h}-->" size="3" class="box3" maxlength="<!--{$arrForm[$key].length}-->" />
                             </td>
                         </tr>
                     <!--{/section}-->
                 </table>
             <!--{/if}-->
+        <!--{else}-->
+            <!-- 配送先が1つでも、shipment_itemを更新するために必要 -->
+            <!--{assign var=product_quantity value="shipping_product_quantity"}-->
+            <input type="hidden" name="<!--{$product_quantity}-->[<!--{$shipping_index}-->]" value="<!--{$arrShipping[$product_quantity]|h}-->" />
+            <!--{section name=item loop=$arrShipping.shipment_product_class_id|@count}-->
+                <!--{assign var=item_index value="`$smarty.section.item.index`"}-->
+                        <!--{assign var=key value="shipment_product_class_id"}-->
+                        <input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key][$item_index]|h}-->" />
+                        <!--{assign var=key value="shipment_product_code"}-->
+                        <input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key][$item_index]|h}-->" />
+                        <!--{assign var=key1 value="shipment_product_name"}-->
+                        <!--{assign var=key2 value="shipment_classcategory_name1"}-->
+                        <!--{assign var=key3 value="shipment_classcategory_name2"}-->
+                        <input type="hidden" name="<!--{$key1}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key1][$item_index]|h}-->" />
+                        <input type="hidden" name="<!--{$key2}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key2][$item_index]|h}-->" />
+                        <input type="hidden" name="<!--{$key3}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key3][$item_index]|h}-->" />
+                        <!--{assign var=key value="shipment_price"}-->
+                        <input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key][$item_index]|h}-->" />
+                        <!--{assign var=key value="shipment_quantity"}-->
+                        <input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key][$item_index]|h}-->" />
+            <!--{/section}-->
         <!--{/if}-->
 
         <table class="form">

変更: branches/version-2_12-dev/data/Smarty/templates/admin/order/product_select.tpl
===================================================================
--- branches/version-2_12-dev/data/Smarty/templates/admin/order/product_select.tpl	2013-02-01 09:26:53 UTC (rev 22492)
+++ branches/version-2_12-dev/data/Smarty/templates/admin/order/product_select.tpl	2013-02-02 10:25:52 UTC (rev 22493)
@@ -41,12 +41,16 @@
         var opner_product_id = 'add_product_id';
         var opner_product_class_id = 'add_product_class_id';
         var tpl_no = '<!--{$tpl_no}-->';
+        var shipping_id = '<!--{$shipping_id}-->';
 
         if (tpl_no != '') {
             opner_product_id = 'edit_product_id';
             opner_product_class_id = 'edit_product_class_id';
             fm1.getElementById("no").value = escape('<!--{$tpl_no}-->');
         }
+        if (shipping_id != '') {
+            fm1.getElementById("select_shipping_id").value = escape('<!--{$shipping_id}-->');
+        }
         if (document.getElementById(class1).type == 'select-one' && class1_id == '__unselected') {
             err_text = class_name1 + "を選択してください。\n";
         }
@@ -135,6 +139,7 @@
 <input name="mode" type="hidden" value="search" />
 <input name="anchor_key" type="hidden" value="" />
 <input name="search_pageno" type="hidden" value="" />
+<input name="shipping_id" type="hidden" value="<!--{$shipping_id}-->" />
 <input name="no" type="hidden" value="<!--{$tpl_no|h}-->" />
 <table class="form">
     <col width="20%" />

変更: branches/version-2_12-dev/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php	2013-02-01 09:26:53 UTC (rev 22492)
+++ branches/version-2_12-dev/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php	2013-02-02 10:25:52 UTC (rev 22493)
@@ -66,6 +66,21 @@
         'shipment_quantity',
     );
 
+    var $arrProductKeys = array(
+        'product_id',
+        'product_class_id',
+        'product_type_id',
+        'point_rate',
+        'product_code',
+        'product_name',
+        'classcategory_name1',
+        'classcategory_name2',
+        'quantity',
+        'price',
+        'tax_rate',
+        'tax_rule'
+    );
+
     // }}}
     // {{{ functions
 
@@ -165,6 +180,8 @@
             case 'edit':
                 $objFormParam->setParam($_POST);
                 $objFormParam->convParam();
+                //複数配送時に各商品の総量を設定
+                $this->setProductsQuantity($objFormParam);
                 $this->arrErr = $this->lfCheckError($objFormParam);
                 if (SC_Utils_Ex::isBlank($this->arrErr)) {
                     $message = '受注を編集しました。';
@@ -180,6 +197,8 @@
                 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                     $objFormParam->setParam($_POST);
                     $objFormParam->convParam();
+                    //複数配送時に各商品の総量を設定
+                    $this->setProductsQuantity($objFormParam);
                     $this->arrErr = $this->lfCheckError($objFormParam);
                     if (SC_Utils_Ex::isBlank($this->arrErr)) {
                         $message = '受注を登録しました。';
@@ -203,6 +222,8 @@
             case 'deliv':
                 $objFormParam->setParam($_POST);
                 $objFormParam->convParam();
+                //複数配送時に各商品の総量を設定
+                $this->setProductsQuantity($objFormParam);
                 $this->arrErr = $this->lfCheckError($objFormParam);
                 break;
 
@@ -212,6 +233,8 @@
                 $objFormParam->convParam();
                 $delete_no = $objFormParam->getValue('delete_no');
                 $this->doDeleteProduct($delete_no, $objFormParam);
+                //複数配送時に各商品の総量を設定
+                $this->setProductsQuantity($objFormParam);
                 $this->arrErr = $this->lfCheckError($objFormParam);
                 break;
 
@@ -220,6 +243,8 @@
                 $objFormParam->setParam($_POST);
                 $objFormParam->convParam();
                 $this->doRegisterProduct($objFormParam);
+                //複数配送時に各商品の総量を設定
+                $this->setProductsQuantity($objFormParam);
                 $this->arrErr = $this->lfCheckError($objFormParam);
                 break;
 
@@ -272,13 +297,13 @@
                 break;
         }
 
-        $this->arrForm = $objFormParam->getFormParamList();
+        $this->arrForm        = $objFormParam->getFormParamList();
         $this->arrAllShipping = $objFormParam->getSwapArray(array_merge($this->arrShippingKeys, $this->arrShipmentItemKeys));
-        $this->arrDelivTime = $objPurchase->getDelivTime($objFormParam->getValue('deliv_id'));
+        $this->top_shipping_id      = array_shift((array_keys($this->arrAllShipping)));
+        $this->arrDelivTime   = $objPurchase->getDelivTime($objFormParam->getValue('deliv_id'));
         $this->tpl_onload .= $this->getAnchorKey($objFormParam);
         if ($arrValuesBefore['payment_id'])
             $this->arrPayment[$arrValuesBefore['payment_id']] = $arrValuesBefore['payment_method'];
-
     }
 
 /**
@@ -333,6 +358,7 @@
     $objFormParam->addParam('対応状況', 'status', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
     $objFormParam->addParam('お支払方法名称', 'payment_method');
 
+
     // 受注詳細情報
     $objFormParam->addParam('商品種別ID', 'product_type_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
     $objFormParam->addParam('単価', 'price', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'), '0');
@@ -406,6 +432,7 @@
     $objFormParam->addParam('商品項番', 'no', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
     $objFormParam->addParam('追加商品規格ID', 'add_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
     $objFormParam->addParam('修正商品規格ID', 'edit_product_class_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
+    $objFormParam->addParam('対象届け先ID', 'select_shipping_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
     $objFormParam->addParam('アンカーキー', 'anchor_key', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
 }
 
@@ -743,8 +770,9 @@
         $arrAllShipmentItem = $objFormParam->getSwapArray($this->arrShipmentItemKeys);
 
         $arrDelivTime = $objPurchase->getDelivTime($objFormParam->getValue('deliv_id'));
-
+        //商品単価を複数配送にも適応
         $arrShippingValues = array();
+        $arrIsNotQuantityUp = array();
         foreach ($arrAllShipping as $shipping_index => $arrShipping) {
             $shipping_id = $arrShipping['shipping_id'];
             $arrShippingValues[$shipping_index] = $arrShipping;
@@ -754,23 +782,14 @@
                                               $arrShipping['shipping_date_month'],
                                               $arrShipping['shipping_date_day']);
 
-            //商品単価、数量を複数配送にも反映する
+            //商品単価を複数配送にも反映する
             foreach ($arrDetail as $product_detail) {
                 foreach ($arrAllShipmentItem[$shipping_index]['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) {
                     if($product_detail['product_class_id'] == $shipment_product_class_id){
                         $arrAllShipmentItem[$shipping_index]['shipment_price'][$relation_index] = $product_detail['price'];
-                        foreach ($arrStockData as $arrStock) {
-                            //数量は先頭の届け先のみ増加
-                            if($arrStock['product_class_id'] == $shipment_product_class_id && $arrIsNotQuantityUp[$shipment_product_class_id] != true){
-                                $arrIsNotQuantityUp[$shipment_product_class_id] = true;
-                                $arrAllShipmentItem[$shipping_index]['shipment_quantity'][$relation_index] -= $arrStock['quantity'];
-                                break;
-                            }
-                        }
                     }
                 }
             }
-
             // 配送業者IDを取得
             $arrShippingValues[$shipping_index]['deliv_id'] = $objFormParam->getValue('deliv_id');
 
@@ -792,6 +811,7 @@
                                                    $arrShipmentValues[$shipping_index]);
             }
         }
+
         $objPurchase->registerShipping($order_id, $arrShippingValues, false);
         $objQuery->commit();
         return $order_id;
@@ -810,72 +830,10 @@
         if (SC_Utils_Ex::isBlank($product_class_id)) {
             $product_class_id = $objFormParam->getValue('edit_product_class_id');
             $changed_no = $objFormParam->getValue('no');
+            $this->shipmentEditProduct($objFormParam, $product_class_id, $changed_no);
+        }else{
+            $this->shipmentAddProduct($objFormParam, $product_class_id);
         }
-        // FXIME バリデーションを通さず $objFormParam の値で DB 問い合わせしている。(管理機能ため、さほど問題は無いと思うものの…)
-
-        // 商品規格IDが指定されていない場合、例外エラーを発生
-        if (strlen($product_class_id) === 0) {
-            trigger_error('商品規格指定なし', E_USER_ERROR);
-        }
-
-        // 選択済みの商品であれば数量を1増やす
-        $exists = false;
-        $arrExistsProductClassIds = $objFormParam->getValue('product_class_id');
-        foreach ($arrExistsProductClassIds as $key => $value) {
-            $exists_product_class_id = $arrExistsProductClassIds[$key];
-            if ($exists_product_class_id == $product_class_id) {
-                $exists = true;
-                $exists_no = $key;
-                $arrExistsQuantity = $objFormParam->getValue('quantity');
-                $arrExistsQuantity[$key]++;
-                $objFormParam->setValue('quantity', $arrExistsQuantity);
-            }
-        }
-
-        // 新しく商品を追加した場合はフォームに登録
-        // 商品を変更した場合は、該当行を変更
-        if (!$exists) {
-            $objProduct = new SC_Product_Ex();
-            $arrProduct = $objProduct->getDetailAndProductsClass($product_class_id);
-
-            // 一致する商品規格がない場合、例外エラーを発生
-            if (empty($arrProduct)) {
-                trigger_error('商品規格一致なし', E_USER_ERROR);
-            }
-
-            $arrProduct['quantity'] = 1;
-            $arrProduct['price'] = $arrProduct['price02'];
-            $arrProduct['tax_rate'] = $objFormParam->getValue('order_tax_rate') == '' ? $this->arrInfo['tax']      : $objFormParam->getValue('order_tax_rate');
-            $arrProduct['tax_rule'] = $objFormParam->getValue('order_tax_rule') == '' ? $this->arrInfo['tax_rule'] : $objFormParam->getValue('order_tax_rule');
-            $arrProduct['product_name'] = $arrProduct['name'];
-
-            $arrUpdateKeys = array(
-                'product_id', 'product_class_id', 'product_type_id', 'point_rate',
-                'product_code', 'product_name', 'classcategory_name1', 'classcategory_name2',
-                'quantity', 'price', 'tax_rate', 'tax_rule'
-            );
-            foreach ($arrUpdateKeys as $key) {
-                $arrValues = $objFormParam->getValue($key);
-                // FIXME getValueで文字列が返る場合があるので配列であるかをチェック
-                if (!is_array($arrValues)) {
-                    $arrValues = array();
-                }
-
-                if (isset($changed_no)) {
-                    $arrValues[$changed_no] = $arrProduct[$key];
-                } else {
-                    $added_no = 0;
-                    if (is_array($arrExistsProductClassIds)) {
-                        $added_no = count($arrExistsProductClassIds);
-                    }
-                    $arrValues[$added_no] = $arrProduct[$key];
-                }
-                $objFormParam->setValue($key, $arrValues);
-            }
-        } elseif (isset($changed_no) && $exists_no != $changed_no) {
-            // 変更したが、選択済みの商品だった場合は、変更対象行を削除。
-            $this->doDeleteProduct($changed_no, $objFormParam);
-        }
     }
 
     /**
@@ -886,21 +844,32 @@
      * @return void
      */
     function doDeleteProduct($delete_no, &$objFormParam) {
-        $arrDeleteKeys = array(
-            'product_id', 'product_class_id', 'product_type_id', 'point_rate',
-            'product_code', 'product_name', 'classcategory_name1', 'classcategory_name2',
-            'quantity', 'price', 'tax_rate', 'tax_rule'
-        );
-        foreach ($arrDeleteKeys as $key) {
-            $arrNewValues = array();
-            $arrValues = $objFormParam->getValue($key);
-            foreach ($arrValues as $index => $val) {
-                if ($index != $delete_no) {
-                    $arrNewValues[] = $val;
+
+        $select_shipping_id    = $objFormParam->getValue('select_shipping_id');
+
+        //変更前のproduct_class_idが他の届け先にも存在するか
+        $arrPreShipmentProductClassIds = $objFormParam->getValue('shipment_product_class_id');
+        $arrPreProductClassIds         = $objFormParam->getValue('product_class_id');
+        $delete_product_class_id       = $arrPreShipmentProductClassIds[$select_shipping_id][$delete_no];
+
+        //配送先データ削除
+        $arrNewShipments = $this->deleteShipment($objFormParam, $this->arrShipmentItemKeys , $select_shipping_id, $delete_no);
+        $objFormParam->setParam($arrNewShipments);
+
+        $is_product_delete = true;
+        foreach ($arrNewShipments['shipment_product_class_id'] as $shipping_id => $arrShipmentProductClassIds) {
+            foreach ($arrShipmentProductClassIds as $relation_index => $shipment_product_class_id) {
+                if(in_array($delete_product_class_id, $arrShipmentProductClassIds)){
+                    $is_product_delete = false;
+                    break;
                 }
             }
-            $objFormParam->setValue($key, $arrNewValues);
         }
+
+        //商品情報から削除
+        if($is_product_delete){
+            $this->checkDeleteProducts($objFormParam, $arrPreProductClassIds, $delete_product_class_id, $this->arrProductKeys);
+        }
     }
 
     /**
@@ -948,4 +917,240 @@
         }
         return '';
     }
-}
+
+    /**
+     * 商品を追加
+     *
+     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
+     * @param integer $add_product_class_id 追加商品規格ID
+     * @return void
+     */
+    function shipmentAddProduct(&$objFormParam, $add_product_class_id){
+
+        //複数配送に商品情報追加
+        $select_shipping_id = $objFormParam->getValue('select_shipping_id');
+
+        //届け先に選択済みの商品がある場合
+        $arrShipmentProducts = $this->getShipmentProducts($objFormParam);
+
+        if(in_array($add_product_class_id, $arrShipmentProducts['shipment_product_class_id'][$select_shipping_id])){
+            foreach ($arrShipmentProducts['shipment_product_class_id'][$select_shipping_id] as $relation_index => $shipment_product_class_id) {
+                if($shipment_product_class_id == $add_product_class_id){
+                    $arrShipmentProducts['shipment_quantity'][$select_shipping_id][$relation_index]++;
+                    break;
+                }
+            }
+        }else{
+
+            //届け先に選択商品がない場合
+            $objProduct = new SC_Product_Ex();
+            $arrAddProductInfo = $objProduct->getDetailAndProductsClass($add_product_class_id);
+
+            $arrShipmentProducts['shipment_product_class_id'][$select_shipping_id][] = $add_product_class_id;
+            $arrShipmentProducts['shipment_product_code'][$select_shipping_id][]     = $arrAddProductInfo['product_code'];
+            $arrShipmentProducts['shipment_product_name'][$select_shipping_id][]     = $arrAddProductInfo['name'];
+            $arrShipmentProducts['shipment_price'][$select_shipping_id][]            = $arrAddProductInfo['price02'];
+            $arrShipmentProducts['shipment_quantity'][$select_shipping_id][]         = 1;
+
+            //受注商品情報に追加
+            $arrPreProductClassIds = $objFormParam->getValue('product_class_id');
+            $arrProducts = $this->checkInsertOrderProducts($objFormParam, $arrPreProductClassIds, $add_product_class_id, $arrAddProductInfo);
+            $objFormParam->setParam($arrProducts);
+        }
+        $objFormParam->setParam($arrShipmentProducts);
+    }
+
+    /**
+     * 商品を変更
+     *
+     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
+     * @param integer $add_product_class_id 変更商品規格ID
+     * @param integer $change_no 変更対象
+     * @return void
+     */
+    function shipmentEditProduct(&$objFormParam, $edit_product_class_id, $change_no){
+        $arrPreProductClassIds = $objFormParam->getValue('product_class_id');
+        $select_shipping_id    = $objFormParam->getValue('select_shipping_id');
+
+        $arrShipmentProducts = $this->getShipmentProducts($objFormParam);
+
+        //既にあるデータは1つだけ数量を1増やす
+        $pre_shipment_product_class_id = $arrShipmentProducts['shipment_product_class_id'][$select_shipping_id][$change_no];
+        if($pre_shipment_product_class_id == $edit_product_class_id) {
+            $arrShipmentProducts['shipment_quantity'][$select_shipping_id][$change_no] ++;
+        }elseif(in_array($edit_product_class_id, $arrShipmentProducts['shipment_product_class_id'][$select_shipping_id])){
+            //配送先データ削除
+            $arrShipmentProducts = $this->deleteShipment($objFormParam, $this->arrShipmentItemKeys , $select_shipping_id, $change_no);
+            foreach ($arrShipmentProducts['shipment_product_class_id'][$select_shipping_id] as $relation_index => $shipment_product_class_id) {
+                if($shipment_product_class_id == $edit_product_class_id){
+                    $arrShipmentProducts['shipment_quantity'][$select_shipping_id][$relation_index] ++;
+                    break;
+                }
+            }
+        }else{
+            $objProduct = new SC_Product_Ex();
+            $arrAddProductInfo = $objProduct->getDetailAndProductsClass($edit_product_class_id);
+
+            //上書き
+            $this->changeShipmentProducts($arrShipmentProducts, $arrAddProductInfo, $select_shipping_id, $change_no);
+            //受注商品情報に追加
+            $arrProducts = $this->checkInsertOrderProducts($objFormParam, $arrPreProductClassIds, $edit_product_class_id, $arrAddProductInfo);
+            $objFormParam->setParam($arrProducts);
+        }
+        $objFormParam->setParam($arrShipmentProducts);
+
+        //更新のみの場合、全配列を持っていないので、新しい配列を取得
+        $arrNewShipmentProducts = $this->getShipmentProducts($objFormParam);
+        $is_product_delete = true;
+        //変更前のproduct_class_idが他の届け先にも存在するか
+        foreach ($arrNewShipmentProducts['shipment_product_class_id'] as $shipping_id => $arrShipmentProductClassIds) {
+            if(in_array($pre_shipment_product_class_id, $arrShipmentProductClassIds)){
+                $is_product_delete = false;
+                break;
+            }
+        }
+
+        //商品情報から削除
+        if($is_product_delete){
+            $this->checkDeleteProducts($objFormParam, $arrPreProductClassIds, $pre_shipment_product_class_id, $this->arrProductKeys);
+        }
+    }
+
+    /**
+     * 複数配送のパラメータを取り出す 
+     *
+     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
+     * @return array 配送データ
+     */
+    function getShipmentProducts(&$objFormParam){
+        $arrShipmentProducts['shipment_product_class_id']    = $objFormParam->getValue('shipment_product_class_id');
+        $arrShipmentProducts['shipment_product_code']        = $objFormParam->getValue('shipment_product_code');
+        $arrShipmentProducts['shipment_product_name']        = $objFormParam->getValue('shipment_product_name');
+        $arrShipmentProducts['shipment_classcategory_name1'] = $objFormParam->getValue('shipment_classcategory_name1');
+        $arrShipmentProducts['shipment_classcategory_name2'] = $objFormParam->getValue('shipment_classcategory_name2');
+        $arrShipmentProducts['shipment_price']               = $objFormParam->getValue('shipment_price');
+        $arrShipmentProducts['shipment_quantity']            = $objFormParam->getValue('shipment_quantity');
+
+        return $arrShipmentProducts;
+    }
+
+    /**
+     * 変更対象のデータを上書きする
+     *
+     * @param array   $arrShipmentProducts  変更対象配列
+     * @param array   $arrProductInfo       上書きデータ
+     * @param integer $shipping_id          配送先ID
+     * @param array   $no                   変更対象
+     * @return void
+     */
+    function changeShipmentProducts(&$arrShipmentProducts, $arrProductInfo, $shipping_id, $no){
+        $arrShipmentProducts['shipment_product_class_id'][$shipping_id][$no]    = $arrProductInfo['product_class_id'];
+        $arrShipmentProducts['shipment_product_code'][$shipping_id][$no]        = $arrProductInfo['product_code'];
+        $arrShipmentProducts['shipment_product_name'][$shipping_id][$no]        = $arrProductInfo['name'];
+        $arrShipmentProducts['shipment_classcategory_name1'][$shipping_id][$no] = $arrProductInfo['classcategory_name1'];
+        $arrShipmentProducts['shipment_classcategory_name2'][$shipping_id][$no] = $arrProductInfo['classcategory_name2'];
+        $arrShipmentProducts['shipment_price'][$shipping_id][$no]               = $arrProductInfo['price02'];
+        $arrShipmentProducts['shipment_quantity'][$shipping_id][$no]            = 1;
+    }
+
+    /**
+     * 商品側の総量計算&セット
+     *
+     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
+     * @return void
+     */
+    function setProductsQuantity(&$objFormParam){
+        $arrShipmentsItems = $objFormParam->getSwapArray(array('shipment_product_class_id','shipment_quantity'));
+        foreach ($arrShipmentsItems as $arritems) {
+            foreach ($arritems['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) {
+                $arrUpdateQuantity[$shipment_product_class_id] += $arritems['shipment_quantity'][$relation_index];
+            }
+        }
+
+        $arrProductsClass = $objFormParam->getValue('product_class_id');
+        $arrProductsQuantity = $objFormParam->getValue('quantity');
+        foreach ($arrProductsClass as $relation_key => $product_class_id) {
+            $arrQuantity['quantity'][$relation_key] = $arrUpdateQuantity[$product_class_id];
+        }
+        $objFormParam->setParam($arrQuantity);
+    }
+
+    /**
+     * 削除対象の確認、削除をする
+     *
+     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
+     * @param array   $arrProductClassIds      削除対象配列の商品規格ID
+     * @param integer $delete_product_class_id 削除商品規格ID
+     * @param array   $arrDeleteKeys            削除項目
+     * @return void
+     */
+    function checkDeleteProducts(&$objFormParam, $arrProductClassIds, $delete_product_class_id, $arrDeleteKeys){
+        foreach ($arrProductClassIds as $relation_index => $product_class_id) {
+            //product_class_idの重複はないので、1つ削除したら完了
+            if($product_class_id == $delete_product_class_id){
+                foreach ($arrDeleteKeys as $delete_key) {
+                    $arrProducts = $objFormParam->getValue($delete_key);
+                    foreach ($arrProducts as $index => $product_info) {
+                        if($index != $relation_index){
+                            $arrUpdateParams[$delete_key][] = $product_info;
+                        }
+                    }
+                    $objFormParam->setParam($arrUpdateParams);
+                }
+                break;
+            }
+        }
+    }
+
+    /**
+     * 配送先商品の削除の削除
+     *
+     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
+     * @param array   $arrShipmentDeleteKeys   削除項目
+     * @param integer $delete_shipping_id     削除配送ID
+     * @param array   $delete_no               削除対象
+     * @return void
+     */
+    function deleteShipment(&$objFormParam, $arrShipmentDeletKeys, $delete_shipping_id, $delete_no){
+            foreach ($arrShipmentDeletKeys as $delete_key) {
+                $arrShipments = $objFormParam->getValue($delete_key);
+                foreach ($arrShipments as $shipp_id => $arrKeyData){
+                    foreach ($arrKeyData as $relation_index => $shipment_info) {
+                        if($relation_index != $delete_no || $shipp_id != $delete_shipping_id){
+                            $arrUpdateParams[$delete_key][$shipp_id][] = $shipment_info;
+                        }
+                    }
+                }
+            }
+            //$objFormParam->setParam($arrUpdateParams);
+            return $arrUpdateParams;
+        }
+
+
+    /**
+     * 受注商品一覧側に商品を追加
+     *
+     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
+     * @param array   $arrProductClassIds      対象配列の商品規格ID
+     * @param integer $indert_product_class_id 追加商品規格ID
+     * @param array   $arrAddProductInfo        追加データ
+     * @return array  $arrAddProducts           更新データ
+     */
+    function checkInsertOrderProducts(&$objFormParam, $arrProductClassIds, $insert_product_class_id, $arrAddProductInfo){
+        if(!in_array($insert_product_class_id, $arrProductClassIds)){
+            $arrAddProductInfo['product_name'] = ($arrAddProductInfo['product_name'])? $arrAddProductInfo['product_name']:$arrAddProductInfo['name'];
+            $arrAddProductInfo['price']        = ($arrAddProductInfo['price'])? $arrAddProductInfo['price']:$arrAddProductInfo['price02'];
+            $arrAddProductInfo['quantity']     = 1;
+            $arrAddProductInfo['tax_rate']     = ($objFormParam->getValue('order_tax_rate') == '')? $this->arrInfo['tax']     :$objFormParam->getValue('order_tax_rate');
+            $arrAddProductInfo['tax_rule']     = ($objFormParam->getValue('order_tax_rule') == '')? $this->arrInfo['tax_rule']:$objFormParam->getValue('order_tax_rule');
+            foreach ($this->arrProductKeys as $insert_key) {
+                $arrAddProducts[$insert_key]   = $objFormParam->getValue($insert_key);
+                $arrAddProducts[$insert_key][] = $arrAddProductInfo[$insert_key];
+            }
+            return $arrAddProducts;
+        }else{
+            //受注商品の数量は、複数配送側の集計で出しているので、重複しても数量を増やさない。
+            return null;
+        }
+    }
+}
\ No newline at end of file

変更: branches/version-2_12-dev/data/class/pages/admin/order/LC_Page_Admin_Order_ProductSelect.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/admin/order/LC_Page_Admin_Order_ProductSelect.php	2013-02-01 09:26:53 UTC (rev 22492)
+++ branches/version-2_12-dev/data/class/pages/admin/order/LC_Page_Admin_Order_ProductSelect.php	2013-02-02 10:25:52 UTC (rev 22493)
@@ -77,6 +77,7 @@
         $objFormParam->convParam();
 
         $this->tpl_no = $this->getNo(array($_GET,$_POST));
+        $this->shipping_id = $this->getShippingId(array($_GET,$_POST));
 
         switch ($this->getMode()) {
             case 'search':
@@ -251,6 +252,20 @@
     }
 
     /**
+     * リクエストパラメーター shipping_id を取ってくる。
+     * @param unknown_type $globalParams
+     */
+    function getShippingId($globalParams) {
+        foreach ($globalParams as $params) {
+            if (isset($params['shipping_id']) && $params['shipping_id']!= '') {
+                return intval($params['shipping_id']);
+            }
+        }
+        return null;
+    }
+
+
+    /**
      * 取得している並び順で並び替え
      * @param $arrProduct_id
      * @param $productList
@@ -285,5 +300,6 @@
         $objFormParam->addParam('カテゴリID', 'search_category_id', STEXT_LEN, 'KVa',  array('MAX_LENGTH_CHECK', 'SPTAB_CHECK'));
         $objFormParam->addParam('商品コード', 'search_product_code', LTEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK', 'SPTAB_CHECK'));
         $objFormParam->addParam('フッター', 'footer', LTEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK', 'SPTAB_CHECK'));
+        $objFormParam->addParam('届け先ID', 'shipping_id', LTEXT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
     }
 }




Svn-src-all メーリングリストの案内