2.13で受注商品を変更→数量変更でなぜか他の商品の数量が変更されるバグ
そもそもEC-CUBEの2.13には、商品を変更しなくても数量を変更すると他の商品の数量が変更されてしまうというバグがあるようです。フォーラムなどを確認してチェンジセット23355を適用。
一見問題なくなったので安心していたところ、商品を変更したときにまたこのバグが再現されることが判明しました。
2.13は商品の変更時、もともとの商品の位置に変更後の商品を挿入するのではなくて、一旦削除→新たに追加という挙動を行っているようで、その際にgetShipmentItemsの順番と違ってしまうのではないかと思います。
この数量変更のときのjavascriptとHTML(/data/Smarty/templates/admin/order/edit.tpl)はこんな感じだったので…。
function quantityCopyForSingleShipping(product_index){
var product_index = parseInt(product_index);
var input_quantity = $('input[name^="quantity[' + product_index + ']"]').val();
$('input[name^="shipment_quantity[<!--{$top_shipping_id}-->][' + product_index + ']"]').val(input_quantity);}
<input type="text" name="<!--{$key}-->[<!--{$product_index}-->]" value="<!--{$arrForm[$key].value[$product_index]|h}-->" size="3" class="box3" maxlength="<!--{$arrForm[$key].length}-->" style="<!--{$arrErr[$key][$product_index]|sfGetErrorColor}-->" id="<!--{$key}-->_<!--{$product_index}-->" onChange="quantityCopyForSingleShipping('<!--{$product_index}-->')" />
…
<input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key][$item_index]|h}-->" />
shipping_idとproduct_class_idで取得したほうが間違いがないのではと書き直し。
function quantityCopyForSingleShipping(input_quantity, product_class_id){
var input_quantity_val = $(input_quantity).val();
$('input#shipment_quantity_<!--{$top_shipping_id}-->_' + product_class_id).val(input_quantity_val);
}
<input type="text" name="<!--{$key}-->[<!--{$product_index}-->]" value="<!--{$arrForm[$key].value[$product_index]|h}-->" size="3" class="box3" maxlength="<!--{$arrForm[$key].length}-->" style="<!--{$arrErr[$key][$product_index]|sfGetErrorColor}-->" id="<!--{$key}-->_<!--{$product_index}-->" onChange="quantityCopyForSingleShipping(this, '<!--{$arrForm.product_class_id.value[$product_index]|h}-->')" />
…
<!--{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=shipment_product_class_id value=$arrShipping[$key][$item_index]}-->
…<input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" id="<!--{$key}-->_<!--{$shipping_index}-->_<!--{$shipment_product_class_id|h}-->" value="<!--{$arrShipping[$key][$item_index]|h}-->" />
とりあえずこれで今回のバグは取り除けました。
product_class_idは一意なのでこの仕様で問題ない…とは思いますが複数宛先での動作確認はできていないので、急ぎじゃない場合は公式のチケット待ったほうがよいかと思います。