14 lines
4.8 KiB
PHP
14 lines
4.8 KiB
PHP
<?php
|
|
use Illuminate\Support\Facades\DB;
|
|
use Tempo\Finance\Payables\{HistoricalCapture,HistoricalPayments,Payables};
|
|
use App\Modules\Purchasing\{SupplierPayables,SupplierHistoryReceipts};
|
|
$scope=$f['scope'];$service=app(SupplierPayables::class);$provider=app(SupplierHistoryReceipts::class);$source=$service->document($u,$f['source_id']);$payments=$provider->payments($u,$f['source_id']);$capture=HistoricalCapture::fromPayments($scope,$source,$payments);$raw=HistoricalPayments::capture($source,$payments);$checks=0;$cases=[];$ok=function($v,$m)use(&$checks){$checks++;if(!$v)throw new LogicException($m);};$refuse=function($fn)use($ok){$caught=false;try{$fn();}catch(DomainException|Symfony\Component\HttpKernel\Exception\HttpException $e){$caught=true;}$ok($caught,'Expected capture/scope/permission refusal');};
|
|
$case=function($name,$fn)use(&$checks,&$cases){$at=$checks;DB::beginTransaction();DB::statement('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ');try{$fn();$cases[]=['name'=>$name,'checks'=>$checks-$at,'passed'=>true];}finally{while(DB::transactionLevel())DB::rollBack();}};
|
|
$case('capture-bound-to-entire-source-and-context',function()use($scope,$source,$capture,$raw,$ok,$refuse){$ok($capture->forSource($scope,$source)===$raw,'Same validated capture');$decorated=$source+['revision'=>Payables::revision($source),'missing'=>Payables::missing($source)];$ok($capture->forSource($scope,$decorated)===$raw,'Only exact calculated presentation fields accepted');foreach(['tenant_id','company_id','unit_id'] as $key){$other=$scope;$other[$key]++;$refuse(fn()=>$capture->forSource($other,$source));}foreach(['local_id','payment_count','total_minor','number'] as $key){$other=$source;$other[$key]=is_int($other[$key])?$other[$key]+1:$other[$key].'-changed';$refuse(fn()=>$capture->forSource($scope,$other));}$decorated['revision']='bad';$refuse(fn()=>$capture->forSource($scope,$decorated));$v=$capture->forSource($scope,$source);$v['confirmed_minor']=0;$ok($capture->forSource($scope,$source)===$raw,'Changing returned array never mutates validated value');});
|
|
$case('genuine-source-metadata-never-ignored',function()use($scope,$source,$payments,$refuse){$original=$source+['revision'=>'ORIGINAL-EXTERNAL-METADATA','missing'=>['original documentary note']];$value=HistoricalCapture::fromPayments($scope,$original,$payments);$changed=$original;$changed['revision']='CHANGED-EXTERNAL-METADATA';$refuse(fn()=>$value->forSource($scope,$changed));$changed=$original;$changed['missing']=[];$refuse(fn()=>$value->forSource($scope,$changed));});
|
|
$case('read-only-capability-never-feeds-commands',function()use($scope,$source,$capture,$raw,$u,$refuse,$ok){$engine=new Payables(DB::connection(),$u->id,'qa-profile',$scope,static fn()=>null,fn()=>$source,fn()=>$capture,static fn()=>null);$method=new ReflectionMethod($engine,'history');$refuse(fn()=>$method->invoke($engine,$source,false));$ok($method->invoke($engine,$source,true)===$raw,'Bound capture accepted only for batched read path');});
|
|
$case('raw-and-captured-report-results-identical',function()use($service,$provider,$u,$source,$f,$ok,$s){require $s['root'].'/baseline.php';$baseline=app(App\Modules\Purchasing\ProfileBaselineSupplierPayables::class);$old=$baseline->report($u,['source'=>$f['source_id']]);$new=$service->report($u,['source'=>$f['source_id']]);foreach(['totals','known_positions','positions_sha256','windows'] as $key)$ok($old[$key]===$new[$key],'Report equality: '.$key);$a=$provider->page($u,[$source['local_id']=>$source]);$b=$provider->page($u,[$source['local_id']=>$source],true);$ok(is_array($a[$source['local_id']])&&$b[$source['local_id']] instanceof HistoricalCapture,'Old array contract preserved; new capability explicit');});
|
|
$case('bad-receipt-never-becomes-known-zero',function()use($scope,$service,$u,$f,$ok){$row=(array)DB::table('pa_source_histories')->where($scope)->where('local_source_id',$f['source_id'])->orderByDesc('version')->first();unset($row['id']);$row['version']++;$row['receipt_hash']=str_repeat('0',64);DB::table('pa_source_histories')->insert($row);$r=$service->report($u,['source'=>$f['source_id']]);$ok($r['totals']['unknown_balance_count']===1&&$r['totals']['balance_minor']===null&&$r['known_positions']['count']===0,'Invalid checksum remains indeterminate');});
|
|
$case('revoked-permission-and-foreign-source-denied',function()use($service,$scope,$f,$u,$refuse){DB::table('permission_grants')->where($scope)->where('user_id',$u->id)->where('permission','supplier_payables.view')->delete();$refuse(fn()=>$service->report($u,['source'=>$f['source_id']]));});
|
|
file_put_contents($out,json_encode(['passed'=>true,'checks'=>$checks,'cases'=>$cases,'rollback_only'=>true,'commands_use_live_history'=>true,'raw_array_contract_preserved'=>true,'source_binding_includes_genuine_metadata'=>true],JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));echo 'Historical capture regression: '.count($cases)." cases/$checks checks.\n";
|