Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

新規の受注登録で、商品の重複が発生する商品変更を行うと、受注商品の明細行が正しく動かなくなる #707

Open
zu1rpb opened this issue Apr 4, 2023 · 4 comments

Comments

@zu1rpb
Copy link

zu1rpb commented Apr 4, 2023

新規の受注登録で、「商品の追加」を二回行って、異なる二つの商品を追加したあとに、
片方の商品を「変更」ボタンでもう一方と同じ商品に変更すると、
それ以降の受注商品情報関連の操作が不正になるように見えます。

再現手順

  1. 管理機能の上部のメニューから、受注管理 > 受注登録 をクリック

  2. 受注商品情報の「商品の追加」ボタンで、商品A(例えば「おなべ」)を追加

  3. 受注商品情報の「商品の追加」ボタンで、商品B(例えば「おなべレシピ」)を追加
    1行目: A:おなべ 数量:1
    2行目: B:おなべレシピ 数量:1
    →ここまではOK

  4. 1行目の「変更」ボタンで 商品A を 商品B に変更
    1行目: A:おなべ 数量:0
    2行目: B:おなべレシピ 数量:2
    →商品A の行が、数量 0 のままで残る

  5. 1行目の「変更」ボタンで 商品A を 商品C(例えば「アイスクリーム」)に変更
    1行目: A:おなべ 数量:0
    2行目: C:アイスクリーム 数量:1
    →1行目を 変更したにもかかわらず、2行目が更新される

環境

EC-CUBE 2.17.2-p1
DBサーバー MySQL 5.7.41
PHP 7.4.33

@nanasess
Copy link
Contributor

nanasess commented Apr 4, 2023

ありがとうございます。明細行が保持している index がおかしくなってそうですね

@zu1rpb
Copy link
Author

zu1rpb commented Apr 4, 2023

返信ありがとうございます。

差し支えなければお伺いしたいのですが、

LC_Page_Admin_Order_Edit.php の shipmentEditProduct() 内に
商品の重複が発生した場合に $arrShipmentProducts を一つにまとめる処理があります。

https://github.com/EC-CUBE/ec-cube2/blob/master/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php#L1075

$arrShipmentProducts と 受注商品一覧の情報は同期が取れている必要があるのではと思っているのですが、
上記処理の後のどこか他の場所で、受注商品一覧側の情報も更新されるのでしょうか?

@nanasess
Copy link
Contributor

nanasess commented Apr 4, 2023

@zu1rpb うろ覚えで恐縮ですが、以下の処理あたりかなと思います。

/**
* 受注商品を削除する.
*
* @param integer $delete_no 削除する受注商品の項番
* @param SC_FormParam $objFormParam SC_FormParam インスタンス
* @return void
*/
public function doDeleteProduct($delete_no, &$objFormParam)
{
$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;
}
}
}
//商品情報から削除
if ($is_product_delete) {
$this->checkDeleteProducts($objFormParam, $arrPreProductClassIds, $delete_product_class_id, $this->arrProductKeys);
}
}

2.13.xあたりで、何人かのコミッターさんが手を入れたので、一度しっかり精査せねばと思いつつ今に至ってしまいました😢

@zu1rpb
Copy link
Author

zu1rpb commented Apr 4, 2023

@nanasess ありがとうございます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants