forgetGuards();app(App\Shared\Context\CompanyContext::class)->clear();
// The QA forms use the explicit CSRF header. Keep validation, but do not replace
// the shared localhost XSRF-TOKEN cookie belonging to another demonstration.
$app->bind(Illuminate\Foundation\Http\Middleware\PreventRequestForgery::class,static fn($container)=>new class($container,$container->make(Illuminate\Contracts\Encryption\Encrypter::class)) extends Illuminate\Foundation\Http\Middleware\PreventRequestForgery { protected $addHttpCookie=false; });
$app->usePublicPath($c['storage'].'/public');app(Illuminate\Foundation\Vite::class)->useHotFile($c['storage'].'/no-hot');
Illuminate\Support\Facades\Route::middleware('web')->get('/qa/ledger-demo',function()use($s,$g){
if($g['cycle_enabled']??false){return response()->view('accounting.ledger-cycle-entry',['tag'=>$s['tag'],'obligation'=>$g['obligation_id']])->header('Cache-Control','no-store');}
if($g['integrated_flow']??false){
return response()->view('accounting.payable-flow-entry',['tag'=>$s['tag'],'source'=>$g['local_source_id']])->header('Cache-Control','no-store');
}
$tag=htmlspecialchars($s['tag'],ENT_QUOTES,'UTF-8');$id=(int)$g['obligation_id'];
return response('
Ensaio de lançamento SGFPrimeiro lançamento contabilístico — QA
Exclusivamente sintético. Obrigação #'.$id.', 60 MZN, duas contas artificiais e período QA-2026-10. Não altera a dívida financeira, stock ou orçamento.
Preparar / aplicar · Rever com outra identidade · Consultar
- Preparador captura a obrigação e fundamento.
- Revisor confere o impacto e aprova ou recusa a versão exacta.
- Preparador aplica uma vez e consulta o lançamento.
Data de ensaio 29/10/2026, regra QA-PAYABLE-JOURNAL. O histórico não é apagado para repetir a demonstração. Revisão visual e aceitação ainda por realizar.
')->header('Cache-Control','no-store');
});
Illuminate\Support\Facades\Route::middleware('web')->get('/qa/ledger-enter/{role}',function(Illuminate\Http\Request $r,string $role)use($f,$g){
abort_unless(in_array($role,['prepare','validate','read'],true),404);$module=$r->query('module','accounting');abort_unless(in_array($module,['accounting','purchasing'],true),422);
$u=App\Models\User::findOrFail($f['actors'][$role]);auth()->login($u);$r->session()->regenerate();$token=bin2hex(random_bytes(24));$r->session()->put('auth_version',$u->auth_version);$r->session()->put('company_context',$f['scope']+['token'=>$token,'module_id'=>$module]);
$r->session()->put('ledger_demo',true);
if($r->query('open')==='cycle')return redirect('/general-ledger/cycle');
if($r->query('open')==='flow')return redirect('/general-ledger/flow?source='.$g['local_source_id']);
if($r->query('open')==='ledger')return redirect('/general-ledger');
return response()->json(['csrf'=>csrf_token(),'context'=>$token,'obligation_id'=>$g['obligation_id']])->header('Cache-Control','no-store');
});
$sql=[];$mode=[];
require __DIR__.'/ledger-reports-observer.php';
DB::listen(function($event)use(&$sql,&$mode){$sql[]=$event->sql;if(!$mode&&str_contains($event->sql,'"gl_journals"')){$pdo=$event->connection->getPdo();$mode=['isolation'=>$pdo->query('SHOW transaction_isolation')->fetchColumn(),'read_only'=>$pdo->query('SHOW transaction_read_only')->fetchColumn()];}});
$app->handleRequest(Illuminate\Http\Request::capture());
if(($_SERVER['HTTP_X_LEDGER_QA_PROOF']??'')==='read')file_put_contents($s['root'].'/ledger-http-read-mode.json',json_encode(['transaction'=>$mode,'writer_lock_queries'=>count(array_filter($sql,fn($s)=>str_contains(strtolower($s),'for update')))],JSON_PRETTY_PRINT));
exit;