日計の記録
いよいよこの章で完成です。
最後に、伝票の保存と同時に、その日の売上や回収の合計を日計テーブルに記録するようにしましょう。
仕組み
日計の記録は、伝票が追加されたらその伝票分を足し算し、削除されたら引き算します。
ただし、伝票の更新の場合は増減の量を計算しなければなりません。増減の計算方法はいくつかありますが、今回は在庫の増減で使用したハンドラで計算することにします。
増減の計算
増減の値は、new
したInvoiceAmount
インスタンスに記録することにします。 InvoiceItemSaveHandler
にonStart
メソッドを追加し、そこでnew
します。そして、onSaveRow
とonDeleteRow
でそれぞれincrement
、decrement
します。
class InvoiceItemSaveHandler
{
public function onStart()
{
$this->amount = new InvoiceAmount;
}
public function onSaveRow(InvoiceItem $row)
{
$this->amount->increment($row);
// (省略)
}
public function onDeleteRow(InvoiceItem $row)
{
$this->amount->decrement($row);
// (省略)
}
これで$this->amount
に増減が記録されます。
日計の保存
onEnd
メソッドを追加して、そこで保存を行います。日計を保存するには日付が必要なので、コンストラクタで日付を受け取るようにします。
class InvoiceItemSaveHandler
{
// (省略)
private $date;
public function __construct($date)
{
$this->date = $date;
}
public function onEnd()
{
// 日計のサーバーカーソルを取得
$it = DailySummary::index(0)->keyValue($this->date)->serverCursor();
if ($it->valid()) {
// レコードがあれば更新
$daily = $it->current();
$daily->sum($this->amount);
$it->update($daily);
} else {
// 無ければ追加する
$daily = new DailySummary(['date' => $this->date]);
$daily->sum($this->amount);
$it->insert($daily);
}
// keyValueなどをリセットする
DailySummary::resetQuery();
Stock::resetQuery();
}
}
ハンドラの呼び出し
最後に、onStart
とonEnd
の呼び出しをInvoice
のsave
とdelete
に追加します。
class Invoice extends Model
{
public function save($options = 0, $forceInsert = false)
{
InvoiceItem::$handler = new InvoiceItemSaveHandler($this->date);
// 日計計算開始
InvoiceItem::$handler->onStart();
// (省略)
// 日計の保存
InvoiceItem::$handler->onEnd();
}
public function delete($options = null)
{
InvoiceItem::$handler = new InvoiceItemSaveHandler($this->date);
// 日計計算開始
InvoiceItem::$handler->onStart();
// (省略)
// 日計の保存
InvoiceItem::$handler->onEnd();
}
これでサンプルアプリケーションのモデルが完成しました。
完成したソースコードはGitHub Gistからダウンロードできます。