make(Kernel::class)->bootstrap(); $identity = portalQaAssertTarget($target); config(['portal.profile_access_enabled' => true, 'portal.opportunity_specialized_drafts_enabled' => true]); $directory = dirname(__DIR__).'/storage/app/private/investmoz-v2/portal-audit'; $http = json_decode(file_get_contents($directory.'/opportunity-semantic-http-qa.json'), true, 512, JSON_THROW_ON_ERROR); throw_unless($http['result'] === 'passed' && $http['target'] === $identity->database.':'.$identity->port, RuntimeException::class, 'QA proof mismatch'); DB::beginTransaction(); DB::statement('SET TRANSACTION READ ONLY'); $result = ['target' => $identity, 'captured_at' => gmdate('c'), 'active_writes' => 0, 'visual_pending' => true, 'contract_version' => OpportunityCanonicalContract::VERSION, 'categories' => []]; foreach ($http['cases'] as $case) { $record = Opportunity::findOrFail($case['id']); $row = ['id' => $record->id, 'category' => $case['category'], 'working_state' => app(PortalProfileAccess::class)->state($record), 'publication_status' => $record->status]; try { $snapshot = app(OpportunityCanonicalContract::class)->validateSubmission($record); $row += ['canonical_validation' => 'passed', 'payload_sha256' => $snapshot['hash'], 'resources' => array_map('count', $snapshot['resources']), 'countries' => array_map(fn ($r) => $r['payload']['country_code'], $snapshot['resources']['locations'])]; } catch (ValidationException $error) { $row += ['canonical_validation' => 'blocked', 'missing' => array_keys($error->errors())]; } $result['categories'][] = $row; } $counts = array_count_values(array_column($result['categories'], 'canonical_validation')); throw_unless($counts === ['passed' => 6, 'blocked' => 4], RuntimeException::class, 'Unexpected current semantic coverage'); $docIds = DB::table('opportunity_documents')->whereIn('opportunity_id', array_column($http['cases'], 'id'))->pluck('document_id')->all(); $imageIds = DB::table('opportunity_images')->whereIn('opportunity_id', array_column($http['cases'], 'id'))->pluck('document_id')->all(); $result['document_scans'] = DB::table('documents')->whereIn('id', [...$docIds, ...$imageIds])->get(['id', 'media_type', 'sha256', 'malware_scanned_sha256', 'malware_scan_status', 'malware_engine', 'storage_encryption']); $result['territories'] = ['registered' => DB::table('geo_locations')->whereNull('deleted_at')->count(), 'geometries' => DB::table('geo_geometries')->whereNull('deleted_at')->count(), 'visual' => 'pending']; $keys = Opportunity::whereIn('id', array_column($http['cases'], 'id'))->pluck('management_creation_key')->all(); $result['tasks'] = DB::table('tasks')->where('source_system', 'opportunity-workflow')->whereIn('correlation_id', $keys)->get(['id', 'external_id', 'task_type', 'status', 'assignee_user_id', 'due_at']); $promoter = User::findOrFail(21); $result['promoter'] = ['id' => $promoter->id, 'name' => $promoter->name, 'mfa_confirmed' => $promoter->two_factor_confirmed_at !== null, 'contexts' => app(PortalProfileAccess::class)->navigation($promoter)['contexts']]; $result['active_manifest_sha256'] = hash_file('sha256', dirname(__DIR__).'/public/build/manifest.json'); $result['qa_manifest_sha256'] = hash_file('sha256', dirname(__DIR__).'/public/build-qa-opportunities/manifest.json'); $result['source_schema_sha256'] = hash_file('sha256', resource_path('data/investmoz-opportunity-modular.schema.json')); DB::rollBack(); file_put_contents($directory.'/opportunity-semantic-verification-qa.json', json_encode($result, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); echo json_encode(['target' => $identity, 'categories' => $counts, 'active_writes' => 0, 'visual_pending' => true]).PHP_EOL;