13 lines
4.5 KiB
PHP
13 lines
4.5 KiB
PHP
<?php
|
|
require __DIR__.'/sgf-assets-proof-bootstrap.php';$host->beginTransaction();$native->beginTransaction();try{
|
|
$key=(string)Str::uuid();$a=['operation'=>'establish','code'=>'QA-WRAPPER-'.strtoupper(substr($key,0,8)),'description'=>'Equipamento de ensaio HTTP revertido','origin_reference'=>'QA-WRAPPER-OPEN-'.strtoupper(substr($key,0,8)),'cost'=>'1200.00','residual'=>'0.00','available_on'=>'2026-10-01','location'=>'QA-SALA-A','custodian'=>'QA-CUSTODIA-A','evidence'=>'Fixture do controlador de conferência contabilística.'];$faCommand(15,$faInput('asset',$key,0,$a));$ar=$faCommand(16,$faInput('asset',$key,1,['decision'=>'approved'],'review'))[0];
|
|
$jc=app(App\Modules\Accounting\FixedAssetJournalController::class);$select=function($actor)use($faCall){$faCall($actor,'index',['kind'=>'asset']);app(App\Shared\Context\CompanyContext::class)->selectFor($actor,1,2,2);};$invoke=function($actor,$method,$input,$key=null)use($select,$jc){$select($actor);request()->replace($input);request()->headers->set('Idempotency-Key',$key??(string)Str::uuid());$out=$jc->$method(request());return['status'=>$out->getStatusCode(),'value'=>$out->getData(true)];};
|
|
$d=['action'=>'effect-prepare','data'=>['effect_type'=>'assets.admitted','source_id'=>$ar['id'],'journal_on'=>'2026-10-01','period_key'=>'QA-2026-INTEGRADO','rule_key'=>'QA-ASSET-ADMISSION','reason'=>'Prévia individual do escritor contabilístico original.']];$count=$native->table('gl_proposals')->count();$key=(string)Str::uuid();$cut=$invoke(15,'preview',$d,$key)['value'];$ok($native->table('gl_proposals')->count()===$count&&count($cut['impact']['snapshots'][0]['lines'])===2,'ledger preview rollback and two typed lines');$out=$invoke(15,'confirm',['preview'=>$cut['preview']])['value'];$again=$invoke(15,'confirm',['preview'=>$cut['preview']])['value'];$ok($again['replayed']&&$again['proposal_id']===$out['proposal_id'],'ledger confirmation receipt no duplicate');$reject(fn()=>$invoke(17,'preview',$d),403,'ledger reader cannot prepare');
|
|
$rv=['action'=>'validate','data'=>['proposal_id'=>$out['proposal_id'],'revision'=>$out['revision'],'decision'=>'approved','reason'=>'Revisão independente da captura do activo.']];$cut=$invoke(16,'preview',$rv)['value'];$ok($native->table('gl_reviews')->where('proposal_id',$out['proposal_id'])->count()===0,'review preview also rolls back');$invoke(16,'confirm',['preview'=>$cut['preview']]);$post=['action'=>'post','data'=>['proposal_id'=>$out['proposal_id'],'revision'=>$out['revision'],'reason'=>'Aplicar captura de activo após conferência independente.']];$cut=$invoke(15,'preview',$post)['value'];$ok($cut['impact']['journal_count']===1&&$native->table('gl_journals')->where('proposal_id',$out['proposal_id'])->count()===0,'post preview shows impact without journal');$j=$invoke(15,'confirm',['preview'=>$cut['preview']])['value'];$ok($native->table('gl_journals')->where('id',$j['journal_id'])->value('debit_minor')===120000,'wrapper posts through original journal');
|
|
$bad=$a;$bad['operation']='amend';$bad['cost']='1300.00';$reject(fn()=>$faCall(15,'preview',$faInput('asset',$aKey=$ar['record_key'],2,$bad)),409,'posted cost cannot silently change');$legacy=$native->table('gl_proposals')->whereRaw("snapshot->'source'->>'effect_type' NOT LIKE 'assets.%'")->value('id');if($legacy)$reject(fn()=>$invoke(16,'preview',['action'=>'validate','data'=>['proposal_id'=>$legacy,'revision'=>str_repeat('a',64),'decision'=>'approved','reason'=>'Tentativa de acesso a outra família pelo adaptador.']]),403,'asset wrapper denies legacy proposal');
|
|
$badType=$d;$badType['data']['effect_type']='sales.invoice';$reject(fn()=>$invoke(15,'preview',$badType),422,'asset wrapper cannot prepare another family');
|
|
}finally{$native->rollBack();$host->rollBack();}
|
|
// New function retains every previous branch and validates pre-existing balanced journals read-only.
|
|
$ids=$native->table('gl_journals')->whereRaw("snapshot->'source'->>'effect_type' NOT LIKE 'assets.%'")->orderBy('id')->pluck('id');foreach($ids as$id)$native->select('SELECT gl_assert_balanced(?)',[$id]);$ok(true,$ids->count()?'existing journal balance constraints remain satisfied':'regression has no legacy journals; verify27 on8085 read-only separately');
|
|
file_put_contents($work.'/assets-journal-boundaries.json',json_encode(['passed'=>true,'checks'=>$checks,'legacy_balanced_journals'=>$ids->count(),'fixtures_rolled_back'=>true,'same_writer'=>true],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/assets-journal-boundaries.json']).PHP_EOL;
|