日計の記録

いよいよこの章で完成です。

最後に、伝票の保存と同時に、その日の売上や回収の合計を日計テーブルに記録するようにしましょう。

仕組み

日計の記録は、伝票が追加されたらその伝票分を足し算し、削除されたら引き算します。

ただし、伝票の更新の場合は増減の量を計算しなければなりません。増減の計算方法はいくつかありますが、今回は在庫の増減で使用したハンドラで計算することにします。

増減の計算

増減の値は、newしたInvoiceAmountインスタンスに記録することにします。 InvoiceItemSaveHandleronStartメソッドを追加し、そこでnewします。そして、onSaveRowonDeleteRowでそれぞれincrementdecrementします。

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();
    }
}

ハンドラの呼び出し

最後に、onStartonEndの呼び出しをInvoicesavedeleteに追加します。

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からダウンロードできます。

  1. 伝票合計の計算と保存
  2. モデルを使う