*/ protected function casts(): array { return [ 'required' => 'boolean', 'summary_payload' => 'array', 'render_payload' => 'array', 'measured_at' => 'datetime', ]; } /** * @return BelongsTo */ public function tenantReview(): BelongsTo { return $this->belongsTo(TenantReview::class); } /** * @return BelongsTo */ public function workspace(): BelongsTo { return $this->belongsTo(Workspace::class); } /** * @return BelongsTo */ public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } /** * @param Builder $query * @return Builder */ public function scopeRequired(Builder $query): Builder { return $query->where('required', true); } public function completenessEnum(): TenantReviewCompletenessState { return TenantReviewCompletenessState::tryFrom((string) $this->completeness_state) ?? TenantReviewCompletenessState::Missing; } public function isControlInterpretation(): bool { return (string) $this->section_key === ComplianceEvidenceMappingV1::SECTION_KEY; } /** * @return list> */ public function controlInterpretationEntries(): array { if (! $this->isControlInterpretation()) { return []; } $renderPayload = is_array($this->render_payload) ? $this->render_payload : []; $entries = $renderPayload['entries'] ?? []; return is_array($entries) ? array_values(array_filter($entries, static fn (mixed $entry): bool => is_array($entry))) : []; } }