EC-CUBEで商品在庫数にズレが生じる原因と解決策

EC-CUBEで商品在庫数にズレが生じる原因と解決策 EC-CUBE
この記事は約4分で読めます。

EC-CUBEでは商品の在庫数がズレることがある

EC-CUBEでECサイトを運営されている事業者様から「在庫数がズレている」というご報告を頂くことがあります。
在庫数がズレているとは、倉庫にある実際の在庫数とEC-CUBE商品情報の在庫数が合わなくなっていることを指します。

不具合ではなく仕様なのですが、よく理解しておかないとトラブルの元になります。
今回は在庫数がズレる事象と原因、そして解決策をご説明したいと思います。

在庫数がズレることで発生するトラブル

実在庫数とEC-CUBE在庫数がズレることでトラブルが起こり得ます。
実在庫数がEC-CUBE在庫数より少ない場合と、実在庫数がEC-CUBE在庫数より多い場合の問題点を書きます。

実在庫数<EC-CUBE在庫数の問題点

実際の在庫はゼロにも関わらず、EC-CUBE上では商品が1つ残っていて商品を購入したユーザーに商品を発送することができないトラブルを招きます。
メーカー品などであればメーカーから商品を取り寄せれば問題ありませんが、自社商品で増産予定がない商品の場合、ユーザーに謝罪し返金処理する他ありません。

実在庫数>EC-CUBE在庫数の問題点

実際の在庫は3つにも関わらず、EC-CUBE上では商品が完売している場合、商品は売れることはありませんので在庫はずっと残ったままとなり損失を招きます。
通年販売できる商品であればEC-CUBEで販売を再開すればよいですが、シーズン物であったりその年にしか売れない商品などの場合は最悪の場合廃棄しなければいけません。

EC-CUBEで在庫数がズレる原因

EC-CUBE標準機能で在庫数がズレる原因が3つあります。
以下、ご説明します。

注文キャンセルで在庫が差し戻しされない

注文をキャンセルした場合、商品の在庫数が戻りません。
商品Aの在庫数が5個の状態で、商品A*3個の注文をキャンセルすると、通常であればキャンセル分の3個が在庫差し戻し処理がされ、商品Aの在庫数は8個になるべきです。
しかし、EC-CUBEでは差し戻し処理が行われない為、商品Aの在庫数は5個のままです。
これを知らずにキャンセル処理のみをしていると在庫のズレが発生します。

「発送済み」商品の注文数変更は在庫数に反映されない

EC-CUBE管理画面>受注編集で対応状況が「発送済み」の注文の商品数量を変更した場合、商品の在庫数に反映されません。

商品情報を編集中に注文が入ると在庫数がズレる

EC-CUBE管理画面>商品管理>商品登録で商品を編集中に、その商品の注文が入り、その後に編集内容を登録すると在庫数が戻ってしまいます。

例えば、ある商品の在庫が50個の時に、当該商品を編集するとします。
商品登録画面では在庫数は80です。
その際にその商品1つ売れると、データベースの在庫数は79個に変わります。
しかし、商品登録画面では在庫数は80のままですので、その状態で商品情報を更新すると、在庫数が79個から80個に置き換わってしまいます。

決済処理中の注文のロールバックが複数処理される

EC-CUBEでは支払い方法がクレジット決済の場合、注文確認画面に遷移した時点で「決済処理中」の受注データが作成されます。
その際に在庫が引き当てられます(在庫が減る)。
注文確認画面からユーザーが離脱すると在庫が減ったままになってしまう為、「決済処理中」の受注の在庫を戻して対応状況を「キャンセル」に変更するロールバック処理が搭載されています。

また、ロールバック処理が行われるタイミングは他のユーザーがサイトにアクセスした時ですが、このロールバック処理は排他制御がない為、同タイミングで複数ユーザーがサイトにアクセスするとロールバック処理が複数回実行され在庫が多く戻ってしまうことがあります。

かなりレアな事象なのですが、弊社クライアントで実際に発生しました。

EC-CUBEで在庫数がズレる事象の解決策

各現象の対応策は以下となります。

注文キャンセルで在庫が差し戻しされない事象の解決策

キャンセル処理時に必ず手動で商品の在庫も変更する。
もしくは、注文キャンセル時に自動で在庫が差し戻されるようにEC-CUBEをカスタマイズする。

「発送済み」商品の注文数変更は在庫数に反映されない事象の解決策

「発送済み」商品の注文数を変更する場合は必ず手動で商品の在庫も変更する。
もしくは、自動で在庫が差し戻されるようにEC-CUBEをカスタマイズする。

商品情報を編集中に注文が入ると在庫数がズレる事象の解決策

商品情報を編集する際は、商品を非公開にする。
もしくは、商品情報を更新する際に在庫数は更新しない機能を追加する。

決済処理中の注文のロールバックが複数処理される

ロールバックに排他処理が行われていないことが原因ですので、排他処理を実装することで解決します。

投稿者プロフィール

Nakamura
サンクユーのEC-CUBE先生。
EC-CUBEのカスタマイズをし出して早15年。
難易度の高いカスタマイズもお任せ。
2系、3系、4系すべて対応可能。

実はjavaでの業務システム開発がエンジニア人生のスタート。
PHP、Perl、フロントエンド開発、Movable Type、Wordpressも得意という万能エンジニア。
タイトルとURLをコピーしました