10 lines
4.8 KiB
PHP
10 lines
4.8 KiB
PHP
<?php
|
|
require __DIR__.'/sgf-assets-proof-bootstrap.php';$host->beginTransaction();$native->beginTransaction();try{
|
|
$keys=[];foreach(['asset','plan','charge','disposal']as$k)$keys[$k]=(string)Str::uuid();$a=['operation'=>'establish','code'=>'QA-WRITEOFF-ROLLBACK','description'=>'Activo artificial para abate100 e1100 revertido','origin_reference'=>'QA-WRITEOFF-OPEN-ROLLBACK','cost'=>'1200.00','residual'=>'0.00','available_on'=>'2026-10-01','location'=>'QA-SALA-A','custodian'=>'QA-CUSTODIA-A','evidence'=>'Abate100 acumulado e1100 perda, fixture revertida.'];$admin=function($kind,$input)use($faCommand,$faInput,$keys){$faCommand(15,$faInput($kind,$keys[$kind],0,$input));return$faCommand(16,$faInput($kind,$keys[$kind],1,['decision'=>'approved'],'review'))[0];};$gl=function($kind,$id,$on,$rule)use($call){$p=$call('accounting_prepare','prepare',fn($e)=>$e->command('effect-prepare',['effect_type'=>$kind,'source_id'=>$id,'journal_on'=>$on,'period_key'=>'QA-2026-INTEGRADO','rule_key'=>$rule,'reason'=>'Conferência de activo no recorte QA revertido.'],(string)Str::uuid()));$call('accounting_review','validate',fn($e)=>$e->command('validate',['proposal_id'=>$p['proposal_id'],'revision'=>$p['revision'],'decision'=>'approved','reason'=>'Revisão distinta do activo no recorte QA revertido.'],(string)Str::uuid()));return$call('accounting_prepare','post',fn($e)=>$e->command('post',['proposal_id'=>$p['proposal_id'],'revision'=>$p['revision'],'reason'=>'Aplicação do activo no recorte QA revertido.'],(string)Str::uuid()));};$ar=$admin('asset',$a);$gl('assets.admitted',$ar['id'],'2026-10-01','QA-ASSET-ADMISSION');$admin('plan',['operation'=>'establish','asset_key'=>$keys['asset'],'life_months'=>12,'status'=>'active','evidence'=>'Plano linear artificial de12 meses para abate.']);$cr=$admin('charge',['operation'=>'establish','asset_key'=>$keys['asset'],'plan_key'=>$keys['plan'],'month'=>'2026-10','evidence'=>'Quota100 artificial Outubro para abate.']);$gl('assets.depreciation',$cr['id'],'2026-10-31','QA-ASSET-DEPRECIATION');
|
|
$dr=$admin('disposal',['operation'=>'establish','asset_key'=>$keys['asset'],'effect_on'=>'2026-11-01','evidence'=>'Abate sintético que deve ser bloqueado se as quotas mudarem.']);$prepareWriteoff=fn()=>$call('accounting_prepare','prepare',fn($e)=>$e->command('effect-prepare',['effect_type'=>'assets.writeoff','source_id'=>$dr['id'],'journal_on'=>'2026-11-01','period_key'=>'QA-2026-INTEGRADO','rule_key'=>'QA-ASSET-WRITEOFF','reason'=>'Conferir abate contra todas as quotas actuais.'],(string)Str::uuid()));$wp=$prepareWriteoff();$ok(isset($wp['proposal_id']),'consistent quota permits writeoff conference');
|
|
$plan=['operation'=>'correct_plan','asset_key'=>$keys['asset'],'life_months'=>10,'status'=>'active','evidence'=>'Plano de correcção explicitamente ainda sem nova quota aplicada.'];$faCommand(15,$faInput('plan',$keys['plan'],2,$plan));$reject($prepareWriteoff,409,'pending plan decision blocks writeoff');$faCommand(16,$faInput('plan',$keys['plan'],3,['decision'=>'approved'],'review'));$reject($prepareWriteoff,409,'unresolved changed quota blocks writeoff');
|
|
$plan['life_months']=12;$faCommand(15,$faInput('plan',$keys['plan'],4,$plan));$faCommand(16,$faInput('plan',$keys['plan'],5,['decision'=>'approved'],'review'));
|
|
$dec=(string)Str::uuid();$d=['operation'=>'establish','asset_key'=>$keys['asset'],'plan_key'=>$keys['plan'],'month'=>'2026-12','evidence'=>'Competência Dezembro sem Novembro aplicado.'];$faCommand(15,$faInput('charge',$dec,0,$d));$ar=$faCommand(16,$faInput('charge',$dec,1,['decision'=>'approved'],'review'))[0];$reject(fn()=>$call('accounting_prepare','prepare',fn($e)=>$e->command('effect-prepare',['effect_type'=>'assets.depreciation','source_id'=>$ar['id'],'journal_on'=>'2026-12-31','period_key'=>'QA-2026-INTEGRADO','rule_key'=>'QA-ASSET-DEPRECIATION','reason'=>'Não saltar competências nem presumir o acumulado.'],(string)Str::uuid())),409,'missing preceding quota blocks excessive out of order depreciation');
|
|
$nov=(string)Str::uuid();$d['month']='2026-11';$faCommand(15,$faInput('charge',$nov,0,$d));$nr=$faCommand(16,$faInput('charge',$nov,1,['decision'=>'approved'],'review'))[0];$gl('assets.depreciation',$nr['id'],'2026-11-30','QA-ASSET-DEPRECIATION');$balance=app(App\Modules\Accounting\FixedAssets::class)->balance($f['scope'],$keys['asset'],$native);$ok($balance['accumulated_minor']===20000,'two coherent sequential quotas total200');$plan['life_months']=1;$reject(fn()=>$faCall(15,'preview',$faInput('plan',$keys['plan'],6,$plan)),409,'multiple posted quotas block single quota correction shortcut');
|
|
}finally{$native->rollBack();$host->rollBack();}file_put_contents($work.'/assets-sequence-guards.json',json_encode(['passed'=>true,'checks'=>$checks,'all_fixtures_rolled_back'=>true],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/assets-sequence-guards.json']).PHP_EOL;
|