Files
SGF/scripts/sgf-cash-proof-bootstrap.php
2026-11-11 09:00:17 +02:00

10 lines
3.0 KiB
PHP

<?php
use Illuminate\Support\Facades\Auth;use Illuminate\Support\Str;use App\Shared\Context\CompanyContext;use App\Modules\Finance\CashWorkspace;
require __DIR__.'/sgf-ledger-proof-bootstrap.php';config(['cash_qa.enabled'=>true,'cash_qa.binding_sha256'=>hash_file('sha256',$s['root'].'/cash-binding.json'),'sales_ledger.synthetic_enabled'=>true]);$cashBinding=json_decode(file_get_contents($s['root'].'/cash-binding.json'),true);
set_exception_handler(function($e){echo json_encode(['passed'=>false,'exception'=>get_class($e),'message'=>$e->getMessage(),'errors'=>$e instanceof Illuminate\Validation\ValidationException?$e->errors():null,'frames'=>array_map(fn($x)=>[basename($x['file']??''),$x['line']??0,$x['function']??''],array_slice($e->getTrace(),0,10))]).PHP_EOL;exit(1);});
$selectCash=function($role)use($profiles,$app){Auth::forgetGuards();Auth::shouldUse('web');$u=App\Models\User::findOrFail($profiles[$role]['user_id']);Auth::guard('web')->setUser($u);$r=Illuminate\Http\Request::create('/api/cash','POST');$r->attributes->set('sgf_module','finance');$r->setUserResolver(fn()=>$u);$session=app('session')->driver();$session->start();$session->put('company_context',['tenant_id'=>1,'company_id'=>2,'unit_id'=>2,'module_id'=>'finance','token'=>'cash-'.$role]);$r->setLaravelSession($session);$app->instance('request',$r);app(CompanyContext::class)->selectFor($u->id,1,2,2);return $u->id;};
$cashPreview=function($role,$action,$kind,$data=[],$proposal=null)use($selectCash){$actor=$selectCash($role);$w=app(CashWorkspace::class);$state=$w->listing($actor,[]);return $w->preview($actor,['action'=>$action,'kind'=>$kind,'data'=>$data,'proposal_id'=>$proposal,'version'=>$state['basis']['revision'],'reason'=>'Conferência QA individual de Caixa, origem e saldo.'],(string)Str::uuid());};
$cashCommand=function($role,$action,$kind,$data=[],$proposal=null)use($cashPreview,$selectCash){$cut=$cashPreview($role,$action,$kind,$data,$proposal);return [app(CashWorkspace::class)->confirm($selectCash($role),$cut['preview']),$cut];};
$reject=function(Closure $fn,int $status,string $label)use($ok){$bad=false;try{$fn();}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $e){$bad=$e->getStatusCode()===$status;}catch(Illuminate\Validation\ValidationException){$bad=$status===422;}$ok($bad,$label);};
$postCashOrigin=function($kind,$id)use($call){$p=$call('accounting_prepare','prepare',fn($e)=>$e->command('effect-prepare',['effect_type'=>$kind,'source_id'=>$id,'journal_on'=>'2026-11-10','period_key'=>'QA-2026-INTEGRADO','rule_key'=>$kind,'reason'=>'Origem QA explícita de Caixa ou liquidez original.'],(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 contabilística distinta da origem de Caixa.'],(string)Str::uuid()));return $call('accounting_prepare','post',fn($e)=>$e->command('post',['proposal_id'=>$p['proposal_id'],'revision'=>$p['revision'],'reason'=>'Aplicação única da origem de Caixa conferida.'],(string)Str::uuid()));};