11 lines
4.0 KiB
PHP
11 lines
4.0 KiB
PHP
<?php
|
|
use Illuminate\Support\Facades\{DB,Crypt};use App\Shared\Context\CompanyContext;
|
|
require __DIR__.'/sgf-fiscal-rules-proof-bootstrap.php';$before=$host->table('fr_events')->count();$host->beginTransaction();try{
|
|
$metadata=$def(0);$metadata['family']='irpc';$metadata['source_status']='pending';$metadata['source_sha256']=null;$metadata['operation']='metadata_only';$metadata['parameters']=[];$metadata['expression']=[];$metadata['label']='Literal%_! reference';[$p]=$ruleCommand(13,$ruleInput('prepare',0,$metadata,null,'QA-PAGING-000'));$row=(array)$host->table('fr_events')->find($p['id']);unset($row['id']);for($i=1;$i<=126;$i++){$row['rule_key']='QA-PAGING-'.str_pad((string)$i,3,'0',STR_PAD_LEFT);$host->table('fr_events')->insert($row);}
|
|
$selectRule(17);$first=$rules->listing(17,['search'=>'QA-PAGING-','per_page'=>25]);$all=[];for($i=1;$i<=$first['records']['last_page'];$i++)$all=array_merge($all,$rules->listing(17,['search'=>'QA-PAGING-','per_page'=>25,'page'=>$i])['records']['data']);$ok(count($all)===127&&count(array_unique(array_column($all,'id')))===127,'127 metadata rows paginated25 without duplication');$a=$rules->listing(17,['search'=>'QA-PAGING-','per_page'=>100]);$a2=$rules->listing(17,['search'=>'QA-PAGING-','per_page'=>100,'page'=>2]);$ok(count($a['records']['data'])===100&&count($a2['records']['data'])===27,'pages100 and27 same metadata universe');$literal=$rules->listing(17,['search'=>'%_!']);$ok($literal['records']['total']===127,'literal percent underscore exclamation search');$ok($rules->listing(17,['family'=>'irpc','state'=>'prepared'])['records']['total']===127,'family and state SQL filters');$ok($rules->listing(17,['view'=>'history','rule_key'=>'QA-PAGING-000'])['records']['total']===1,'per-key history isolated');
|
|
$p2=$rulePreview(13,$ruleInput('prepare',0,$def(1),null,'QA-GUARDS'));$selectRule(13,'other-generation');$reject(fn()=>$rules->confirm(13,$p2['preview']),409,'changed generation rejected');$selectRule(13);$cut=json_decode(Crypt::decryptString($p2['preview']),true);$cut['observed']=time()-601;$reject(fn()=>$rules->confirm(13,Crypt::encryptString(json_encode($cut))),409,'expired rule preview rejected');
|
|
[$prep]=$ruleCommand(13,$ruleInput('prepare',0,$def(1),null,'QA-AUTHOR'));$review=$rulePreview(14,$ruleInput('review',1,['decision'=>'reviewed'],$prep['id'],'QA-AUTHOR'));$host->beginTransaction();try{$host->table('permission_grants')->where(['user_id'=>13,'permission'=>'fiscal_rules.prepare','unit_id'=>2])->delete();$selectRule(14);$reject(fn()=>$rules->confirm(14,$review['preview']),403,'preparer authority revalidated');}finally{$host->rollBack();}
|
|
$selectRule(13);request()->attributes->set('sgf_module','finance');$reject(fn()=>$rules->listing(13,[]),403,'wrong module rejected');$selectRule(13);$reject(function()use($rules){app(CompanyContext::class)->selectFor(13,1,2,1);return $rules->listing(13,[]);},403,'other unit rejected');$selectRule(13);
|
|
$attempt=function($fn)use($host){$host->beginTransaction();try{$fn();return false;}catch(Illuminate\Database\QueryException){return true;}finally{$host->rollBack();}};$ok($attempt(fn()=>$host->table('fr_events')->where('id',$p['id'])->update(['reason'=>'Attempted change of immutable source metadata'])),'SQL append-only history');$bad=$row;$bad['rule_key']='QA-SQL-DENIED';$bad['prepared_by']=17;$bad['actor_id']=17;$ok($attempt(fn()=>$host->table('fr_events')->insert($bad)),'SQL unprivileged actor refused');$bad=$row;$bad['rule_key']='QA-SQL-REVISION';$bad['revision']=3;$ok($attempt(fn()=>$host->table('fr_events')->insert($bad)),'SQL revision gap refused');
|
|
}finally{$host->rollBack();}$ok($host->table('fr_events')->count()===$before,'metadata/authority fixtures fully rolled back');file_put_contents($work.'/fiscal-rules-boundaries.json',json_encode(['passed'=>true,'checks'=>$checks,'metadata_fixtures'=>127,'rolled_back'=>true,'no_business_tax_claim'=>true],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/fiscal-rules-boundaries.json']).PHP_EOL;
|