Laravel:NextEngineAPIで登録在庫の数を社内販売管理の個数に変更する【その1】

Laravel:NextEngineAPIで登録在庫の数を社内販売管理の個数に変更する【その1】

Laravel:NextEngineAPIで登録在庫の数を社内販売管理の個数に変更する

前工程でaccess_token取得までメモしました。
今回はそのtokenをつかって実際に在庫数を変更するところまでです。

まず最初にハマったところ

商品マスタエンドポイントにアクセスするが【ERROR:002006】が出る

002006番はredirect_uriが違うというエラーとのこと。
でも登録したURLとプログラムを走らせているサーバーのURLは同じです。
どこかのプログラムが間違えているのかなどチェックしてみたけど見当たらず。
で、最終的に判明したのは【http VS https】という何とも当たり前の事柄でした。

今回、ログイン処理の問題もあって『Goutte』でPOSTしてたのですが、こいつにSSL証明書つけないでPOSTしてたんですね。そのためスキームが【http】になっていたようです。
なので、redirect_uriが「httpsって申告してるのに違うじゃん!」となったようです。『Goutte』はSSL認証つけるの面倒なので、このパーツ以降は素直にcurlでPOSTすることにしました。

全体的な流れ

ポイントは2つあります。

  1. ネクストエンジンでは商品マスタエンドポイントにて商品登録と同じ流れで在庫を更新する
  2. POSTした在庫数は加減算され最終的な在庫の表示数になる

1は「在庫更新用POSTがない」と言う事で、2は「現在在庫数でPOSTできない」と言う事です。
1は登録商品か否かを気にしなくてもよくなるのでリストの作り手からすると楽です。
が、2は中々に面倒くさい…。いや、超面倒くさい…。

楽にするためにはどうすべきか、アイディアとしてはこんな感じ。

  • 【一度テンポラリに出力する】
    1. テンポラリDBを用意する
    2. ネクストエンジンに登録している在庫数を一気に取得しテンポラリへ一時保存
    3. 取得終了後、在庫数テーブルとの計算結果をテンポラリに登録
    4. テンポラリの在庫変更数がゼロ以外の商品を抽出してPOST
  • 【1件づつ検索してPOST】
    1. 在庫数テーブルの商品を取得(0個を含め)
    2. 商品情報をforeachで回しながら商品コードでネクストエンジンの商品情報を検索し在庫数を取得
    3. 在庫数テーブルの数と検索結果のネクストエンジン内在庫数を減算
    4. 差分=0以外の時、差分を記載してPOST

一度テンポラリに出力する

  • メリット:速度は速い(はず)/ APIの発行数が少ない
  • デメリット:1件のエラーで全体が止まる可能性 / テーブル数増化の可能性 / データ誤入の可能性

悩みどころとしては、テンポラリテーブルの使いまわしが出来るか否か。
使いまわせなければ【〇〇システムとの連携】の度に新しいテーブルが出来ることになるので論外。

となれば、何のデータ用の値かを表すフラグを用意しておいて『数値型の取得データ』と『文字列型の取得データ』『計算結果』を格納するカラム用意すればいろんなものに流用できないかなと。全工程の終了と開始にTRUNCATEしてしまえば誤ったデータが入る可能性も大幅に減るだろうと。

1件づつ検索してPOST

  • メリット:段取りがわかりやすい / エラーの後追いが容易
  • デメリット:APIの発行数が超多い / 処理の総数が増える=速度が遅い

毎回商品コードつけて商品検索API走らせるってどうなのよと。問題はないのかもしれないけど気分的にはあまり…。
ただし、商品事由のエラーを見つけるのは先の方法と比べて段違いに楽。
理由は団体さん扱いじゃなくて個人扱いになるから。
ただね、やっぱり速度的に(個人的に)嫌だなと。

設計図

上のような思考をめぐらし出来上がった段取りがこちら。

  1. ネクストエンジンAPIで商品マスタの件数情報を取得
  2. ceil(総数÷10000)で総ページ数を算出
  3. for ループでoffset番号付けて商品マスタの情報を全件取得
  4. 取得した『商品コード、商品名、在庫数、売価情報、原価情報、仕入先ID』をテンポラリテーブルに保存
  5. 商品SKUテーブルから倉庫在庫商品の一覧を取得
  6. 商品SKUでテンポラリテーブルを検索
  7. 商品SKUで現在在庫数を検索
  8. 現在在庫数-テンポラリテーブル在庫数を計算、テンポラリテーブルの『加減算カラム』に計算結果を保存
  9. 原価、売価の変更があったものについてもテンポラリテーブルを修正
  10. 商品SKUにありテンポラリテーブルに存在しない商品はテンポラリに商品追加『商品仕入れ先』情報を記載
  11. 在庫数計算が0以外、または原価/売価の追加/変更があったものについてテンポラリテーブルの『変更済みフラグ』に1を記載
  12. テンポラリテーブルの『変更済みフラグ』が 1 のものを抽出
  13. $str = implode(‘,’, $arr);  $csv_list = $csv_list.”\n”.$str; でPOST用csvデータ作成
  14. ネクストエンジンの商品マスタアップロードでまとめてPOST
  15. しばらく待つと在庫数/原価/売価が更新されている

どうせならと原価と標準売価などの更新まで一緒にしてしまいました。
商品追加をする際に『商品コード、商品名、売価、原価、仕入先ID』が必須だったためこの項目を用意しましたが、いろんな外部連携に利用したいのでSQLテーブル側は【必須】にしてません。

まとめ

思考回路としてはまぁまぁな出来かなと思っています。
今回は文面が長くなってしまったのでスクリプトの記載をしませんでした。
後程、記載しようと思います。