'boolean', 'trial_duration_days' => 'integer', 'trial_requires_payment_method' => 'boolean', 'trial_auto_converts' => 'boolean', 'trial_conversion_action' => 'string', 'trial_extension_limit' => 'integer', 'trial_feature_overrides' => 'array', ]; public const ACTION_UPGRADE_TO_PAID = 'upgrade_to_paid'; public const ACTION_CANCEL = 'cancel'; public const ACTION_NOTIFY = 'notify'; public function plan(): BelongsTo { return $this->belongsTo(Plan::class); } public function scopeEnabled($query) { return $query->where('trial_enabled', true); } public function canExtendTrial(int $currentExtensions = 0): bool { return $this->trial_extension_limit > $currentExtensions; } public function getTrialEndDate(): \Carbon\Carbon { return now()->addDays($this->trial_duration_days); } public function hasFeatureOverride(string $featureName): bool { return isset($this->trial_feature_overrides[$featureName]); } public function getFeatureOverride(string $featureName) { return $this->trial_feature_overrides[$featureName] ?? null; } }