'establish','code'=>'QA-BOUNDARY-ASSET','description'=>'Equipamento fictício de fronteiras','origin_reference'=>'QA-BOUNDARY-OPENING','cost'=>'100.00','residual'=>'0.00','available_on'=>'2026-10-01','location'=>'QA-SALA-A','custodian'=>'QA-CUSTODIA-A','evidence'=>'Dados sintéticos de fronteiras revertidos.']; $host->beginTransaction();try{ $key=(string)Str::uuid();$in=$faInput('asset',$key,0,$base);$op=(string)Str::uuid();$cut=$faCall(15,'preview',$in,$op)['value'];$ok($host->table('fa_versions')->where('record_key',$key)->count()===0,'preview has no administrative write');$reject(fn()=>$faCall(16,'confirm',['preview'=>$cut['preview']]),403,'preview tied to person');$reject(fn()=>$faCall(15,'confirm',['preview'=>$cut['preview']],null,'other-generation'),409,'preview tied to context generation');$reject(fn()=>$faCall(15,'confirm',['preview'=>'tampered']),409,'tampered preview denied');$out=$faCall(15,'confirm',['preview'=>$cut['preview']])['value'];$again=$faCall(15,'confirm',['preview'=>$cut['preview']])['value'];$ok($again['replayed']&&$again['id']===$out['id']&&$host->table('fa_versions')->where('record_key',$key)->count()===1,'same confirmation one version and receipt');$receipt=$faCall(15,'receipt',[],$op)['value'];$ok($receipt['historical_receipt_only']&&$receipt['result']['id']===$out['id'],'receipt recovers historical decision without execution');$reject(fn()=>$faCall(16,'receipt',[],$op),404,'receipt isolated by actor');$reject(fn()=>$faCall(15,'preview',$in),409,'outdated version denied'); $review=$faInput('asset',$key,1,['decision'=>'approved'],'review');$cut=$faCall(16,'preview',$review)['value'];$host->table('permission_grants')->where($f['scope']+['user_id'=>15,'permission'=>'fixed_assets.prepare'])->delete();$reject(fn()=>$faCall(16,'confirm',['preview'=>$cut['preview']]),403,'preparer rights revalidated at review'); }finally{$host->rollBack();} $host->beginTransaction();try{ $key=(string)Str::uuid();$in=$faInput('asset',$key,0,$base);$cut=$faCall(15,'preview',$in)['value'];$host->unprepared("CREATE FUNCTION public.fa_test_failure() RETURNS trigger LANGUAGE plpgsql AS \$\$ BEGIN RAISE EXCEPTION 'QA_ASSET_RECEIPT_FAILURE'; END \$\$; CREATE TRIGGER fa_test_failure BEFORE INSERT ON fa_commands FOR EACH ROW EXECUTE FUNCTION fa_test_failure()");$failed=false;try{$faCall(15,'confirm',['preview'=>$cut['preview']]);}catch(Illuminate\Database\QueryException$e){$failed=str_contains($e->getMessage(),'QA_ASSET_RECEIPT_FAILURE');}$ok($failed&&$host->table('fa_versions')->where('record_key',$key)->count()===0,'failure between version and receipt rolls back version and audit');$host->statement('DROP TRIGGER fa_test_failure ON fa_commands');$out=$faCall(15,'confirm',['preview'=>$cut['preview']]);$ok($out['status']===200&&$host->table('fa_versions')->where('record_key',$key)->count()===1,'same confirmation recovers after injected failure'); [$ar]=$faCommand(16,$faInput('asset',$key,1,['decision'=>'approved'],'review'));$planKey=(string)Str::uuid();$plan=['operation'=>'establish','asset_key'=>$key,'life_months'=>null,'status'=>'active','evidence'=>'Vida desconhecida explicitamente na regressão.'];$faCommand(15,$faInput('plan',$planKey,0,$plan));$faCommand(16,$faInput('plan',$planKey,1,['decision'=>'approved'],'review'));$chargeKey=(string)Str::uuid();$charge=['operation'=>'establish','asset_key'=>$key,'plan_key'=>$planKey,'month'=>'2026-10','evidence'=>'Quota indeterminada não pode ser aprovada.'];[$cp]=$faCommand(15,$faInput('charge',$chargeKey,0,$charge));$ok($cp['impact']['after']['proposal']['calculation']['quota_cents']===null,'unknown life remains unknown not zero');$reject(fn()=>$faCall(16,'preview',$faInput('charge',$chargeKey,1,['decision'=>'approved'],'review')),409,'unknown quota approval denied'); $life=$plan;$life['operation']='amend';$life['life_months']=12;$faCommand(15,$faInput('plan',$planKey,2,$life));$faCommand(16,$faInput('plan',$planKey,3,['decision'=>'approved'],'review'));$reject(fn()=>$faCall(16,'preview',$faInput('charge',$chargeKey,1,['decision'=>'approved'],'review')),409,'changed dependency demands new preparation'); $suspended=$life;$suspended['status']='suspended';$faCommand(15,$faInput('plan',$planKey,4,$suspended));$faCommand(16,$faInput('plan',$planKey,5,['decision'=>'approved'],'review'));$reject(fn()=>$faCall(15,'preview',$faInput('charge',(string)Str::uuid(),0,$charge)),409,'suspended plan denies quota');$faCommand(15,$faInput('plan',$planKey,6,$life));$faCommand(16,$faInput('plan',$planKey,7,['decision'=>'approved'],'review'));$ok(true,'resume plan separately reviewed'); $amend=$base;$amend['operation']='amend';$amend['location']='QA-SALA-B';$amend['custodian']='QA-CUSTODIA-B';$faCommand(15,$faInput('asset',$key,2,$amend));$x=$faCommand(16,$faInput('asset',$key,3,['decision'=>'approved'],'review'))[0];$ok($x['impact']['after']['proposal']['input']['location']==='QA-SALA-B'&&$x['impact']['journals']===0,'custody change reviewed without stock or GL effect'); for($n=0;$n<27;$n++){$v=$base;$v['code']='QA-PAGE-'.$n;$v['origin_reference']='QA-PAGE-OPEN-'.$n;$faCommand(15,$faInput('asset',(string)Str::uuid(),0,$v));} $one=$faCall(17,'index',['kind'=>'asset','search'=>'QA-PAGE-','per_page'=>25,'page'=>1])['value']['records'];$two=$faCall(17,'index',['kind'=>'asset','search'=>'QA-PAGE-','per_page'=>25,'page'=>2])['value']['records'];$all=$faCall(17,'index',['kind'=>'asset','search'=>'QA-PAGE-','per_page'=>100])['value']['records'];$ok(count($one['data'])===25&&count($two['data'])===2&&$all['total']===27,'SQL pagination25 and100 filters same27 fixtures');$ok(!array_intersect(array_column($one['data'],'id'),array_column($two['data'],'id')),'no overlap between pages');$literal=$faCall(17,'index',['kind'=>'asset','search'=>'%','per_page'=>25])['value']['records'];$ok($literal['total']===0,'wildcard search treated literally'); $foreign=$base;$foreign['code']='QA-FOREIGN-ASSET';$foreign['origin_reference']='QA-FOREIGN-OPEN';$foreignKey=(string)Str::uuid();$faCommand(15,$faInput('asset',$foreignKey,0,$foreign));$row=$host->table('fa_versions')->where('record_key',$foreignKey)->first();$host->unprepared('ALTER TABLE fa_versions DISABLE TRIGGER fa_versions_immutable');$host->table('fa_versions')->where('id',$row->id)->update(['unit_id'=>1]);$host->unprepared('ALTER TABLE fa_versions ENABLE TRIGGER fa_versions_immutable');$reject(fn()=>$faCall(17,'index',['kind'=>'asset','record_key'=>$foreignKey]),403,'foreign unit record denied even known UUID'); }finally{$host->rollBack();} $native->beginTransaction();try{$before=$native->table('gl_journals')->count();$native->table('gl_periods')->insert($f['scope']+['period_key'=>'QA-2026-INTEGRADO','version'=>2,'starts_on'=>'2026-01-01','ends_on'=>'2026-12-31','status'=>'closed','created_by'=>15,'reason'=>'Fecho artificial revertido para guarda de período.','created_at'=>now()->utc()]);$p=json_decode(file_get_contents($s['root'].'/assets-regression-progress-private.json'),true);$reject(fn()=>$call('accounting_prepare','prepare',fn($e)=>$e->command('effect-prepare',['effect_type'=>'assets.admitted','source_id'=>$p['steps']['asset_review']['id'],'journal_on'=>'2026-10-01','period_key'=>'QA-2026-INTEGRADO','rule_key'=>'QA-ASSET-ADMISSION','reason'=>'Período fechado deve recusar sem efeitos.'],(string)Str::uuid())),409,'closed period refuses current source');$ok($native->table('gl_journals')->count()===$before,'closed period refusal creates no journal');}finally{$native->rollBack();} file_put_contents($work.'/assets-boundaries.json',json_encode(['passed'=>true,'checks'=>$checks,'fixtures_rolled_back'=>true,'cache_cleared'=>false,'new_demo'=>false],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/assets-boundaries.json']).PHP_EOL;