*/ protected function casts(): array { return [ 'summary' => 'array', 'generated_at' => 'datetime', 'expires_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 operationRun(): BelongsTo { return $this->belongsTo(OperationRun::class); } /** * @return BelongsTo */ public function initiator(): BelongsTo { return $this->belongsTo(User::class, 'initiated_by_user_id'); } /** * @return HasMany */ public function items(): HasMany { return $this->hasMany(EvidenceSnapshotItem::class)->orderBy('sort_order')->orderBy('id'); } /** * @return HasMany */ public function reviewPacks(): HasMany { return $this->hasMany(ReviewPack::class); } /** * @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 scopeActive(Builder $query): Builder { return $query->where('status', EvidenceSnapshotStatus::Active->value); } /** * @param Builder $query * @return Builder */ public function scopeCurrent(Builder $query): Builder { return $query ->whereIn('status', [ EvidenceSnapshotStatus::Queued->value, EvidenceSnapshotStatus::Generating->value, EvidenceSnapshotStatus::Active->value, ]); } public function isCurrent(): bool { return in_array((string) $this->status, [ EvidenceSnapshotStatus::Queued->value, EvidenceSnapshotStatus::Generating->value, EvidenceSnapshotStatus::Active->value, ], true); } public function completenessState(): EvidenceCompletenessState { return EvidenceCompletenessState::tryFrom((string) $this->completeness_state) ?? EvidenceCompletenessState::Missing; } }