commit de compras

This commit is contained in:
2026-11-04 09:37:20 +02:00
parent fcf31e8d48
commit 0b05a1192c
741 changed files with 114127 additions and 116 deletions
+17
View File
@@ -0,0 +1,17 @@
<?php
use Illuminate\Support\Facades\DB;
$s=json_decode(file_get_contents(getenv('RECEIPT_COMPOSITION_STATE')),true);$out=$s['root'].'/completion-data-result.json';if(!($s['singleInstallation']??false)||$s['tag']!=='cc50a276c10c'||is_file($out))throw new LogicException('Selected existing installation only');require $s['app'].'/vendor/autoload.php';$app=require $s['app'].'/bootstrap/app.php';$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();App\Modules\Purchasing\BudgetAdapter::guard();$flow=json_decode(file_get_contents($s['root'].'/completion-flow-result.json'),true);$ids=$flow['source_ids'];$n=json_decode(file_get_contents($s['root'].'/native-fixture.json'),true);config(['database.connections.completion_native'=>$s['nativeConnection']]);$db=DB::connection('completion_native');$checks=[];$ok=function($v,$name)use(&$checks){if(!$v)throw new RuntimeException($name);$checks[]=$name;};
$facts=$db->transaction(function()use($db,$ids,$n,$ok){$db->statement('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ ONLY');$request=$db->table('requisitions')->where('id',$ids['request'])->first();$order=$db->table('purchase_orders')->where('id',$ids['order'])->first();$receipt=$db->table('goods_receipts')->where('id',$ids['receipt'])->first();$invoice=$db->table('invoices')->where('id',$ids['invoice'])->first();$proposal=$db->table('pa_proposals')->where('id',$ids['proposal'])->first();$obligation=$db->table('pa_obligations')->where('id',$ids['obligation'])->first();
$ok($request->tenant_id===$n['tenant']&&$request->status==='approved'&&$order->requisition_id===$request->id&&$order->purchase_award_id===$ids['award'],'C10 requisição adjudicação e ordem pertencem ao mesmo processo nativo');
$quotes=$db->table('quotations')->where('requisition_id',$ids['request'])->pluck('id');$ok($quotes->count()===3&&$db->table('proposal_evaluations')->whereIn('quotation_id',$quotes)->count()===6,'C10 três propostas e seis avaliações permanecem gravadas');
foreach($quotes as$id)$ok($db->table('proposal_evaluations')->where('quotation_id',$id)->distinct()->count('evaluator_id')===2,'C10 proposta '.$id.' tem dois avaliadores distintos');
$ok($db->table('budget_entries')->where('requisition_id',$ids['request'])->where('kind','reserve')->count()===1&&$db->table('budget_entries')->where('requisition_id',$ids['request'])->where('kind','commit')->count()===1&&$db->table('budget_consumptions')->where('invoice_id',$ids['invoice'])->count()===1&&(int)$db->table('budget_consumptions')->where('invoice_id',$ids['invoice'])->sum('amount_minor')===10000,'C10 reserva compromisso e consumo100MZN únicos no orçamento nativo');
$ok($db->table('goods_receipts')->where('purchase_order_id',$ids['order'])->count()===1&&$receipt->received_by!==$order->issued_by,'C10 uma recepção por identidade distinta do emissor');
$movements=$db->table('stock_movements')->whereIn('goods_receipt_item_id',$db->table('goods_receipt_items')->where('goods_receipt_id',$ids['receipt'])->select('id'))->get();$ok($movements->count()===1&&$movements[0]->id===$ids['movement']&&(int)$movements[0]->quantity_milli===1000&&$movements[0]->stock_item_id===$n['stock'],'C10 um único movimento físico1UN depois da recuperação da resposta');
$ok($invoice->status==='validated'&&$invoice->created_by!==$invoice->validated_by&&$db->table('invoices')->where('purchase_order_id',$ids['order'])->count()===1,'C10 uma factura validada por identidade distinta');
$ok($proposal->prepared_by!==$obligation->recognised_by&&$obligation->principal_minor===10000&&$obligation->due_on===null&&$db->table('pa_obligations')->where('source_id',$obligation->source_id)->count()===1,'C10 principal100MZN único e reconhecimento por identidade distinta');
$ok($db->table('external_payments')->where('tenant_id',$n['tenant'])->count()===0,'C10 nenhum pagamento criado no percurso');
$ok($db->table('audit_logs')->where('requisition_id',$ids['request'])->where('action','sgf.request.command')->count()===3&&$db->table('audit_logs')->where('requisition_id',$ids['request'])->where('action','sgf.sourcing.command')->count()===11,'C10 decisões e avaliações mantêm auditoria dos comandos originais');
return ['request_number'=>$request->number,'order_number'=>$order->number,'invoice_number'=>$invoice->number,'principal_minor'=>$obligation->principal_minor,'physical_milli'=>1000];
});
file_put_contents($out,json_encode(['passed'=>true,'checks'=>$checks,'facts'=>$facts,'source_ids'=>$ids,'read_only_verification'=>true,'new_database'=>false,'new_rights'=>false,'visual_review'=>false],JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));echo count($checks)." canonical purchasing checks passed.\n";