'boolean', ]; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'assigned_to', 'asset_id', 'notes', ]; /** * The attributes that should be included when searching the model. * * @var array */ protected $searchableAttributes = [ 'notes', ]; /** * The relations and their attributes that should be included when searching the model. * * @var array */ protected $searchableRelations = [ 'user' => ['first_name', 'last_name', 'display_name', 'username', 'email'], 'asset' => ['name', 'asset_tag'], ]; public function getCompanyableParents() { return ['asset', 'license']; } /** * Determine whether the user should be required to accept the license * * @author A. Gianotto * * @since [v4.0] * * @return bool */ public function requireAcceptance() { if ($this->license && $this->license->category) { return $this->license->category->require_acceptance; } return false; } public function getEula() { return $this->license->getEula(); } protected function name(): Attribute { return Attribute::make( get: fn (mixed $value) => $this->license?->name, ); } protected function displayName(): Attribute { return Attribute::make( get: fn (mixed $value) => $this->license?->name, ); } /** * Establishes the seat -> license relationship * * @author A. Gianotto * * @since [v1.0] * * @return Relation */ public function license() { return $this->belongsTo(License::class, 'license_id'); } /** * Establishes the seat -> assignee relationship * * @author A. Gianotto * * @since [v1.0] * * @return Relation */ public function user() { return $this->belongsTo(User::class, 'assigned_to')->withTrashed(); } /** * Establishes the seat -> asset relationship * * @author A. Gianotto * * @since [v4.0] * * @return Relation */ public function asset() { return $this->belongsTo(Asset::class, 'asset_id')->withTrashed(); } /** * Determines the assigned seat's location based on user * or asset its assigned to * * @author A. Gianotto * * @since [v4.0] * * @return string */ public function location() { if (($this->user) && ($this->user->location)) { return $this->user->location; } elseif (($this->asset) && ($this->asset->location)) { return $this->asset->location; } return false; } /** * Get the list of checkouts for this License * * @author [A. Gianotto] [] * * @since [v2.0] * * @return Relation */ public function checkouts() { return $this->assetlog()->where('action_type', '=', 'checkout') ->orderBy('created_at', 'desc') ->withTrashed(); } /** * Establishes the license -> action logs relationship * * @author [A. Gianotto] [] * * @since [v3.0] * * @return Relation */ public function assetlog() { return $this->hasMany(Actionlog::class, 'item_id')->where('item_type', self::class)->orderBy('created_at', 'desc')->withTrashed(); } /** * Query builder scope to order on department * * @param Builder $query Query builder instance * @param text $order Order * @return Builder Modified query builder */ public function scopeOrderDepartments($query, $order) { return $query->leftJoin('users as license_seat_users', 'license_seats.assigned_to', '=', 'license_seat_users.id') ->leftJoin('departments as license_user_dept', 'license_user_dept.id', '=', 'license_seat_users.department_id') ->whereNotNull('license_seats.assigned_to') ->orderBy('license_user_dept.name', $order); } public function scopeOrderCompany($query, $order) { return $query->leftJoin('users as license_seat_users', 'license_seats.assigned_to', '=', 'license_seat_users.id') ->leftJoin('companies as license_user_company', 'license_user_company.id', '=', 'license_seat_users.company_id') ->whereNotNull('license_seats.assigned_to') ->orderBy('license_user_company.name', $order); } public function scopeByAssigned($query) { return $query->where( function ($query) { $query->whereNotNull('assigned_to') ->orWhereNotNull('asset_id'); } ); } }