hasMany(SocialProvider::class); } public function avatar(): BelongsTo { return $this->belongsTo(Asset::class, 'asset_id'); } public function companies(): BelongsToMany { return $this->belongsToMany(Company::class, 'company_members'); } public function membership(): HasMany { return $this->hasMany(CompanyMember::class); } public function advisoryMembership(): HasManyThrough { return $this->hasManyThrough(AdvisoryMember::class, CompanyMember::class); } public function applicationConclusions(): HasMany { return $this->hasMany(Conclusion::class, 'author_id'); } public function getInitialsAttribute(): string { return collect(explode(' ', $this->name))->slice(0, 2)->map(function($item) { return Str::upper(Str::substr($item, 0, 1)); })->join(''); } public function getFirstAndMidNameAttribute(): string { return collect(explode(' ', $this->name))->slice(1, 2)->join(' '); } public function getIsAdminAttribute(): bool { return $this->hasRole('Administrator') || $this->isMainCompanyAdmin; } public function getIsModeratorAttribute(): bool { return $this->membership()->where(['role' => CompanyMemberRole::MODERATOR])->mainCompany()->exists(); } public function getIsMainCompanyAdminAttribute(): bool { return $this->membership()->where(['role' => CompanyMemberRole::ADMINISTRATOR])->mainCompany()->exists(); } public function getIsMainCompanyMemberAttribute(): bool { return $this->companies()->where(['is_main' => 1])->exists(); } public function getIsExpertAttribute(): bool { return $this->membership()->mainCompany()->whereHas('objects', function($query) { Field::applyFilters($query, collect(['types' => 'company-member-properties', 'moderate-permissions' => 'applications'])); })->exists(); } public function getPrivilegesAttribute(): array { return [ 'admin' => $this->isAdmin, 'expert' => $this->isExpert, 'main_company_member' => $this->isMainCompanyMember ]; } public static function getByData($data, $triggerEvent = false) { $result = false; if ($email = trim($data['email'] ?? null)) { $result = self::query()->where(['email' => $email])->first(); if (!$result) { $password = $data['password'] ?? (App::environment('local') ? 'Qwerty1!' : Str::random(8)); $result = self::create(['email' => $email, 'password' => $password]); $result->update(['name' => trim($data['name'] ?? null), 'phone' => trim($data['phone'] ?? null)]); $result->assignRole($data['role'] ?? 'User'); if ($triggerEvent) event(new UserRegistered($result, $password)); } else { if ($val = trim($data['phone'] ?? null)) $result->update(['phone' => $val]); } if ($val = $data['avatar'] ?? null) $result->setAvatar($val); } return $result; } public function setAvatar($val) { $asset = Asset::byUuid($val)->first(); $this->update(['asset_id' => $asset->id ?? null]); } public static function create(array $attributes = []) { if (array_key_exists('password', $attributes)) { $attributes['password'] = Hash::make($attributes['password']); } return static::query()->create($attributes); } public function setPassword(string $password): bool { return $this->update(['password' => Hash::make($password)]); } public function checkPassword(string $password): bool { return Hash::check($password, $this->password); } public function sendPasswordResetNotification($token) { Mail::to($this->email)->send(new PasswordResetRequested($this, $token)); } }