Files
Investidor-V2/tools/opportunity-semantic-verify-qa.php
nala 01405cbf8a
tests / ci (push) Canceled after 0s
oportunidades 5
2026-10-10 14:15:28 +02:00

53 lines
4.1 KiB
PHP

<?php
use App\Models\Opportunity;
use App\Models\User;
use App\Services\OpportunityCanonicalContract;
use App\Services\PortalProfileAccess;
use Illuminate\Contracts\Console\Kernel;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
require dirname(__DIR__).'/vendor/autoload.php';
require __DIR__.'/portal-qa-environment.php';
$target = portalQaEnvironment();
$app = require dirname(__DIR__).'/bootstrap/app.php';
$app->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;