true,'internal_statements.schema_sha256'=>hash_file('sha256',$repo.'/database/sql/internal_statements.sql')]);set_exception_handler(function($e){echo json_encode(['passed'=>false,'type'=>get_class($e),'message'=>$e->getMessage(),'frames'=>array_map(fn($f)=>[basename($f['file']??''),$f['line']??0],array_slice($e->getTrace(),0,5))]).PHP_EOL;exit(1);}); $fs=app(App\Modules\Accounting\InternalStatementsController::class);$fsCall=function(int $actor,string $method,array $input=[],?string $key=null,string $generation='statements-proof',string $module='accounting')use($app,$fs,$f){Illuminate\Support\Facades\Auth::forgetGuards();Illuminate\Support\Facades\Auth::shouldUse('web');$u=App\Models\User::findOrFail($actor);Illuminate\Support\Facades\Auth::guard('web')->setUser($u);$get=in_array($method,['index','receipt','export']);$r=Illuminate\Http\Request::create('/api/general-ledger/statements',$get?'GET':'POST',$input);$r->headers->set('Idempotency-Key',$key??(string)Illuminate\Support\Str::uuid());$r->attributes->set('sgf_module',$module);$r->setUserResolver(fn()=>$u);$session=app('session')->driver();$session->start();$session->put('company_context',$f['scope']+['module_id'=>$module,'token'=>$generation.'-'.$actor]);$r->setLaravelSession($session);$app->instance('request',$r);app(App\Shared\Context\CompanyContext::class)->selectFor($actor,1,2,2);$response=match($method){'receipt'=>$fs->receipt($r,$key),'export'=>$fs->export($r,(int)$key),default=>$fs->$method($r)};if(method_exists($response,'getData'))return['status'=>$response->getStatusCode(),'value'=>$response->getData(true)];ob_start();$response->sendContent();$bytes=ob_get_clean();return['status'=>$response->getStatusCode(),'bytes'=>$bytes,'sha256'=>$response->headers->get('X-Content-SHA256')];}; $fsInput=fn($kind,$action,$version,$data)=>['kind'=>$kind,'action'=>$action,'version'=>$version,'data'=>$data,'reason'=>'Decisão individual QA de apresentação interna parcial, sem efeitos no diário.']; $fsCommand=function($actor,$input,$key=null)use($fsCall){$key??=(string)Illuminate\Support\Str::uuid();$cut=$fsCall($actor,'preview',$input,$key);if($cut['status']!==200)throw new LogicException(json_encode($cut));$out=$fsCall($actor,'confirm',['preview'=>$cut['value']['preview']]);if(!in_array($out['status'],[200,201]))throw new LogicException(json_encode($out));return[$out['value'],$cut['value'],$key];}; $fsReject=function($fn,$expected,$label)use($ok){$actual=null;try{$r=$fn();$actual=$r['status']??null;}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface$e){$actual=$e->getStatusCode();}catch(Illuminate\Validation\ValidationException){$actual=422;}$ok($actual===$expected,$label);}; // Explicit fixture choices from the approved proposal; never a production classifier. $approvedCategories=['QA-CAIXA'=>'asset','QA-CLIENTES'=>'asset','QA-STOCK'=>'asset','QA-FORNECEDOR'=>'liability','QA-VENDAS'=>'income','QA-CONSUMO-STOCK'=>'expense','QA-CUSTO-DIRECTO'=>'expense','QA-CUSTO-INDUSTRIAL'=>'expense','QA-DESPESA-CAIXA'=>'expense','QA-DIFERENCA-INVENTARIO'=>'expense','QA-COMPENSACAO-ENSAIO'=>'unclassified','QA-COMPENSACAO-INDUSTRIAL'=>'unclassified','QA-COMPENSACAO-STOCK'=>'unclassified','QA-CONTRAPARTIDA'=>'unclassified','QA-DEVOLUCAO-FORNECEDOR'=>'unclassified','QA-IMPOSTO-TESTE'=>'unclassified','QA-LIQUIDACAO'=>'unclassified','QA-LIQUIDACAO-CLIENTE'=>'unclassified','QA-REDUCAO-CLIENTE'=>'unclassified'];$fsEntries=[];foreach($native->table('gl_accounts')->where($f['scope'])->whereIn('code',array_keys($approvedCategories))->orderBy('id')->get(['id','code'])as$a)$fsEntries[]=['account_id'=>$a->id,'category'=>$approvedCategories[$a->code]];$fsMapping=['entries'=>$fsEntries,'evidence'=>'Correspondências artificiais explicitamente discriminadas no âmbito aprovado; sem classificação legal.'];