make(Kernel::class)->bootstrap(); portalQaAssertTarget($target); DB::beginTransaction(); DB::statement('SET TRANSACTION READ ONLY'); $directory = storage_path('app/private/investmoz-v2/portal-audit'); $browser = json_decode(file_get_contents($directory.'/investor-ab-chromium-20261010.json'), true, 512, JSON_THROW_ON_ERROR); $proof = ['captured_at' => gmdate('c'), 'target' => $target, 'read_only' => true, 'active_writes' => 0, 'scenarios' => []]; foreach ($browser['scenarios'] as $name => $entry) { $draft = SimulationFormDraft::findOrFail($entry['draft_id']); abort_unless((int) $draft->owner_user_id === 18, 403); $economic = SimulationFormDraft::decryptSnapshot($draft->economic_snapshot); $personal = SimulationFormDraft::decryptSnapshot($draft->personal_snapshot); $proof['scenarios'][$name] = ['id' => $entry['id'], 'draft_id' => $draft->id, 'version' => $draft->version_no, 'economic_keys' => array_keys($economic), 'personal_keys' => array_keys($personal), 'selection' => array_intersect_key($economic, array_flip(['journey_type', 'detail_level', 'purpose', 'preferred_language', 'currency'])), 'project_title' => $economic['project_title'] ?? null, 'summary_length' => strlen($economic['project_summary'] ?? ''), 'labels' => array_intersect_key($economic['selection_labels'] ?? [], array_flip(['journey_type', 'detail_level', 'purpose', 'preferred_language', 'currency']))]; } DB::rollBack(); $file = $directory.'/visual-persistence-qa.json'; if (is_file($file)) { copy($file, $directory.'/visual-persistence-qa-'.gmdate('Ymd_His').'.json'); } file_put_contents($file, json_encode($proof, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)); echo json_encode($proof, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR).PHP_EOL;