CRM/backend/app/Models/User.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);
});
}
}