deposit -= $amount; // 保存 $deposit->save(); $history->save(); } /** * デポジット異動履歴の作成 amountはdepositを使う場合は負の整数、チャージする場合は正の整数 */ protected static function makeTransferHistory(string $shopId, int $amount): DepositTransfer { [$shop, $deposit] = self::getData($shopId); $transfer = new DepositTransfer(); $transfer->shop_id = $shopId; $transfer->transfer_datetime = DateUtil::now(); $transfer->transfer_amount = -1 * $amount; $transfer->before_amount = $deposit->deposit; $transfer->after_amount = $deposit->deposit + $amount; return $transfer; } /** * @param string $shopId * @return array{Shop, Deposit} */ protected static function getData(string $shopId) { // データ取得 コンテキストから取得する $shop = ContextShop::instance()->get(); $deposit = ContextDeposit::instance()->get(); if ($shop === null) { $shop = Shop::whereId($shopId)->firstOrFail(); ContextShop::instance()->set($shop); } else { // 確認 if ($shopId !== $shop->id) { throw new LogicException("コンテキスト不正"); } } if ($deposit === null) { $deposit = Deposit::whereShopId($shopId)->firstOrFail(); ContextDeposit::instance()->set($deposit); } else { // 確認 if ($shopId !== $deposit->shop_id) { throw new LogicException("コンテキスト不正"); } } return [$shop, $deposit]; } private static function checkDepositWhenUse(Shop $shop, Deposit $deposit, int $amount) { return $shop->under_amount_when_use < $deposit->deposit - $amount; } private static function checkDepositWhenCertificate(Shop $shop, Deposit $deposit) { return $shop->under_amount_when_auth < $deposit->deposit; } private static function checkDepositWhenCreate(Shop $shop, Deposit $deposit) { return $shop->under_amount_when_create < $deposit->deposit; } }