'array', 'metadata' => 'array', 'assignments' => 'array', 'scope_tags' => 'array', 'secret_fingerprints' => 'array', 'redaction_version' => 'integer', 'captured_at' => 'datetime', 'capture_purpose' => PolicyVersionCapturePurpose::class, ]; public function previous(): ?self { return $this->policy ? $this->policy ->versions() ->where('version_number', '<', $this->version_number) ->orderByDesc('version_number') ->first() : null; } public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } public function policy(): BelongsTo { return $this->belongsTo(Policy::class); } public function operationRun(): BelongsTo { return $this->belongsTo(OperationRun::class); } public function baselineProfile(): BelongsTo { return $this->belongsTo(BaselineProfile::class); } public function scopePruneEligible($query, int $days = 90) { return $query ->whereNull('deleted_at') ->where('captured_at', '<', now()->subDays($days)) ->whereRaw( 'policy_versions.version_number < (select max(pv2.version_number) from policy_versions pv2 where pv2.policy_id = policy_versions.policy_id and pv2.deleted_at is null)' ); } }