true,'payable_due.schema_sha256'=>hash_file('sha256',$repo.'/database/sql/payable_due.sql'),'sgf_single_installation.finance_enabled'=>true]); 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);}); $due=app(App\Modules\Purchasing\PayableDueController::class);$dueCall=function(int $actor,string $method,array $input=[],?string $key=null,string $generation='due-proof',string $module='finance')use($app,$due,$f){Illuminate\Support\Facades\Auth::forgetGuards();Illuminate\Support\Facades\Auth::shouldUse('web');$user=App\Models\User::findOrFail($actor);Illuminate\Support\Facades\Auth::guard('web')->setUser($user);$get=in_array($method,['index','receipt'],true);$r=Illuminate\Http\Request::create('/api/finance/payable-due',$get?'GET':'POST',$input);$r->headers->set('Idempotency-Key',$key??(string)Illuminate\Support\Str::uuid());$r->attributes->set('sgf_module',$module);$r->setUserResolver(fn()=>$user);$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=$method==='receipt'?$due->receipt($r,$key):$due->$method($r);return['status'=>$response->getStatusCode(),'value'=>method_exists($response,'getData')?$response->getData(true):$response->getContent()];}; $dueInput=fn($action,$key,$version,$data)=>['action'=>$action,'obligation_id'=>$key,'version'=>$version,'data'=>$data,'reason'=>'Decisão individual QA de vencimento administrativo, sem efeito monetário.']; $dueCommand=function($actor,$input,$key=null)use($dueCall){$key??=(string)Illuminate\Support\Str::uuid();$preview=$dueCall($actor,'preview',$input,$key);if($preview['status']!==200)throw new RuntimeException(json_encode($preview));$out=$dueCall($actor,'confirm',['preview'=>$preview['value']['preview']]);if(!in_array($out['status'],[200,201],true))throw new RuntimeException(json_encode($out));return[$out['value'],$preview['value'],$key];}; $rejectCatalogue=function($fn,$status,$label)use($ok){$actual=null;try{$response=$fn();$actual=$response['status']??null;}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface$e){$actual=$e->getStatusCode();}catch(Illuminate\Validation\ValidationException){$actual=422;}$ok($actual===$status,$label);};