*/ use HasFactory; protected $fillable = [ 'name', 'stripe_price_id', 'features', 'active', ]; /** * Resolve the active plan for a user. * Falls back to the free plan when no active Cashier subscription exists. */ public static function resolveForUser(User $user): self { $cache = Cache::supportsTags() ? Cache::tags(['plans']) : Cache::store(); return $cache->remember( "plan_for_user_{$user->id}", 3600, function () use ($user): self { $priceId = null; if (method_exists($user, 'subscriptions')) { $subscription = $user->subscriptions()->active()->first(); $priceId = $subscription?->stripe_price ?? null; } if ($priceId) { $plan = static::where('stripe_price_id', $priceId)->where('active', true)->first(); if ($plan) { return $plan; } } return static::where('name', PlanTier::Free->value)->firstOrFail(); } ); } protected static function booted(): void { static::saved(function (): void { if (Cache::supportsTags()) { Cache::tags(['plans'])->flush(); } }); } protected function casts(): array { return [ 'features' => 'array', 'active' => 'boolean', ]; } }