setUser($user); $request=Illuminate\Http\Request::create('/api/general-ledger/stock/'.$action,'POST',$body,[],[],['HTTP_IDEMPOTENCY_KEY'=>$key]);$session=app('session')->driver();$session->start();$session->put('company_context',$f['scope']+['module_id'=>'accounting','token'=>'stock-controller-'.$role]);$request->setLaravelSession($session);$request->setUserResolver(fn()=>$user);$app->instance('request',$request);app(CompanyContext::class)->selectFor($user->id,$f['tenant'],$f['company'],$f['unit']); try{return app(App\Modules\Accounting\ComposedLedgerController::class)->stockCommand($request,$action,app(App\Modules\Accounting\ComposedLedger::class))->getData(true);}finally{app(CompanyContext::class)->clear();} }; $before=$native->table('stock_movements')->orderBy('id')->get()->toJson();$native->beginTransaction(); try{ $id=(int)$native->table('gl_stock_books')->where(['tenant_id'=>1,'company_id'=>2,'unit_id'=>2])->value('id');$version=(int)($native->table('gl_stock_rates')->where('book_id',$id)->max('version')??0); $key=(string)Str::uuid();$data=['book_id'=>$id,'version'=>$version,'unit_minor'=>5000,'reason'=>'Taxa artificial de cinquenta MZN por unidade.']; $rate=$command('accounting_prepare','rate-prepare',$data,$key);$ok($rate['version']===$version+1,'controller prepares exact50MZN rate'); $retry=$command('accounting_prepare','rate-prepare',$data,$key);$ok($retry['rate_id']===$rate['rate_id']&&$retry['replayed'],'same controller request recovers rate without duplication'); $denied=false;try{$command('accounting_prepare','rate-prepare',array_replace($data,['unit_minor'=>5100]),$key);}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $e){$denied=$e->getStatusCode()===409;}$ok($denied,'same key with changed content is refused'); $review=['rate_id'=>$rate['rate_id'],'version'=>$rate['version'],'decision'=>'approved','reason'=>'Revisão independente da taxa artificial de Stock.'];$reviewKey=(string)Str::uuid(); $denied=false;try{$command('accounting_prepare','rate-review',$review,$reviewKey);}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $e){$denied=$e->getStatusCode()===403;}$ok($denied,'preparation identity cannot review stock rate'); $result=$command('accounting_review','rate-review',$review,$reviewKey);$ok($result['decision']==='approved','public review action reaches original validation engine'); $retry=$command('accounting_review','rate-review',$review,$reviewKey);$ok($retry['review_id']===$result['review_id']&&$retry['replayed'],'review recovers original decision'); $audit=$native->table('audit_logs')->where('action','sgf.ledger.stock-command')->whereIn('after->operation_key',[$key,$reviewKey])->orderBy('id')->get();$ok($audit->count()===2,'one host-qualified audit per command despite repetition'); $authors=$audit->map(fn($a)=>json_decode($a->after,true)['sgf_host_user'])->all();$ok($authors===[$profiles['accounting_prepare']['user_id'],$profiles['accounting_review']['user_id']],'audit retains distinct SGF authors'); $ok($before===$native->table('stock_movements')->orderBy('id')->get()->toJson(),'rate decisions do not execute physical movements'); $native->statement('SET CONSTRAINTS ALL IMMEDIATE'); }finally{while($native->transactionLevel()>0)$native->rollBack();} file_put_contents($work.'/stock-rate-controller-result.json',json_encode(['passed'=>true,'checks'=>$checks,'rolled_back'=>true,'browser_visual_review'=>false],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/stock-rate-controller-result.json']).PHP_EOL;