*/ public const ACTIVE_CONCERN_FAMILIES = [ PortfolioArrivalContextToken::FAMILY_BACKUP_HEALTH, PortfolioArrivalContextToken::FAMILY_RECOVERY_EVIDENCE, ]; /** * @var list */ public const MANUAL_STATES = [ self::STATE_REVIEWED, self::STATE_FOLLOW_UP_NEEDED, ]; /** * @var list */ public const DERIVED_STATES = [ self::DERIVED_STATE_NOT_REVIEWED, self::STATE_REVIEWED, self::STATE_FOLLOW_UP_NEEDED, self::DERIVED_STATE_CHANGED_SINCE_REVIEW, ]; protected $guarded = []; /** * @return array */ protected function casts(): array { return [ 'review_snapshot' => 'array', 'reviewed_at' => 'datetime', 'last_seen_matching_at' => 'datetime', 'resolved_at' => 'datetime', ]; } /** * @return BelongsTo */ public function workspace(): BelongsTo { return $this->belongsTo(Workspace::class); } /** * @return BelongsTo */ public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } /** * @return BelongsTo */ public function reviewer(): BelongsTo { return $this->belongsTo(User::class, 'reviewed_by_user_id'); } /** * @param Builder $query * @return Builder */ public function scopeForWorkspace(Builder $query, int $workspaceId): Builder { return $query->where('workspace_id', $workspaceId); } /** * @param Builder $query * @return Builder */ public function scopeForTenant(Builder $query, int $tenantId): Builder { return $query->where('tenant_id', $tenantId); } /** * @param Builder $query * @return Builder */ public function scopeForConcernFamily(Builder $query, string $concernFamily): Builder { return $query->where('concern_family', $concernFamily); } /** * @param Builder $query * @return Builder */ public function scopeActive(Builder $query): Builder { return $query->whereNull('resolved_at'); } /** * @param Builder $query * @return Builder */ public function scopeResolved(Builder $query): Builder { return $query->whereNotNull('resolved_at'); } }