25 lines
4.9 KiB
PHP
25 lines
4.9 KiB
PHP
<?php
|
|
use Illuminate\Support\Facades\{Auth,DB};use Illuminate\Support\Str;use App\Shared\Context\CompanyContext;
|
|
$book=$argv[1]??'regression';require __DIR__.'/sgf-single-bootstrap.php';$pins=json_decode(file_get_contents($s['root'].'/single-binding-pins.json'),true);$ledger=json_decode(file_get_contents($s['root'].'/single-native-ledger.json'),true);$file=$s['root'].'/single-stock-lot-input.json';
|
|
if(is_file($file)){echo json_encode(['passed'=>true,'replayed'=>true,'business_commands'=>0]).PHP_EOL;exit;}
|
|
config(['sgf_single_installation.enabled'=>true,'sgf_single_installation.bindings_sha256'=>$pins['single-bindings.json'],'stock_operations.enabled'=>true,'stock_operations.profile_sha256'=>$pins['stock-operations-binding.json']]);
|
|
$u=App\Models\User::findOrFail($f['validator']);Auth::guard('web')->setUser($u);$r=Illuminate\Http\Request::create('/api/stock-operations','GET');$session=app('session')->driver();$session->start();$session->put('company_context',$f['scope']+['module_id'=>'stock','token'=>'lot-input']);$r->setLaravelSession($session);$r->setUserResolver(fn()=>$u);$app->instance('request',$r);app(CompanyContext::class)->selectFor($u->id,1,2,2);
|
|
$result=app(App\Modules\Purchasing\ReceiptRuntime::class)->run('stock.operations.confirm',function($actor)use($ledger,$tag){
|
|
$db=DB::connection();$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));};
|
|
$code='QA-LOTE-INTEGRADO-'.$tag;
|
|
$item=$db->table('stock_items')->where(['tenant_id'=>1,'code'=>$code])->value('id');
|
|
if($item){$receipt=$db->table('goods_receipts')->where(['tenant_id'=>1,'delivery_note'=>'QA-LOTS-'.$tag])->first();if(!$receipt)throw new LogicException('Incomplete lot fixture: inspect before recovery');return ['stock_item'=>(int)$item,'warehouse'=>$ledger['warehouse_id'],'receipt'=>$receipt->id,'prepared_stock_fixture'=>true];}
|
|
$item=$clone('stock_items',$ledger['stock_item_id'],['code'=>$code,'name'=>'Artigo QA por lotes']);
|
|
$template=$db->table('purchase_orders')->where('tenant_id',1)->where('status','issued')->orderBy('id')->firstOrFail();
|
|
$req=$clone('requisitions',$template->requisition_id,['number'=>'REQ-QA-LOTS-'.$tag,'justification'=>'Prepared stock fixture only; no new acquisition acceptance.']);$original=$db->table('purchase_order_items')->where('purchase_order_id',$template->id)->firstOrFail();
|
|
$changes=['description'=>'Artigo fictício por lotes','quantity'=>'4.000','unit'=>'UN','unit_price_minor'=>2000,'subtotal_minor'=>8000,'tax_minor'=>0,'total_minor'=>8000];
|
|
$line=$clone('requisition_items',$original->requisition_item_id,$changes+['requisition_id'=>$req]);$awardTemplate=$db->table('purchase_awards')->where('id',$template->purchase_award_id)->firstOrFail();$quote=$clone('quotations',$awardTemplate->quotation_id,['requisition_id'=>$req,'reference'=>'QA-LOTS-'.$tag]);$award=$clone('purchase_awards',$awardTemplate->id,['requisition_id'=>$req,'quotation_id'=>$quote,'justification'=>'Fixture de origem física explicitamente autorizada.']);
|
|
$orderId=$clone('purchase_orders',$template->id,['requisition_id'=>$req,'purchase_award_id'=>$award,'number'=>'OC-QA-LOTS-'.$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']])]);$orderLine=$clone('purchase_order_items',$original->id,$changes+['purchase_order_id'=>$orderId,'requisition_item_id'=>$line]);
|
|
$order=Tempo\Purchasing\Embedded\Models\PurchaseOrder::findOrFail($orderId);$receipt=app(Tempo\Purchasing\Embedded\Services\ReceiptWorkflow::class)->confirm($actor,$order,['idempotency_key'=>(string)Str::uuid(),'delivery_note'=>'QA-LOTS-'.$tag,'received_on'=>'2026-11-10','warehouse_id'=>$ledger['warehouse_id'],'items'=>[['purchase_order_item_id'=>$orderLine,'received_quantity'=>'4.000','accepted_quantity'=>'4.000','quality_status'=>'compliant','stock_item_id'=>$item,'notes'=>'Entrada física efectiva4UN; configuração de lotes posterior e distinta.']]]);
|
|
return ['stock_item'=>$item,'warehouse'=>$ledger['warehouse_id'],'receipt'=>$receipt->id,'prepared_stock_fixture'=>true,'financial_obligation_created'=>false];
|
|
});
|
|
file_put_contents($file,json_encode($result,JSON_PRETTY_PRINT));
|
|
$path=$s['root'].'/stock-final-binding.json';$p=json_decode(file_get_contents($path),true);$p['lot_item_id']=$result['stock_item'];$p['transfer_item_id']=$ledger['stock_item_id'];copy($path,$work.'/stock-final-binding-before.json');file_put_contents($path,json_encode($p,JSON_PRETTY_PRINT));
|
|
$pins['stock-final-binding.json']=hash_file('sha256',$path);file_put_contents($s['root'].'/single-binding-pins.json',json_encode($pins,JSON_PRETTY_PRINT));
|
|
echo json_encode(['passed'=>true,'book'=>$book,'lot_item_id'=>$result['stock_item'],'received_milli'=>4000,'prepared_order_is_not_procurement_acceptance'=>true]).PHP_EOL;
|