*/ protected function casts(): array { return [ 'summary' => 'array', 'metadata' => 'array', 'last_evaluated_at' => 'datetime', 'started_at' => 'datetime', 'completed_at' => 'datetime', 'cancelled_at' => 'datetime', 'superseded_at' => 'datetime', ]; } /** * @return BelongsTo */ public function workspace(): BelongsTo { return $this->belongsTo(Workspace::class); } /** * @return BelongsTo */ public function tenant(): BelongsTo { return $this->belongsTo(ManagedEnvironment::class, 'managed_environment_id'); } /** * @return BelongsTo */ public function environmentReview(): BelongsTo { return $this->belongsTo(EnvironmentReview::class); } /** * @return BelongsTo */ public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by_user_id'); } /** * @return BelongsTo */ public function assignee(): BelongsTo { return $this->belongsTo(User::class, 'assigned_to_user_id'); } /** * @return HasMany */ public function steps(): HasMany { return $this->hasMany(ReviewPublicationResolutionStep::class, 'case_id') ->orderBy('position') ->orderBy('id'); } public function currentStep(): ?ReviewPublicationResolutionStep { $currentStepKey = $this->current_step_key; if (! is_string($currentStepKey) || $currentStepKey === '') { return null; } if ($this->relationLoaded('steps')) { $step = $this->steps->firstWhere('step_key', $currentStepKey); return $step instanceof ReviewPublicationResolutionStep ? $step : null; } return $this->steps()->where('step_key', $currentStepKey)->first(); } public function statusEnum(): ReviewPublicationResolutionCaseStatus { return ReviewPublicationResolutionCaseStatus::tryFrom((string) $this->status) ?? ReviewPublicationResolutionCaseStatus::Open; } public function isActive(): bool { return $this->statusEnum()->isActive(); } public function currentStepKeyEnum(): ?ReviewPublicationResolutionStepKey { return ReviewPublicationResolutionStepKey::tryFrom((string) $this->current_step_key); } /** * @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('managed_environment_id', $tenantId); } /** * @param Builder $query * @return Builder */ public function scopeForReview(Builder $query, EnvironmentReview|int $review): Builder { return $query->where('environment_review_id', $review instanceof EnvironmentReview ? (int) $review->getKey() : $review); } /** * @param Builder $query * @return Builder */ public function scopeActive(Builder $query): Builder { return $query->whereIn('status', ReviewPublicationResolutionCaseStatus::activeValues()); } }