*/ use HasFactory, Notifiable, HasApiTokens, HasRoles, 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 leadAssignments(): HasMany { return $this->hasMany(LeadAssignment::class, 'assigned_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; $path = ltrim($path, '/'); if (str_starts_with($path, 'storage/')) { $path = substr($path, strlen('storage/')); } if (str_starts_with($path, 'public/')) { $path = substr($path, strlen('public/')); } return url(Storage::url($path)); }); } }