daysForSeverity((string) $finding->severity, $tenant); } public function daysForSeverity(string $severity, Tenant $tenant): int { $workspace = $tenant->workspace; if (! $workspace instanceof Workspace) { throw new InvalidArgumentException('Tenant workspace is required to resolve findings SLA.'); } $policy = $this->settingsResolver->resolveValue($workspace, 'findings', 'sla_days'); $policy = is_array($policy) ? $policy : []; $severity = strtolower(trim($severity)); $days = $policy[$severity] ?? null; if (! is_numeric($days)) { throw new InvalidArgumentException(sprintf('No SLA policy days configured for severity [%s].', $severity)); } return (int) $days; } public function dueAtForSeverity(string $severity, Tenant $tenant, ?CarbonImmutable $from = null): CarbonImmutable { $from ??= CarbonImmutable::now(); return $from->addDays($this->daysForSeverity($severity, $tenant)); } }