nextVersionNumber($policy); $version = PolicyVersion::create([ 'tenant_id' => $policy->tenant_id, 'policy_id' => $policy->id, 'version_number' => $versionNumber, 'policy_type' => $policy->policy_type, 'platform' => $policy->platform, 'created_by' => $createdBy, 'captured_at' => CarbonImmutable::now(), 'snapshot' => $payload, 'metadata' => $metadata, ]); $this->auditLogger->log( tenant: $policy->tenant, action: 'policy.versioned', context: [ 'metadata' => [ 'policy_id' => $policy->id, 'version_number' => $versionNumber, ], ], actorEmail: $createdBy, resourceType: 'policy', resourceId: (string) $policy->id ); return $version; } private function nextVersionNumber(Policy $policy): int { $current = PolicyVersion::query() ->where('policy_id', $policy->id) ->max('version_number'); return (int) ($current ?? 0) + 1; } }