58 lines
1.3 KiB
PHP
58 lines
1.3 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Models;
|
||
|
|
|
||
|
|
use App\Enums\SubscriptionStatusEnum;
|
||
|
|
use Carbon\Carbon;
|
||
|
|
use Illuminate\Database\Eloquent\Model;
|
||
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @property int $id
|
||
|
|
* @property int $planner_id
|
||
|
|
* @property Planner $planner
|
||
|
|
* @property string $stripe_subscription_id
|
||
|
|
* @property string $stripe_customer_id
|
||
|
|
* @property SubscriptionStatusEnum $status
|
||
|
|
* @property string $plan
|
||
|
|
* @property Carbon $trial_ends_at
|
||
|
|
* @property Carbon $ends_at
|
||
|
|
*/
|
||
|
|
class Subscription extends Model
|
||
|
|
{
|
||
|
|
protected $fillable = [
|
||
|
|
'planner_id',
|
||
|
|
'stripe_subscription_id',
|
||
|
|
'stripe_customer_id',
|
||
|
|
'status',
|
||
|
|
'plan',
|
||
|
|
'trial_ends_at',
|
||
|
|
'ends_at',
|
||
|
|
];
|
||
|
|
|
||
|
|
protected $casts = [
|
||
|
|
'status' => SubscriptionStatusEnum::class,
|
||
|
|
'trial_ends_at' => 'datetime',
|
||
|
|
'ends_at' => 'datetime',
|
||
|
|
];
|
||
|
|
|
||
|
|
public function planner(): BelongsTo
|
||
|
|
{
|
||
|
|
return $this->belongsTo(Planner::class);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function isValid(): bool
|
||
|
|
{
|
||
|
|
if ($this->status->allowsAccess()) {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Canceled but still in grace period
|
||
|
|
if ($this->status === SubscriptionStatusEnum::CANCELED && $this->ends_at?->isFuture()) {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|