/
DATKAI
/
ITCUP
Обзор
Документация
Войти
/
DATKAI
/
ITCUP
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
app/Models/User.php
140 строк
4 KB
ITCUP Admin
feat(account): вторая панель ЛК сотрудника на /account
17 апр 2026, 13:14
17 апр 2026, 13:14
c5e4ef1
Код
Авторство
О чём код?
<?php namespace App\Models; use Database\Factories\UserFactory; use Filament\Models\Contracts\FilamentUser; use Filament\Panel; use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Attributes\Hidden; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Spatie\Permission\Traits\HasRoles; #[Fillable([ 'name', 'email', 'password', 'first_name', 'last_name', 'middle_name', 'phone', 'avatar_path', 'birth_date', 'employee_id', 'position', 'branch_id', 'department_id', 'manager_id', 'employment_status', 'hired_at', 'dismissed_at', 'ad_username', 'ad_guid', 'custom_field_values', 'notes', ])] #[Hidden(['password', 'remember_token'])] class User extends Authenticatable implements FilamentUser { /** @use HasFactory<UserFactory> */ use HasFactory, HasRoles, Notifiable; public const EMPLOYMENT_STATUSES = [ 'active' => 'Работает', 'vacation' => 'В отпуске', 'sick_leave' => 'На больничном', 'dismissed' => 'Уволен', ]; public const EMPLOYMENT_STATUS_COLORS = [ 'active' => 'success', 'vacation' => 'info', 'sick_leave' => 'warning', 'dismissed' => 'danger', ]; protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', 'birth_date' => 'date', 'hired_at' => 'date', 'dismissed_at' => 'date', 'custom_field_values' => 'array', ]; } protected static function booted(): void { static::saving(function (User $user) { // Собираем отображаемое имя из ФИО если не задано вручную if (empty($user->name) || $user->isDirty(['first_name', 'last_name'])) { $parts = array_filter([$user->last_name, $user->first_name, $user->middle_name]); if ($parts) { $user->name = implode(' ', $parts); } } // Автоматически фиксируем дату увольнения при переходе в статус "Уволен" if ($user->isDirty('employment_status')) { if ($user->employment_status === 'dismissed' && !$user->dismissed_at) { $user->dismissed_at = now()->toDateString(); } } }); } public function canAccessPanel(Panel $panel): bool { // Уволенные никуда не заходят if ($this->employment_status === 'dismissed') { return false; } // В админку — только admin if ($panel->getId() === 'admin') { return $this->hasRole('admin'); } // В ЛК — любой авторизованный сотрудник (в т.ч. admin) return true; } public function branch(): BelongsTo { return $this->belongsTo(Branch::class); } public function department(): BelongsTo { return $this->belongsTo(Department::class); } public function manager(): BelongsTo { return $this->belongsTo(User::class, 'manager_id'); } public function subordinates(): HasMany { return $this->hasMany(User::class, 'manager_id'); } public function credentials(): HasMany { return $this->hasMany(Credential::class); } public function assignedAssets(): HasMany { return $this->hasMany(Asset::class, 'assigned_to'); } public function assignedTasks(): HasMany { return $this->hasMany(Task::class, 'assigned_to'); } public function isDismissed(): bool { return $this->employment_status === 'dismissed'; } public function getFullNameAttribute(): string { $parts = array_filter([$this->last_name, $this->first_name, $this->middle_name]); return $parts ? implode(' ', $parts) : $this->name; } }