設定した在庫数以上の注文ができてしまう不具合を修正しました  【解決済み】

最新版Zen Cartについて不具合が見つかった場合はこちらで情報を共有してください。内容によっては今後の開発の参考とさせていただきます。
アバター
kimono
記事: 1995
登録日時: 2005/9/27 13:30
お住まい: 大阪府大阪市天王寺区上本町
連絡を取る:

設定した在庫数以上の注文ができてしまう不具合を修正しました  【解決済み】

投稿記事by kimono » 2014/1/29 15:18

こんにちわ。kimonoです :)

件名のバグをZen Cart本体にて発見しましたので、報告させていただきます。

オプションを設定した商品をカートに入れ、同一product_idの商品でオプションを変えた商品をカートに入れた場合、在庫数以上に注文ができてしまう

こちらですが、実際にデモサイトでも、1.3系、1.5系関係なく起こってしまいます。
例えば、
http://zen-cart.jp/zen-cart-v1.3.0.2-l1 ... ucts_id=53
この商品ですが、在庫数が1000個あります。
当然、こちらで1001以上の個数を入れてカートに入れますと、在庫切れになります。
しかし、オプションにて、サイズをSで900個入れた後、Mで500個など入れた場合、本来は1400個ですので、在庫切れになるはずが、そのまま購入ができてしまい、在庫数が-400個という形になってしまいます。
仕組みを確認しましたところ、同一product_idの商品を別々にカートに入れることを前提に在庫数管理がされていなかったため、改良し、在庫数管理されるように変更しました。
また、同一オーダー内に同一product_id の商品が在った場合に注文完了後の
「下記商品についてお知らせメールを希望する」に同じ商品が複数登場し「更新」を押すとエラーになることも分かりましたので、こちらもあわせて、改良し、修正しました。
1.5.1の最新版ではこの二つの修正を加えております。
https://github.com/zencart-ja/zc-v1-ser ... dea3498bb1

1.3系などでこれらを修正する場合は、
includes/modules/pages/shopping_cart/header_php.php
の124行目辺り

コード: 全て選択

if (STOCK_CHECK == 'true') {
$flagStockCheck = zen_check_stock($products[$i]['id'], $products[$i]['quantity']);
if ($flagStockCheck == true) {
$flagAnyOutOfStock = true;
}
}


コード: 全て選択

if (STOCK_CHECK == 'true') {
// $flagStockCheck = zen_check_stock($products[$i]['id'], $products[$i]['quantity']);
$product_in_cart[zen_get_prid($products[$i]['id'])] += $products[$i]['quantity'];
$flagStockCheck = zen_check_stock($products[$i]['id'], $product_in_cart[zen_get_prid($products[$i]['id'])]);
if ($flagStockCheck == true) {
$flagAnyOutOfStock = true;
}
}


includes/modules/pages/checkout_confirmation/header_php.php
の107行目辺り

コード: 全て選択

for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
if ($stock_check[$i] = zen_check_stock($order->products[$i]['id'], $order->products[$i]['qty'])) {
$flagAnyOutOfStock = true;
}
}


コード: 全て選択

for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
// if ($stock_check[$i] = zen_check_stock($order->products[$i]['id'], $order->products[$i]['qty'])) {
$product_in_order[zen_get_prid($order->products[$i]['id'])] += $order->products[$i]['qty'];
if ($stock_check[$i] = zen_check_stock($order->products[$i]['id'], $product_in_order[zen_get_prid($order->products[$i]['id'])])) {
$flagAnyOutOfStock = true;
}
}


includes/modules/pages/checkout_success/header_php.php
の83行目辺り

コード: 全て選択

while (!$products->EOF) {
$notificationsArray[] = array('counter'=>$counter,
'products_id'=>$products->fields['products_id'],
'products_name'=>$products->fields['products_name']);
$counter++;
$products->MoveNext();
}


コード: 全て選択

while (!$products->EOF) {
if(!isset($notify_product[$products->fields['products_id']])){
$notificationsArray[] = array('counter'=>$counter,
'products_id'=>$products->fields['products_id'],
'products_name'=>$products->fields['products_name']);
}
$notify_product[$products->fields['products_id']]=true;
$counter++;
$products->MoveNext();
}


とすることで対応ができますので、ご報告させていただきます :mrgreen:

“1.5.x公式版の不具合報告・改善要望” へ戻る