|
- <?php
-
- namespace App\Logics\QRService;
-
- use App\Contexts\Model\Deposit as ContextDeposit;
- use App\Contexts\Model\Shop as ContextShop;
- use App\Exceptions\AppCommonException;
- use App\Models\HtpmsCustomer\Deposit\Deposit;
- use App\Models\HtpmsCustomer\Deposit\DepositTransfer;
- use App\Models\HtpmsCustomer\Mst\Shop;
- use App\Util\DateUtil;
- use LogicException;
-
- trait DepositCheck
- {
- protected static function canCreate(string $shopId): bool
- {
- [$shop, $deposit] = self::getData($shopId);
- return self::checkDepositWhenCertificate($shop, $deposit);
- }
- protected static function canCertificate(string $shopId): bool
- {
- [$shop, $deposit] = self::getData($shopId);
- return self::checkDepositWhenCertificate($shop, $deposit);
- }
- protected static function canUseDeposit(string $shopId, $amount): bool
- {
- [$shop, $deposit] = self::getData($shopId);
- return self::checkDepositWhenUse($shop, $deposit, $amount);
- }
-
- protected static function useDeposit(
- string $shopId,
- int $amount,
- ) {
- // データ取得
- [$shop, $deposit] = self::getData($shopId);
-
- if (!self::checkDepositWhenUse($shop, $deposit, $amount)) {
- throw new AppCommonException("利用時残高不足");
- }
-
- // 異動履歴作成
- $history = self::makeTransferHistory($shopId, -1 * $amount);
-
- // デポジット減算
- $deposit->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;
- }
- }
|