*/ use HasApiTokens, HasFactory, HasRoles, Notifiable, SoftDeletes; protected $fillable = [ 'name', 'email', 'password', 'phone', 'voip_extension', 'avatar', 'is_active', 'last_login_at', 'last_login_ip', 'current_login_at', 'last_logout_at', 'total_presence_seconds', 'sales_agent_preferred_view', ]; protected $hidden = [ 'password', 'remember_token', ]; protected $appends = [ 'avatar_url', ]; protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', 'is_active' => 'boolean', 'last_login_at' => 'datetime', 'current_login_at' => 'datetime', 'last_logout_at' => 'datetime', 'total_presence_seconds' => 'integer', ]; } public function teams(): BelongsToMany { return $this->belongsToMany(Team::class); } public function assignedLeads(): HasMany { return $this->hasMany(Lead::class, 'assigned_to'); } public function calls(): HasMany { return $this->hasMany(Call::class); } public function followUps(): HasMany { return $this->hasMany(FollowUp::class); } public function assignedTasks(): HasMany { return $this->hasMany(Task::class, 'assigned_to'); } public function savedViews(): HasMany { return $this->hasMany(SavedView::class); } public function dashboardPreference() { return $this->hasOne(DashboardPreference::class); } public function notificationPreferences(): HasMany { return $this->hasMany(NotificationPreference::class); } public function leadAssignments(): HasMany { return $this->hasMany(LeadAssignment::class, 'assigned_by'); } public function createdInvoices(): HasMany { return $this->hasMany(Invoice::class, 'created_by'); } public function approvedInvoices(): HasMany { return $this->hasMany(Invoice::class, 'approved_by'); } protected function avatarUrl(): Attribute { return Attribute::get(function (): ?string { if (! $this->avatar) { return null; } $path = parse_url($this->avatar, PHP_URL_PATH) ?: $this->avatar; $filename = basename(str_replace('\\', '/', $path)); return '/api/media/avatars/'.rawurlencode($filename); }); } }