'datetime', 'end_date' => 'datetime', 'phone_enabled' => 'boolean', 'is_active' => 'boolean', ]; } /** * Route model binding uses 'slug' instead of 'id'. */ public function getRouteKeyName(): string { return 'slug'; } public function user(): BelongsTo { return $this->belongsTo(User::class); } public function subscribers(): HasMany { return $this->hasMany(Subscriber::class); } public function mailwizzConfig(): HasOne { return $this->hasOne(MailwizzConfig::class); } public function isBeforeStart(): bool { return Carbon::now()->lt($this->start_date); } public function isActive(): bool { $now = Carbon::now(); return $now->gte($this->start_date) && $now->lte($this->end_date); } public function isExpired(): bool { return Carbon::now()->gt($this->end_date); } public function scopeActive(Builder $query): Builder { return $query->where('is_active', true); } /** * Lifecycle label for admin tables: before registration opens, open window, or after end. */ public function statusKey(): string { if ($this->isBeforeStart()) { return 'before_start'; } if ($this->isExpired()) { return 'expired'; } return 'active'; } }