web-dev-qa-db-ja.com

Ubercartで過去の在庫レベルを取得する

特定の日付におけるUbercart製品の在庫レベルを確認する方法はありますか?

A)特定の日付から今日までに販売されたアイテムの総数を取得し、b)現在の在庫レベルからその数を差し引くことができます。ただし、クライアントは暫定的に在庫レベルを更新する可能性があるため、これはあまり役に立ちません。

Ubercartが次のような在庫の変更を記録した場合、私は行ってもいいと思います。

| nid | stock_level | datestamp  | 
----------------------------------
| 23  | 15          | 1303707600 |
| 23  | 25          | 1327471200 |
2
g_thom

Ubercartはデフォルトではその情報を保存せず、_uc_stock.module_ファイルにパッチを適用せずに保存する方法はありません。

その理由は、uc_stock_set()関数が_uc_product_stock_データベーステーブルを更新しますが、他のモジュールがその情報に基づいて動作できるようにするためのフックを呼び出さないためです。

uc_stock_set()関数を次のように変更するパッチを作成する場合:

_function uc_stock_set($sku, $qty) {
  db_query("UPDATE {uc_product_stock} SET stock = %d WHERE sku = '%s'", $qty, $sku);
  $stock = db_fetch_object(db_query("SELECT * FROM {uc_product_stock} WHERE sku = '%s'", $sku));
  module_invoke_all('uc_stock_set', $stock);
}
_

次に、新しいhook_uc_stock_set()フックを実装するカスタムモジュールを記述して、タイムスタンプデータをカスタムテーブルに保存できるようになります。これは次のようになります。

_function MYMODULE_uc_stock_set($stock) {
  db_query("INSERT INTO {MYMODULE_table} (sku, stock_level, datestamp) VALUES ('%s', %d, UNIX_TIMESTAMP())", $stock->sku, $stock->qty);
}
_

Uc_stockモジュールはノードIDではなくskuで機能するため、カスタムテーブルに保存するのが最適です。

実装する必要があるもう1つのフックは、uc_stockモジュールによってすでに提供されているフックhook_uc_stock_adjusted()です。モジュールの実装は次のようになります。

_function MYMODULE_uc_stock_adjusted($sku, $prior_stock_level, $qty) {
  $stock_level = $prior_stock_level + $qty;
  db_query("INSERT INTO {MYMODULE_table} (sku, stock_level, datestamp) VALUES ('%s', %d, UNIX_TIMESTAMP())", $sku, $stock_level);
}
_
3
Clive