74 lines
6.7 KiB
PHP
74 lines
6.7 KiB
PHP
<?php
|
|
|
|
namespace Tests\Support;
|
|
|
|
use App\Models\Sector;
|
|
use App\Models\User;
|
|
use App\Services\InvestmentGeography;
|
|
use App\Services\OpportunityManagement;
|
|
use App\Services\PortalProfileAdministration;
|
|
use Illuminate\Support\Facades\Crypt;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
|
|
/** Synthetic fixture only, exclusively in the isolated QA database. */
|
|
final class ProactiveInvestmentFixture
|
|
{
|
|
public static function guard(): void
|
|
{
|
|
$t = DB::selectOne('select current_database() as name,inet_server_port() as port');
|
|
throw_unless($t->name === 'proactive_investment_20261027_test' && (int) $t->port === 55441, \RuntimeException::class, 'Isolated proactive QA required');
|
|
}
|
|
|
|
public static function operator(): User
|
|
{
|
|
self::guard();
|
|
$actor = User::factory()->create(['name' => 'SYNTHETIC QA editorial operator', 'email' => 'proactive-'.Str::uuid().'@example.invalid', 'password' => bcrypt('Synthetic-QA-only-2026!')]);
|
|
$actor->forceFill(['two_factor_secret' => Crypt::encrypt('JBSWY3DPEHPK3PXP'), 'two_factor_confirmed_at' => now()])->save();
|
|
$org = (string) Str::uuid();
|
|
DB::table('organizations')->insert(['id' => $org, 'name' => 'SYNTHETIC QA proactivity operator', 'external_id' => 'SYNTHETIC-QA-'.$org, 'organization_type' => 'private']);
|
|
DB::table('audit_events')->insert(['source_system' => 'portal-profiles-v1', 'entity_type' => 'authorization', 'action' => 'operator_organization_registered', 'data_classification' => 'restricted', 'after_data' => json_encode(['organization_id' => $org, 'organization' => ['name' => 'SYNTHETIC QA proactivity operator', 'nuit' => 'SYNTHETIC-QA-'.$org], 'source_reference' => 'SYNTHETIC QA designation, not a real appointment'])]);
|
|
app(PortalProfileAdministration::class)->insertGrant((string) Str::uuid(), User::factory()->create(), ['user_id' => $actor->id, 'role' => 'promoter', 'organization_id' => $org, 'opportunity_types' => OpportunityManagement::CATEGORIES, 'responsibilities' => [], 'source' => 'internal-portal-designation']);
|
|
|
|
return $actor;
|
|
}
|
|
|
|
public static function analysis(string $pilot = 'Cahora Bassa'): array
|
|
{
|
|
$id = (string) Str::uuid();
|
|
$private = (string) Str::uuid();
|
|
|
|
return ['version' => 1, 'kind' => 'ideas', 'evidence' => [
|
|
['id' => $id, 'category' => 'infrastructure', 'purpose' => 'local', 'statement' => 'SYNTHETIC QA: capacidade fictícia em '.$pilot.'; não é diagnóstico económico real.', 'interpretation' => 'Hipótese sintética, sem contrato ou oferta comprovados.', 'source' => 'SYNTHETIC QA exemplar público fictício '.$pilot, 'locator' => 'Fixture QA, linha1', 'period' => 'Exercício2026 — cenário sintético', 'scope' => $pilot.' — contexto piloto', 'coverage' => 'Cobertura fictícia; informação real por confirmar', 'verified_on' => '2026-10-27', 'access' => 'public', 'document_id' => null],
|
|
['id' => $private, 'category' => 'supply', 'purpose' => 'local', 'statement' => 'PRIVATE-QA-UNIQUE-SUPPLY-'.Str::uuid(), 'interpretation' => 'PRIVATE-QA-INTERPRETATION-'.Str::uuid(), 'source' => 'PRIVATE-QA-COMPANY-LIST-'.Str::uuid(), 'locator' => 'PRIVATE-QA-LOCATOR-'.Str::uuid(), 'period' => '2026', 'scope' => 'Análise interna', 'coverage' => 'Não divulgar', 'verified_on' => '2026-10-27', 'access' => 'internal', 'document_id' => null],
|
|
], 'need' => ['state' => 'hypothesis', 'problem' => 'SYNTHETIC QA lacuna por verificar em '.$pilot, 'observed_supply' => 'Oferta real desconhecida; não equivale a ausência.', 'observed_demand' => 'Procura real não comprovada; cenário sintético.', 'type' => 'support', 'clients' => 'Beneficiários hipotéticos, sem encomenda ou compromisso.', 'evidence_ids' => [$id], 'limitations' => 'Não demonstra mercado nem viabilidade.', 'missing' => 'Dados locais reais por confirmar.', 'confirmation' => 'Fundamento de hipótese sintética, não confirmação económica.'],
|
|
'idea' => ['solution' => 'SYNTHETIC QA: '.match ($pilot) {
|
|
'Montepuez' => 'fornecimentos e manutenção mineira','Gurué' => 'serviços da cadeia do chá',default => 'serviços complementares de energia'
|
|
}, 'activity' => 'Actividade hipotética de apoio', 'chain_id' => null, 'stage' => 'Serviços de apoio — por corresponder', 'coverage' => $pilot, 'mode' => 'create', 'resources' => 'Não demonstrados; por inventariar', 'assumptions' => 'Não há acesso garantido a energia, terra ou cliente.', 'conditions' => 'Confirmar dados e autorizações aplicáveis.', 'pending' => 'Evidência económica real', 'next_action' => 'Recolher dados locais e testar a hipótese.'], 'relations' => []];
|
|
}
|
|
|
|
public static function input(string $pilot = 'Cahora Bassa', bool $analysis = true): array
|
|
{
|
|
self::guard();
|
|
$t = DB::table('geo_locations')->whereNull('deleted_at')->where('data_classification', 'public')->where('location_type', 'district')->where('name', 'ilike', $pilot === 'Gurué' ? 'Guru%' : ($pilot === 'Cahora Bassa' ? 'CAHORA-BASSA' : $pilot))->first();
|
|
throw_unless($t, \RuntimeException::class, 'Existing pilot territory required:'.$pilot);
|
|
$path = app(InvestmentGeography::class)->path($t->id, true);
|
|
$geo = [];
|
|
foreach ($path as $n) {
|
|
if (in_array($n->location_type, ['province', 'district', 'admin_post', 'locality'])) {
|
|
$geo[$n->location_type.'_id'] = $n->id;
|
|
}
|
|
}
|
|
$s = Sector::choices()->whereNotNull('published_at')->where('slug', match ($pilot) {
|
|
'Cahora Bassa' => 'energia-especifica','Montepuez' => 'mineracao',default => 'agronegocio'
|
|
})->firstOrFail();
|
|
|
|
return ['creation_key' => (string) Str::uuid(), 'reason' => 'SYNTHETIC QA creating an independent territorial analysis, no active publication', 'title' => 'SYNTHETIC QA — '.$pilot, 'summary' => 'Piloto técnico sintético; conclusões económicas reais por confirmar.', 'description' => 'Preparação editorial sintética em QA.', 'sector_id' => $s->id, 'opportunity_category' => 'investment_project', ...$geo, ...($analysis ? ['proactive' => self::analysis($pilot)] : [])];
|
|
}
|
|
|
|
public static function publication(array $analysis): array
|
|
{
|
|
return ['proactive_reviewed' => true, 'proactive_public' => ['group' => $analysis['kind'], 'state' => 'hypothesis', 'need' => 'SYNTHETIC QA necessidade por verificar.', 'proposal' => 'SYNTHETIC QA solução em preparação.', 'basis' => 'Fixture pública sintética; não é evidência de procura local.', 'limitations' => 'Sem validação económica, contrato, terra ou energia garantidos.', 'next_action' => 'Confirmar evidências reais antes de decidir.', 'evidence_ids' => [$analysis['evidence'][0]['id']], 'chain_id' => null, 'stage' => 'Apoio — correspondência real por confirmar']];
|
|
}
|
|
}
|