'datetime', 'email_otp_expires_at' => 'datetime', 'otp_expires_at' => 'datetime', 'otp_last_sent_at' => 'datetime', 'password' => 'hashed', ]; public function canAccessPanel(Panel $panel): bool { return true; } public function logins() { return $this->hasMany(UserLogin::class); } public function transactions() { return $this->hasMany(\App\Models\BorrowTransaction::class, 'anggota_id'); } public function anggota() { return $this->hasOne(\App\Models\Anggota::class, 'user_id'); } public function getRecentLogins($perPage = 10) { return $this->logins()->latest()->paginate($perPage); } // ============================== // 🔥 EMAIL VERIFICATION (WAJIB) // ============================== public function hasVerifiedEmail() { return !is_null($this->email_verified_at); } public function markEmailAsVerified() { if ($this->hasVerifiedEmail()) { return true; } $this->forceFill([ 'email_verified_at' => Carbon::now(), ])->save(); return true; } public function sendEmailVerificationNotification() { $this->notify(new \Illuminate\Auth\Notifications\VerifyEmail()); } }