true,'replayed'=>true,'business_commands'=>0]).PHP_EOL;exit;} config(['stock_operations.enabled'=>true,'stock_operations.profile_sha256'=>$pins['stock-operations-binding.json']]);$u=App\Models\User::findOrFail($f['validator']); $grant=$f['scope']+['user_id'=>$u->id,'permission'=>'stock.view'];if(!$host->table('permission_grants')->where($grant)->exists()){$host->table('permission_grants')->insert($grant);App\Modules\Identity\Services\Audit::record('access.granted_on_creation',null,1,2,2,$u->id,['permission'=>'stock.view','reason'=>'Leitura já implícita no perfil QA Armazém aprovado; alinhar a regressão existente à8085.']);} Auth::guard('web')->setUser($u);$r=Illuminate\Http\Request::create('/api/stock-operations/confirm','POST');$session=app('session')->driver();$session->start();$session->put('company_context',$f['scope']+['module_id'=>'stock','token'=>'physical-input']);$r->setLaravelSession($session);$r->setUserResolver(fn()=>$u);$app->instance('request',$r);app(CompanyContext::class)->selectFor($u->id,$f['tenant'],$f['company'],$f['unit']); $oldNow=Carbon::getTestNow();Carbon::setTestNow(Carbon::parse('2026-11-10T09:00:00+02:00')); try{$result=app(App\Modules\Purchasing\ReceiptRuntime::class)->run('stock.operations.confirm',function($actor)use($tag,$ledger){ // Explicit prepared order fixture. This is NOT a replay of the accepted acquisition workflow. $db=DB::connection();$template=$db->table('purchase_orders')->where('tenant_id',$actor->tenant_id)->where('status','issued')->orderBy('id')->first()??throw new LogicException('Existing native order template required'); $clone=function($table,$id,$changes)use($db){$row=(array)$db->table($table)->where('id',$id)->first();unset($row['id']);return $db->table($table)->insertGetId(array_replace($row,$changes));}; $req=$clone('requisitions',$template->requisition_id,['number'=>'REQ-QA-PHYS-'.$tag,'justification'=>'Prepared fixture solely for the authorised stock2/-1/+0.5 cycle; not a new procurement acceptance.']); $originalLine=$db->table('purchase_order_items')->where('purchase_order_id',$template->id)->orderBy('id')->first();$requested=$clone('requisition_items',$originalLine->requisition_item_id,['requisition_id'=>$req,'description'=>'Artigo QA integrado preparado','quantity'=>'2.000','unit'=>'UN','unit_price_minor'=>5000,'subtotal_minor'=>10000,'tax_minor'=>0,'total_minor'=>10000]); $awardTemplate=$db->table('purchase_awards')->where('id',$template->purchase_award_id)->first();$quote=$clone('quotations',$awardTemplate->quotation_id,['requisition_id'=>$req,'reference'=>'QA-PHYS-'.$tag]);$award=$clone('purchase_awards',$awardTemplate->id,['requisition_id'=>$req,'quotation_id'=>$quote,'justification'=>'Adjudicação preparada como fixture física QA, não fluxo comercial executado.']); $orderId=$clone('purchase_orders',$template->id,['requisition_id'=>$req,'purchase_award_id'=>$award,'number'=>'OC-QA-PHYS-'.$tag,'issued_at'=>now(),'snapshot'=>json_encode(['development_only'=>true,'prepared_stock_fixture'=>true,'budget_checked'=>false,'company'=>['name'=>'Empresa QA'],'supplier'=>['name'=>'Fornecedor QA']])]); $line=$clone('purchase_order_items',$originalLine->id,['purchase_order_id'=>$orderId,'requisition_item_id'=>$requested,'description'=>'Artigo QA integrado preparado','quantity'=>'2.000','unit'=>'UN','unit_price_minor'=>5000,'subtotal_minor'=>10000,'tax_minor'=>0,'total_minor'=>10000]); $order=Tempo\Purchasing\Embedded\Models\PurchaseOrder::findOrFail($orderId);$payload=['idempotency_key'=>(string)Str::uuid(),'delivery_note'=>'QA-PHYS-'.$tag,'received_on'=>'2026-11-10','warehouse_id'=>$ledger['warehouse_id'],'items'=>[['purchase_order_item_id'=>$line,'received_quantity'=>'2.000','accepted_quantity'=>'2.000','quality_status'=>'compliant','stock_item_id'=>$ledger['stock_item_id'],'notes'=>'Recepção física QA pelo workflow original.']]]; $receipt=app(Tempo\Purchasing\Embedded\Services\ReceiptWorkflow::class)->confirm($actor,$order,$payload);$retry=app(Tempo\Purchasing\Embedded\Services\ReceiptWorkflow::class)->confirm($actor,$order,$payload);if($receipt->id!==$retry->id)throw new LogicException('Receipt duplicated'); $workflow=app(Tempo\Purchasing\Embedded\Services\StockWorkflow::class);$basis=$workflow->balance($ledger['stock_item_id'],$ledger['warehouse_id']);if($basis['quantity']!==2000)throw new LogicException('Expected2UN physical receipt'); $issue=$workflow->record($actor,['kind'=>'issue','reference'=>'QA-PHYS-ISSUE-'.$tag,'idempotency_key'=>(string)Str::uuid(),'responsible_id'=>$actor->id,'warehouse_id'=>$ledger['warehouse_id'],'stock_item_id'=>$ledger['stock_item_id'],'quantity'=>'1.000','destination'=>'Oficina QA integrada','reason'=>'Entrega física de uma unidade, com consumo/devolução por decisões posteriores.','ledger_version'=>$basis['version']]); $movement=$db->table('stock_movements')->where('stock_operation_id',$issue->id)->where('movement_type','issue')->first();if(!$movement)throw new LogicException('Original issue writer did not produce movement'); return ['order'=>$orderId,'prepared_order_fixture'=>true,'receipt'=>$receipt->id,'issue_operation'=>$issue->id,'issue_movement'=>$movement->id,'stock_item'=>$ledger['stock_item_id'],'warehouse'=>$ledger['warehouse_id'],'quantity_milli'=>$workflow->balance($ledger['stock_item_id'],$ledger['warehouse_id'])['quantity'],'no_new_invoice_or_obligation'=>true]; });}catch(\Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $e){echo json_encode(['refused_status'=>$e->getStatusCode(),'frames'=>array_map(fn($f)=>[basename($f['file']??''),$f['line']??0,$f['function']??''],array_slice($e->getTrace(),0,12))]).PHP_EOL;throw $e;}finally{Carbon::setTestNow($oldNow);} file_put_contents($file,json_encode($result,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));echo json_encode(['passed'=>true,'quantity_milli'=>$result['quantity_milli'],'receipt_issue_workflows'=>true,'prepared_order_is_not_full_procurement_journey'=>true]).PHP_EOL;