diff --git a/src/Contracts/FeatureConsumptionContract.php b/src/Contracts/FeatureConsumptionContract.php new file mode 100644 index 0000000..88c32e2 --- /dev/null +++ b/src/Contracts/FeatureConsumptionContract.php @@ -0,0 +1,11 @@ +{$differenceMethodName}($to)); diff --git a/src/Events/FeatureConsumed.php b/src/Events/FeatureConsumed.php index def4b24..8236cf0 100644 --- a/src/Events/FeatureConsumed.php +++ b/src/Events/FeatureConsumed.php @@ -5,8 +5,8 @@ use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; -use LucasDotVin\Soulbscription\Models\Feature; -use LucasDotVin\Soulbscription\Models\FeatureConsumption; +use LucasDotVin\Soulbscription\Contracts\FeatureConsumptionContract; +use LucasDotVin\Soulbscription\Contracts\FeatureContract; class FeatureConsumed { @@ -16,8 +16,8 @@ class FeatureConsumed public function __construct( public $subscriber, - public Feature $feature, - public FeatureConsumption $featureConsumption, + public FeatureContract $feature, + public FeatureConsumptionContract $featureConsumption, ) { // } diff --git a/src/Events/FeatureTicketCreated.php b/src/Events/FeatureTicketCreated.php index 61fdb61..0aad2d8 100644 --- a/src/Events/FeatureTicketCreated.php +++ b/src/Events/FeatureTicketCreated.php @@ -5,8 +5,8 @@ use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; -use LucasDotVin\Soulbscription\Models\Feature; -use LucasDotVin\Soulbscription\Models\FeatureTicket; +use LucasDotVin\Soulbscription\Contracts\FeatureContract; +use LucasDotVin\Soulbscription\Contracts\FeatureTicketContract; class FeatureTicketCreated { @@ -16,8 +16,8 @@ class FeatureTicketCreated public function __construct( public $subscriber, - public Feature $feature, - public FeatureTicket $featureTicket, + public FeatureContract $feature, + public FeatureTicketContract $featureTicket, ) { // } diff --git a/src/Events/SubscriptionCanceled.php b/src/Events/SubscriptionCanceled.php index 7ac3348..720a733 100644 --- a/src/Events/SubscriptionCanceled.php +++ b/src/Events/SubscriptionCanceled.php @@ -5,7 +5,7 @@ use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; -use LucasDotVin\Soulbscription\Models\Subscription; +use LucasDotVin\Soulbscription\Contracts\SubscriptionContract; class SubscriptionCanceled { @@ -14,7 +14,7 @@ class SubscriptionCanceled use SerializesModels; public function __construct( - public Subscription $subscription, + public SubscriptionContract $subscription, ) { // } diff --git a/src/Events/SubscriptionRenewed.php b/src/Events/SubscriptionRenewed.php index d0dcd89..dc22ed1 100644 --- a/src/Events/SubscriptionRenewed.php +++ b/src/Events/SubscriptionRenewed.php @@ -5,7 +5,7 @@ use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; -use LucasDotVin\Soulbscription\Models\Subscription; +use LucasDotVin\Soulbscription\Contracts\SubscriptionContract; class SubscriptionRenewed { @@ -14,7 +14,7 @@ class SubscriptionRenewed use SerializesModels; public function __construct( - public Subscription $subscription, + public SubscriptionContract $subscription, ) { // } diff --git a/src/Events/SubscriptionScheduled.php b/src/Events/SubscriptionScheduled.php index 591f329..507caa3 100644 --- a/src/Events/SubscriptionScheduled.php +++ b/src/Events/SubscriptionScheduled.php @@ -5,7 +5,7 @@ use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; -use LucasDotVin\Soulbscription\Models\Subscription; +use LucasDotVin\Soulbscription\Contracts\SubscriptionContract; class SubscriptionScheduled { @@ -14,7 +14,7 @@ class SubscriptionScheduled use SerializesModels; public function __construct( - public Subscription $subscription, + public SubscriptionContract $subscription, ) { // } diff --git a/src/Events/SubscriptionStarted.php b/src/Events/SubscriptionStarted.php index 4333315..1dc6fb6 100644 --- a/src/Events/SubscriptionStarted.php +++ b/src/Events/SubscriptionStarted.php @@ -5,7 +5,7 @@ use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; -use LucasDotVin\Soulbscription\Models\Subscription; +use LucasDotVin\Soulbscription\Contracts\SubscriptionContract; class SubscriptionStarted { @@ -14,7 +14,7 @@ class SubscriptionStarted use SerializesModels; public function __construct( - public Subscription $subscription, + public SubscriptionContract $subscription, ) { // } diff --git a/src/Events/SubscriptionSuppressed.php b/src/Events/SubscriptionSuppressed.php index bfb93bc..3ee42c2 100644 --- a/src/Events/SubscriptionSuppressed.php +++ b/src/Events/SubscriptionSuppressed.php @@ -5,7 +5,7 @@ use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; -use LucasDotVin\Soulbscription\Models\Subscription; +use LucasDotVin\Soulbscription\Contracts\SubscriptionContract; class SubscriptionSuppressed { @@ -14,7 +14,7 @@ class SubscriptionSuppressed use SerializesModels; public function __construct( - public Subscription $subscription, + public SubscriptionContract $subscription, ) { // } diff --git a/src/Models/Concerns/Expires.php b/src/Models/Concerns/Expires.php index 85108f1..bc47ea6 100644 --- a/src/Models/Concerns/Expires.php +++ b/src/Models/Concerns/Expires.php @@ -18,12 +18,12 @@ public function initializeExpires() } } - public function expired() + public function expired(): bool { return $this->expired_at->isPast(); } - public function notExpired() + public function notExpired(): bool { return ! $this->expired(); } diff --git a/src/Models/Concerns/HandlesRecurrence.php b/src/Models/Concerns/HandlesRecurrence.php index 8de439d..71aa902 100644 --- a/src/Models/Concerns/HandlesRecurrence.php +++ b/src/Models/Concerns/HandlesRecurrence.php @@ -4,7 +4,11 @@ use Illuminate\Support\Carbon; use LucasDotVin\Soulbscription\Enums\PeriodicityType; +use Illuminate\Support\Str; +/** + * @property \LucasDotVin\Soulbscription\Enums\PeriodicityType $periodicity_type + */ trait HandlesRecurrence { public function calculateNextRecurrenceEnd(Carbon|string $start = null): Carbon @@ -22,7 +26,7 @@ public function calculateNextRecurrenceEnd(Carbon|string $start = null): Carbon 0, ); - $expirationDate = $start->copy()->add($this->periodicity_type, $this->periodicity + $recurrences); + $expirationDate = $start->copy()->add(Str::lower($this->periodicity_type), $this->periodicity + $recurrences); return $expirationDate; } diff --git a/src/Models/Concerns/HasSubscriptions.php b/src/Models/Concerns/HasSubscriptions.php index cd7e68a..70b245d 100644 --- a/src/Models/Concerns/HasSubscriptions.php +++ b/src/Models/Concerns/HasSubscriptions.php @@ -4,19 +4,21 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Database\Eloquent\Relations\HasMany; use InvalidArgumentException; use LogicException; use LucasDotVin\Soulbscription\Events\FeatureConsumed; use LucasDotVin\Soulbscription\Events\FeatureTicketCreated; -use LucasDotVin\Soulbscription\Models\Feature; -use LucasDotVin\Soulbscription\Models\FeatureTicket; -use LucasDotVin\Soulbscription\Models\Plan; -use LucasDotVin\Soulbscription\Models\Subscription; +use LucasDotVin\Soulbscription\Contracts\FeatureConsumptionContract; +use LucasDotVin\Soulbscription\Contracts\FeatureContract; +use LucasDotVin\Soulbscription\Contracts\FeatureTicketContract; +use LucasDotVin\Soulbscription\Contracts\PlanContract; +use LucasDotVin\Soulbscription\Contracts\SubscriptionContract; use OutOfBoundsException; use OverflowException; +use Illuminate\Database\Eloquent\Relations\MorphMany; +use Illuminate\Database\Eloquent\Relations\MorphOne; trait HasSubscriptions { @@ -26,12 +28,12 @@ trait HasSubscriptions protected ?Collection $loadedTicketFeatures = null; - public function featureConsumptions() + public function featureConsumptions(): MorphMany { return $this->morphMany(config('soulbscription.models.feature_consumption'), 'subscriber'); } - public function featureTickets() + public function featureTickets(): MorphMany { return $this->morphMany(config('soulbscription.models.feature_ticket'), 'subscriber'); } @@ -45,12 +47,12 @@ public function renewals() ); } - public function subscription() + public function subscription(): MorphOne { return $this->morphOne(config('soulbscription.models.subscription'), 'subscriber')->ofMany('started_at', 'MAX'); } - public function lastSubscription() + public function lastSubscription(): ?SubscriptionContract { return app(config('soulbscription.models.subscription')) ->withExpired() @@ -63,7 +65,7 @@ public function lastSubscription() * @throws OutOfBoundsException * @throws OverflowException */ - public function consume($featureName, ?float $consumption = null) + public function consume($featureName, ?float $consumption = null): void { throw_if($this->missingFeature($featureName), new OutOfBoundsException( 'None of the active plans grants access to this feature.', @@ -117,7 +119,7 @@ public function setConsumedQuota($featureName, float $consumption) event(new FeatureConsumed($this, $feature, $featureConsumption)); } - public function subscribeTo(Plan $plan, $expiration = null, $startDate = null): Subscription + public function subscribeTo(PlanContract $plan, $expiration = null, $startDate = null): SubscriptionContract { if ($plan->periodicity) { $expiration = $expiration ?? $plan->calculateNextRecurrenceEnd($startDate); @@ -140,29 +142,29 @@ public function subscribeTo(Plan $plan, $expiration = null, $startDate = null): ->start($startDate); } - public function hasSubscriptionTo(Plan $plan): bool + public function hasSubscriptionTo(PlanContract $plan): bool { return $this->subscription() ->where('plan_id', $plan->id) ->exists(); } - public function isSubscribedTo(Plan $plan): bool + public function isSubscribedTo(PlanContract $plan): bool { return $this->hasSubscriptionTo($plan); } - public function missingSubscriptionTo(Plan $plan): bool + public function missingSubscriptionTo(PlanContract $plan): bool { return ! $this->hasSubscriptionTo($plan); } - public function isNotSubscribedTo(Plan $plan): bool + public function isNotSubscribedTo(PlanContract $plan): bool { return ! $this->isSubscribedTo($plan); } - public function switchTo(Plan $plan, $expiration = null, $immediately = true): Subscription + public function switchTo(PlanContract $plan, $expiration = null, $immediately = true): SubscriptionContract { if ($immediately) { $this->subscription @@ -187,14 +189,14 @@ public function switchTo(Plan $plan, $expiration = null, $immediately = true): S * @throws LogicException * @throws ModelNotFoundException */ - public function giveTicketFor($featureName, $expiration = null, ?float $charges = null): FeatureTicket + public function giveTicketFor($featureName, $expiration = null, ?float $charges = null): FeatureTicketContract { throw_unless( config('soulbscription.feature_tickets'), new LogicException('The tickets are not enabled in the configs.'), ); - $feature = Feature::whereName($featureName)->firstOrFail(); + $feature = $this->featureModelQuery()->whereName($featureName)->firstOrFail(); $featureTicket = $this->featureTickets() ->make([ @@ -251,7 +253,7 @@ public function getRemainingCharges($featureName): float return max($balance, 0); } - public function balance($featureName) + public function balance($featureName): float|int { if (empty($this->getFeature($featureName))) { return 0; @@ -286,7 +288,7 @@ public function getTotalCharges($featureName): float return $subscriptionCharges + $ticketCharges; } - protected function consumeNotQuotaFeature(Feature $feature, ?float $consumption = null) + protected function consumeNotQuotaFeature(FeatureContract $feature, ?float $consumption = null): FeatureConsumptionContract { $consumptionExpiration = $feature->consumable ? $feature->calculateNextRecurrenceEnd($this->subscription->started_at) @@ -305,7 +307,7 @@ protected function consumeNotQuotaFeature(Feature $feature, ?float $consumption return $featureConsumption; } - protected function consumeQuotaFeature(Feature $feature, float $consumption) + protected function consumeQuotaFeature(FeatureContract $feature, float $consumption): FeatureConsumptionContract { $featureConsumption = $this->featureConsumptions() ->whereFeatureId($feature->id) @@ -318,7 +320,7 @@ protected function consumeQuotaFeature(Feature $feature, float $consumption) return $featureConsumption; } - protected function getSubscriptionChargesForAFeature(Model $feature): float + protected function getSubscriptionChargesForAFeature(FeatureContract $feature): float { $subscriptionFeature = $this->loadedSubscriptionFeatures ->find($feature); @@ -332,7 +334,7 @@ protected function getSubscriptionChargesForAFeature(Model $feature): float ->charges; } - protected function getTicketChargesForAFeature(Model $feature): float + protected function getTicketChargesForAFeature(FeatureContract $feature): float { $ticketFeature = $this->loadedTicketFeatures ->find($feature); @@ -346,7 +348,7 @@ protected function getTicketChargesForAFeature(Model $feature): float ->sum('charges'); } - public function getFeature(string $featureName): ?Feature + public function getFeature(string $featureName): ?FeatureContract { $feature = $this->features->firstWhere('name', $featureName); @@ -386,7 +388,7 @@ protected function loadTicketFeatures(): Collection return $this->loadedTicketFeatures; } - return $this->loadedTicketFeatures = Feature::with([ + return $this->loadedTicketFeatures = $this->featureModelQuery()->with([ 'tickets' => fn (HasMany $query) => $query->withoutExpired()->whereMorphedTo('subscriber', $this), ]) ->whereHas( @@ -395,4 +397,9 @@ protected function loadTicketFeatures(): Collection ) ->get(); } + + private function featureModelQuery(): Builder + { + return config('soulbscription.models.feature')::query(); + } } diff --git a/src/Models/Feature.php b/src/Models/Feature.php index 6521334..984a881 100644 --- a/src/Models/Feature.php +++ b/src/Models/Feature.php @@ -5,9 +5,10 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use LucasDotVin\Soulbscription\Contracts\FeatureContract; use LucasDotVin\Soulbscription\Models\Concerns\HandlesRecurrence; -class Feature extends Model +class Feature extends Model implements FeatureContract { use HandlesRecurrence; use HasFactory; diff --git a/src/Models/FeatureConsumption.php b/src/Models/FeatureConsumption.php index aebc19b..c363aaf 100644 --- a/src/Models/FeatureConsumption.php +++ b/src/Models/FeatureConsumption.php @@ -4,9 +4,10 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use LucasDotVin\Soulbscription\Contracts\FeatureConsumptionContract; use LucasDotVin\Soulbscription\Models\Concerns\Expires; -class FeatureConsumption extends Model +class FeatureConsumption extends Model implements FeatureConsumptionContract { use Expires; use HasFactory; diff --git a/src/Models/FeatureTicket.php b/src/Models/FeatureTicket.php index f70e362..f5f9f30 100644 --- a/src/Models/FeatureTicket.php +++ b/src/Models/FeatureTicket.php @@ -3,9 +3,10 @@ namespace LucasDotVin\Soulbscription\Models; use Illuminate\Database\Eloquent\Model; +use LucasDotVin\Soulbscription\Contracts\FeatureTicketContract; use LucasDotVin\Soulbscription\Models\Concerns\Expires; -class FeatureTicket extends Model +class FeatureTicket extends Model implements FeatureTicketContract { use Expires; diff --git a/src/Models/Plan.php b/src/Models/Plan.php index 8aee393..adf9350 100644 --- a/src/Models/Plan.php +++ b/src/Models/Plan.php @@ -7,8 +7,11 @@ use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; use LucasDotVin\Soulbscription\Models\Concerns\HandlesRecurrence; +use LucasDotVin\Soulbscription\Contracts\PlanContract; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; -class Plan extends Model +class Plan extends Model implements PlanContract { use HandlesRecurrence; use HasFactory; @@ -21,19 +24,19 @@ class Plan extends Model 'periodicity', ]; - public function features() + public function features(): BelongsToMany { return $this->belongsToMany(config('soulbscription.models.feature')) ->using(config('soulbscription.models.feature_plan')) ->withPivot(['charges']); } - public function subscriptions() + public function subscriptions(): HasMany { return $this->hasMany(config('soulbscription.models.subscription')); } - public function calculateGraceDaysEnd(Carbon $recurrenceEnd) + public function calculateGraceDaysEnd(Carbon $recurrenceEnd): Carbon { return $recurrenceEnd->copy()->addDays($this->grace_days); } diff --git a/src/Models/Scopes/ExpiringScope.php b/src/Models/Scopes/ExpiringScope.php index 12b0d44..a21f33b 100644 --- a/src/Models/Scopes/ExpiringScope.php +++ b/src/Models/Scopes/ExpiringScope.php @@ -33,6 +33,7 @@ public function extend(Builder $builder) protected function addWithExpired(Builder $builder) { $builder->macro('withExpired', function (Builder $builder, $withExpired = true) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ if ($withExpired) { return $builder->withoutGlobalScope($this); } @@ -44,6 +45,7 @@ protected function addWithExpired(Builder $builder) protected function addWithoutExpired(Builder $builder) { $builder->macro('withoutExpired', function (Builder $builder) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ $builder->withoutGlobalScope($this)->where( fn (Builder $query) => $query->where('expired_at', '>', now()) @@ -57,6 +59,7 @@ protected function addWithoutExpired(Builder $builder) protected function addOnlyExpired(Builder $builder) { $builder->macro('onlyExpired', function (Builder $builder) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ $builder->withoutGlobalScope($this)->where( fn (Builder $query) => $query->where('expired_at', '<=', now()) diff --git a/src/Models/Scopes/ExpiringWithGraceDaysScope.php b/src/Models/Scopes/ExpiringWithGraceDaysScope.php index a740718..fdca1be 100644 --- a/src/Models/Scopes/ExpiringWithGraceDaysScope.php +++ b/src/Models/Scopes/ExpiringWithGraceDaysScope.php @@ -35,6 +35,7 @@ protected function addWithExpired(Builder $builder) { $builder->macro('withExpired', function (Builder $builder, $withExpired = true) { if ($withExpired) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ return $builder->withoutGlobalScope($this); } @@ -45,6 +46,7 @@ protected function addWithExpired(Builder $builder) protected function addWithoutExpired(Builder $builder) { $builder->macro('withoutExpired', function (Builder $builder) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ $builder->withoutGlobalScope($this)->where('expired_at', '>', now()) ->orWhereNull('expired_at') ->orWhere('grace_days_ended_at', '>', now()); @@ -56,6 +58,7 @@ protected function addWithoutExpired(Builder $builder) protected function addOnlyExpired(Builder $builder) { $builder->macro('onlyExpired', function (Builder $builder) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ $builder->withoutGlobalScope($this) ->where('expired_at', '<=', now()) ->where( diff --git a/src/Models/Scopes/StartingScope.php b/src/Models/Scopes/StartingScope.php index cca9936..6f50357 100644 --- a/src/Models/Scopes/StartingScope.php +++ b/src/Models/Scopes/StartingScope.php @@ -29,6 +29,7 @@ public function extend(Builder $builder) protected function addWithNotStarted(Builder $builder) { $builder->macro('withNotStarted', function (Builder $builder, $withNotStarted = true) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ if ($withNotStarted) { return $builder->withoutGlobalScope($this); } @@ -40,6 +41,7 @@ protected function addWithNotStarted(Builder $builder) protected function addWithoutNotStarted(Builder $builder) { $builder->macro('withoutNotStarted', function (Builder $builder) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ $builder->withoutGlobalScope($this)->where('started_at', '<=', now()); return $builder; @@ -49,6 +51,7 @@ protected function addWithoutNotStarted(Builder $builder) protected function addOnlyNotStarted(Builder $builder) { $builder->macro('onlyNotStarted', function (Builder $builder) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ $builder->withoutGlobalScope($this)->where('started_at', '>', now()); return $builder; diff --git a/src/Models/Scopes/SuppressingScope.php b/src/Models/Scopes/SuppressingScope.php index 17fedf7..01475c1 100644 --- a/src/Models/Scopes/SuppressingScope.php +++ b/src/Models/Scopes/SuppressingScope.php @@ -29,6 +29,7 @@ public function extend(Builder $builder) protected function addWithSuppressed(Builder $builder) { $builder->macro('withSuppressed', function (Builder $builder, $withSuppressed = true) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ if ($withSuppressed) { return $builder->withoutGlobalScope($this); } @@ -40,6 +41,7 @@ protected function addWithSuppressed(Builder $builder) protected function addWithoutSuppressed(Builder $builder) { $builder->macro('withoutSuppressed', function (Builder $builder) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ $builder->withoutGlobalScope($this)->whereNull('suppressed_at'); return $builder; @@ -49,6 +51,7 @@ protected function addWithoutSuppressed(Builder $builder) protected function addOnlySuppressed(Builder $builder) { $builder->macro('onlySuppressed', function (Builder $builder) { + /** @var \Illuminate\Database\Eloquent\Scope $this */ $builder->withoutGlobalScope($this)->whereNotNull('suppressed_at'); return $builder; diff --git a/src/Models/Subscription.php b/src/Models/Subscription.php index 3d88ba5..a78e45c 100644 --- a/src/Models/Subscription.php +++ b/src/Models/Subscription.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; +use LucasDotVin\Soulbscription\Contracts\SubscriptionContract; use LucasDotVin\Soulbscription\Events\SubscriptionCanceled; use LucasDotVin\Soulbscription\Events\SubscriptionRenewed; use LucasDotVin\Soulbscription\Events\SubscriptionScheduled; @@ -18,8 +19,11 @@ use LucasDotVin\Soulbscription\Models\Scopes\ExpiringWithGraceDaysScope; use LucasDotVin\Soulbscription\Models\Scopes\StartingScope; use LucasDotVin\Soulbscription\Models\Scopes\SuppressingScope; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\MorphTo; -class Subscription extends Model +class Subscription extends Model implements SubscriptionContract { use ExpiresAndHasGraceDays; use HasFactory; @@ -40,22 +44,22 @@ class Subscription extends Model 'was_switched', ]; - public function plan() + public function plan(): BelongsTo { return $this->belongsTo(config('soulbscription.models.plan')); } - public function renewals() + public function renewals(): HasMany { return $this->hasMany(config('soulbscription.models.subscription_renewal')); } - public function subscriber() + public function subscriber(): MorphTo { return $this->morphTo('subscriber'); } - public function scopeNotActive(Builder $query) + public function scopeNotActive(Builder $query): Builder { return $query->withoutGlobalScopes([ ExpiringWithGraceDaysScope::class, @@ -69,12 +73,12 @@ public function scopeNotActive(Builder $query) }); } - public function scopeCanceled(Builder $query) + public function scopeCanceled(Builder $query): Builder { return $query->whereNotNull('canceled_at'); } - public function scopeNotCanceled(Builder $query) + public function scopeNotCanceled(Builder $query): Builder { return $query->whereNull('canceled_at'); } @@ -138,7 +142,7 @@ public function cancel(?Carbon $cancelDate = null): self return $this; } - public function suppress(?Carbon $suppressation = null) + public function suppress(?Carbon $suppressation = null): self { $suppressationDate = $suppressation ?: now(); diff --git a/src/Models/SubscriptionRenewal.php b/src/Models/SubscriptionRenewal.php index e0d5ebc..1a3664a 100644 --- a/src/Models/SubscriptionRenewal.php +++ b/src/Models/SubscriptionRenewal.php @@ -4,8 +4,10 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use LucasDotVin\Soulbscription\Contracts\SubscriptionRenewalContract; +use Illuminate\Database\Eloquent\Relations\BelongsTo; -class SubscriptionRenewal extends Model +class SubscriptionRenewal extends Model implements SubscriptionRenewalContract { use HasFactory; @@ -19,7 +21,7 @@ class SubscriptionRenewal extends Model 'renewal', ]; - public function subscription() + public function subscription(): BelongsTo { return $this->belongsTo(config('soulbscription.models.subscription')); }