Files
SGF/scripts/budget-demo-seed.php
T
2026-10-29 18:43:29 +02:00

53 lines
4.5 KiB
PHP

<?php
require __DIR__.'/../vendor/autoload.php';
$app = require __DIR__.'/../bootstrap/app.php';
$app->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";