make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap(); \App\Modules\Purchasing\BudgetAdapter::guard(); use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; if (Schema::hasTable('users')) throw new RuntimeException('Fresh isolated database required; nothing reset.'); require __DIR__.'/../packages/budget-control/tests/sgf-schema.php'; require __DIR__.'/../packages/budget-control/tests/host-support.php'; Schema::create('cb_ui_commands', function (Blueprint $t) { $t->id(); foreach (['tenant_id','company_id','unit_id','actor_id'] as $c) $t->unsignedBigInteger($c); $t->uuid('command_key'); $t->string('action'); $t->string('request_hash',64); $t->jsonb('result'); $t->timestamp('created_at'); $t->unique(['tenant_id','company_id','unit_id','actor_id','command_key']); }); Schema::create('cb_consumption_sources', function (Blueprint $t) { $t->id(); foreach (['tenant_id','company_id','unit_id','origin_id','created_by'] as $c) $t->unsignedBigInteger($c); $t->string('reference',100); $t->bigInteger('total_minor'); $t->bigInteger('subtotal_minor'); $t->timestamp('created_at'); $t->unique(['tenant_id','company_id','unit_id','reference']); $t->foreign('origin_id')->references('id')->on('cb_origins')->restrictOnDelete(); }); $f = DB::transaction(function () { $f = budgetQaFixture('sgf'); DB::table('tenants')->where('id',$f['tenant'])->update(['name'=>'Cliente sintético — orçamento']); DB::table('companies')->where('id',$f['company'])->update(['name'=>'Empresa Horizonte — Orçamento sintético']); DB::table('units')->where('id',$f['unit'])->update(['name'=>'Unidade Central — Orçamento sintético']); DB::table('cb_centres')->where('id',$f['centre'])->update(['code'=>'ORC-DEMO']); DB::table('cb_origins')->where('id',$f['origin'])->update(['reference'=>'SIM-COMPRA-001']); $f['release_origin'] = DB::table('cb_origins')->insertGetId($f['scope']+['cost_center_id'=>$f['centre'],'required_kind'=>'operating','reference'=>'SIM-COMPRA-LIBERTAR']); $f['second_centre'] = DB::table('cb_centres')->insertGetId($f['scope']+['code'=>'ORC-OUTRO']); DB::table('permission_grants')->where('user_id',$f['actor'])->whereIn('permission',['purchasing_budget.record','purchasing_budget.consume'])->delete(); $accounts=[]; foreach (['preparacao'=>['Preparação orçamental','preparacao-orcamento@example.test',$f['actor']], 'validacao'=>['Validação orçamental','validacao-orcamento@example.test',$f['validator']], 'operacao'=>['Operação orçamental','operacao-orcamento@example.test',null], 'consulta'=>['Consulta orçamental','consulta-orcamento@example.test',null]] as $role=>[$name,$email,$id]) { $password=bin2hex(random_bytes(20)); $user=$id?\App\Models\User::findOrFail($id):new \App\Models\User; $user->fill(['name'=>$name,'email'=>$email,'password'=>$password]); $user->save(); if (!$id) { DB::table('company_memberships')->insert(['user_id'=>$user->id,'tenant_id'=>$f['tenant'],'company_id'=>$f['company']]); foreach (['company.view'=>null,'unit.view'=>$f['unit']] as $p=>$unit) DB::table('permission_grants')->insert(['user_id'=>$user->id,'tenant_id'=>$f['tenant'],'company_id'=>$f['company'],'unit_id'=>$unit,'permission'=>$p,'created_at'=>now(),'updated_at'=>now()]); foreach ($role==='operacao'?['view','record','consume']:['view'] as $p) DB::table('permission_grants')->insert($f['scope']+['user_id'=>$user->id,'permission'=>'purchasing_budget.'.$p,'created_at'=>now(),'updated_at'=>now()]); } $accounts[$role]=['id'=>$user->id,'email'=>$email,'password'=>$password]; } // Another company is deliberately present without membership; the reserved unit has no grant. return $f+['accounts'=>$accounts]; }); $file=getenv('BUDGET_DEMO_ACCESS_FILE') ?: 'C:/laragon/data/sgf-tempo/secrets/budget-demo-access.json'; if (!in_array($file,['C:/laragon/data/sgf-tempo/secrets/budget-demo-access.json','C:/laragon/data/sgf-tempo/secrets/budget-proof-access.json'],true)) throw new RuntimeException('Unexpected access manifest target.'); if (file_put_contents($file,json_encode($f,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR),LOCK_EX)===false)throw new RuntimeException('Cannot save protected synthetic access manifest.'); echo "Budget demonstration prepared with four distinct synthetic functions; no budget decisions or movements prefilled.\n";