$selectionPayload * @return array{latestRun: InventorySyncRun|null, missing: Collection, lowConfidence: bool} */ public function missingForSelection(Tenant $tenant, array $selectionPayload): array { $normalized = $this->selectionHasher->normalize($selectionPayload); $normalized['policy_types'] = $this->policyTypeResolver->filterRuntime($normalized['policy_types']); $selectionHash = $this->selectionHasher->hash($normalized); $latestRun = InventorySyncRun::query() ->where('tenant_id', $tenant->getKey()) ->where('selection_hash', $selectionHash) ->whereIn('status', [ InventorySyncRun::STATUS_SUCCESS, InventorySyncRun::STATUS_PARTIAL, InventorySyncRun::STATUS_FAILED, InventorySyncRun::STATUS_SKIPPED, ]) ->orderByDesc('finished_at') ->orderByDesc('id') ->first(); if (! $latestRun) { return [ 'latestRun' => null, 'missing' => InventoryItem::query()->whereRaw('1 = 0')->get(), 'lowConfidence' => true, ]; } $missingQuery = InventoryItem::query() ->where('tenant_id', $tenant->getKey()) ->whereIn('policy_type', $normalized['policy_types']) ->where(function ($query) use ($latestRun): void { $query ->whereNull('last_seen_run_id') ->orWhere('last_seen_run_id', '!=', $latestRun->getKey()); }); $lowConfidence = $latestRun->status !== InventorySyncRun::STATUS_SUCCESS || (bool) ($latestRun->had_errors ?? false); return [ 'latestRun' => $latestRun, 'missing' => $missingQuery->get(), 'lowConfidence' => $lowConfidence, ]; } }