make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();$n=json_decode(file_get_contents($s['root'].'/native-fixture.json'),true);config(['database.connections.demo_verify'=>$s['nativeConnection']]);$db=DB::connection('demo_verify');$checks=[];$ok=function($v,$name)use(&$checks){if(!$v)throw new RuntimeException($name);$checks[]=$name;};$fingerprint=fn()=>hash('sha256',json_encode([$db->table('requisitions')->orderBy('id')->get(),$db->table('budget_entries')->orderBy('id')->get(),$db->table('audit_logs')->orderBy('id')->get()]));$before=$fingerprint();$client=new GuzzleHttp\Client(['base_uri'=>'http://127.0.0.1:8068','http_errors'=>false,'timeout'=>25]);$ok($db->table('requisitions')->where('tenant_id',$n['tenant'])->count()===0&&(int)$db->table('budget_entries')->where('tenant_id',$n['tenant'])->sum('reserved_minor')===0,'main demo begins before any requisition or reservation'); foreach(['requester','approver','actor','issuer','validator']as$role){$jar=new GuzzleHttp\Cookie\CookieJar;$r=$client->get('/qa/enter/'.$role,['cookies'=>$jar]);$v=json_decode((string)$r->getBody(),true);$o=['cookies'=>$jar,'headers'=>['Accept'=>'application/json','X-SGF-Context'=>$v['context']]];$r=$client->get('/api/purchasing-requests',$o);$d=json_decode((string)$r->getBody(),true);$ok($role==='validator'?$r->getStatusCode()===403:($r->getStatusCode()===200&&$d['requests']['total']===0&&$d['can_prepare']===($role==='requester')),'live request rights match '.$role);if($role==='requester'){$r=$client->get('/purchasing/requests',$o);$ok($r->getStatusCode()===200&&str_contains((string)$r->getBody(),'request-workspace.mjs'),'request workspace is live');$ok($client->get('/api/purchasing-requests/0',$o)->getStatusCode()===404,'creation sentinel is not a readable request');}if($role==='actor'){$r=$client->get('/api/purchasing-sourcing',$o);$d=json_decode((string)$r->getBody(),true);$ok($r->getStatusCode()===200&&$d['total']===0,'procurement waits for an actual approved request');}} $r=$client->get('/request-workspace.mjs');$ok($r->getStatusCode()===200&&hash('sha256',(string)$r->getBody())===hash_file('sha256',$s['app'].'/public/request-workspace.mjs'),'served request script matches delivered source');$ok($fingerprint()===$before,'read-only demonstration smoke changes no business evidence');file_put_contents($out,json_encode(['passed'=>true,'checks'=>$checks,'before'=>$before,'after'=>$fingerprint(),'visual_review'=>false],JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));echo count($checks)." demo checks passed.\n";