From ebf1b16aa57eed14765561cab6a157ea563f9a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Carodej?= Date: Sun, 12 Jun 2022 14:53:58 +0200 Subject: [PATCH] MeteredBillingRestrictionsEngine update with the new rule for dunning --- src/App/Users/Models/User.php | 2 +- src/App/Users/Resources/UserResource.php | 1 + .../Engines/DefaultRestrictionsEngine.php | 5 +++++ .../Engines/FixedBillingRestrictionsEngine.php | 5 +++++ .../Engines/MeteredBillingRestrictionsEngine.php | 16 ++++++++++++++++ .../Users/Restrictions/RestrictionsEngine.php | 2 ++ 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/App/Users/Models/User.php b/src/App/Users/Models/User.php index 1051d067..da35dc19 100644 --- a/src/App/Users/Models/User.php +++ b/src/App/Users/Models/User.php @@ -196,7 +196,7 @@ class User extends Authenticatable implements MustVerifyEmail public function __call($method, $parameters) { - if (str_starts_with($method, 'can')) { + if (str_starts_with($method, 'can') || str_starts_with($method, 'get')) { return resolve(RestrictionsManager::class) ->driver() ->$method($this, ...$parameters); diff --git a/src/App/Users/Resources/UserResource.php b/src/App/Users/Resources/UserResource.php index 408787f3..b97cf5d4 100644 --- a/src/App/Users/Resources/UserResource.php +++ b/src/App/Users/Resources/UserResource.php @@ -69,6 +69,7 @@ class UserResource extends JsonResource 'canCreateFolder' => $this->canCreateFolder(), 'canCreateTeamFolder' => $this->canCreateTeamFolder(), 'canInviteTeamMembers' => $this->canInviteTeamMembers(), + 'reason' => $this->getRestrictionReason(), ], $this->mergeWhen($isFixedSubscription, fn () => [ 'limitations' => $this->limitations->summary(), diff --git a/src/App/Users/Restrictions/Engines/DefaultRestrictionsEngine.php b/src/App/Users/Restrictions/Engines/DefaultRestrictionsEngine.php index 2f03f371..22f34cf0 100644 --- a/src/App/Users/Restrictions/Engines/DefaultRestrictionsEngine.php +++ b/src/App/Users/Restrictions/Engines/DefaultRestrictionsEngine.php @@ -47,4 +47,9 @@ class DefaultRestrictionsEngine implements RestrictionsEngine { return true; } + + public function getRestrictionReason(User $user): string|null + { + // TODO: Implement getRestrictionReason() method. + } } diff --git a/src/App/Users/Restrictions/Engines/FixedBillingRestrictionsEngine.php b/src/App/Users/Restrictions/Engines/FixedBillingRestrictionsEngine.php index b8630417..1f1549af 100644 --- a/src/App/Users/Restrictions/Engines/FixedBillingRestrictionsEngine.php +++ b/src/App/Users/Restrictions/Engines/FixedBillingRestrictionsEngine.php @@ -43,4 +43,9 @@ class FixedBillingRestrictionsEngine implements RestrictionsEngine { return true; } + + public function getRestrictionReason(User $user): string|null + { + // TODO: Implement getRestrictionReason() method. + } } diff --git a/src/App/Users/Restrictions/Engines/MeteredBillingRestrictionsEngine.php b/src/App/Users/Restrictions/Engines/MeteredBillingRestrictionsEngine.php index 7191b023..c174162b 100644 --- a/src/App/Users/Restrictions/Engines/MeteredBillingRestrictionsEngine.php +++ b/src/App/Users/Restrictions/Engines/MeteredBillingRestrictionsEngine.php @@ -66,6 +66,22 @@ class MeteredBillingRestrictionsEngine implements RestrictionsEngine return $this->checkFailedPayments($user); } + public function getRestrictionReason(User $user): string|null + { + if ($this->getDunningSequenceCount($user) === 3) { + return match ($user->dunning->type) { + 'limit_usage_in_new_accounts' => 'Please make your first payment.', + 'usage_bigger_than_balance' => 'Please increase your account balance.', + }; + } + + if (! $this->checkFailedPayments($user)) { + return 'Please update your credit card.'; + } + + return null; + } + private function getDunningSequenceCount(User $user): int { return cache()->remember("dunning-count.$user->id", 3600, fn () => $user?->dunning->sequence ?? 0); diff --git a/src/App/Users/Restrictions/RestrictionsEngine.php b/src/App/Users/Restrictions/RestrictionsEngine.php index a111787a..025f8cd0 100644 --- a/src/App/Users/Restrictions/RestrictionsEngine.php +++ b/src/App/Users/Restrictions/RestrictionsEngine.php @@ -16,4 +16,6 @@ interface RestrictionsEngine public function canInviteTeamMembers(User $user, array $newInvites = []): bool; public function canVisitShared(User $user): bool; + + public function getRestrictionReason(User $user): string|null; }