You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
3.6KB

  1. <?php
  2. namespace App\Logics\QRService;
  3. use App\Contexts\Model\Deposit as ContextDeposit;
  4. use App\Contexts\Model\Shop as ContextShop;
  5. use App\Exceptions\AppCommonException;
  6. use App\Models\HtpmsCustomer\Deposit\Deposit;
  7. use App\Models\HtpmsCustomer\Deposit\DepositTransfer;
  8. use App\Models\HtpmsCustomer\Mst\Shop;
  9. use App\Util\DateUtil;
  10. use LogicException;
  11. trait DepositCheck
  12. {
  13. protected static function canCreate(string $shopId): bool
  14. {
  15. [$shop, $deposit] = self::getData($shopId);
  16. return self::checkDepositWhenCertificate($shop, $deposit);
  17. }
  18. protected static function canCertificate(string $shopId): bool
  19. {
  20. [$shop, $deposit] = self::getData($shopId);
  21. return self::checkDepositWhenCertificate($shop, $deposit);
  22. }
  23. protected static function canUseDeposit(string $shopId, $amount): bool
  24. {
  25. [$shop, $deposit] = self::getData($shopId);
  26. return self::checkDepositWhenUse($shop, $deposit, $amount);
  27. }
  28. protected static function useDeposit(
  29. string $shopId,
  30. int $amount,
  31. ) {
  32. // データ取得
  33. [$shop, $deposit] = self::getData($shopId);
  34. if (!self::checkDepositWhenUse($shop, $deposit, $amount)) {
  35. throw new AppCommonException("利用時残高不足");
  36. }
  37. // 異動履歴作成
  38. $history = self::makeTransferHistory($shopId, -1 * $amount);
  39. // デポジット減算
  40. $deposit->deposit -= $amount;
  41. // 保存
  42. $deposit->save();
  43. $history->save();
  44. }
  45. /**
  46. * デポジット異動履歴の作成 amountはdepositを使う場合は負の整数、チャージする場合は正の整数
  47. */
  48. protected static function makeTransferHistory(string $shopId, int $amount): DepositTransfer
  49. {
  50. [$shop, $deposit] = self::getData($shopId);
  51. $transfer = new DepositTransfer();
  52. $transfer->shop_id = $shopId;
  53. $transfer->transfer_datetime = DateUtil::now();
  54. $transfer->transfer_amount = -1 * $amount;
  55. $transfer->before_amount = $deposit->deposit;
  56. $transfer->after_amount = $deposit->deposit + $amount;
  57. return $transfer;
  58. }
  59. /**
  60. * @param string $shopId
  61. * @return array{Shop, Deposit}
  62. */
  63. protected static function getData(string $shopId)
  64. {
  65. // データ取得 コンテキストから取得する
  66. $shop = ContextShop::instance()->get();
  67. $deposit = ContextDeposit::instance()->get();
  68. if ($shop === null) {
  69. $shop = Shop::whereId($shopId)->firstOrFail();
  70. ContextShop::instance()->set($shop);
  71. } else {
  72. // 確認
  73. if ($shopId !== $shop->id) {
  74. throw new LogicException("コンテキスト不正");
  75. }
  76. }
  77. if ($deposit === null) {
  78. $deposit = Deposit::whereShopId($shopId)->firstOrFail();
  79. ContextDeposit::instance()->set($deposit);
  80. } else {
  81. // 確認
  82. if ($shopId !== $deposit->shop_id) {
  83. throw new LogicException("コンテキスト不正");
  84. }
  85. }
  86. return [$shop, $deposit];
  87. }
  88. private static function checkDepositWhenUse(Shop $shop, Deposit $deposit, int $amount)
  89. {
  90. return $shop->under_amount_when_use < $deposit->deposit - $amount;
  91. }
  92. private static function checkDepositWhenCertificate(Shop $shop, Deposit $deposit)
  93. {
  94. return $shop->under_amount_when_auth < $deposit->deposit;
  95. }
  96. private static function checkDepositWhenCreate(Shop $shop, Deposit $deposit)
  97. {
  98. return $shop->under_amount_when_create < $deposit->deposit;
  99. }
  100. }