117 خطوط
3.0 KiB
PHP
117 خطوط
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Database\Factories\UserFactory;
|
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
use Illuminate\Foundation\Auth\User as Authenticatable;
|
|
use Illuminate\Notifications\Notifiable;
|
|
use Laravel\Sanctum\HasApiTokens;
|
|
use Spatie\Permission\Traits\HasRoles;
|
|
|
|
class User extends Authenticatable
|
|
{
|
|
/** @use HasFactory<UserFactory> */
|
|
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);
|
|
});
|
|
}
|
|
}
|