15 lines
6.3 KiB
PHP
15 lines
6.3 KiB
PHP
<?php
|
|
use App\Enums\PurchasingRole;
|
|
use App\Models\{Tenant,Department,CostCenter,User,Requisition,Supplier,Quotation,ProposalEvaluation,Warehouse,StockItem};
|
|
use App\Services\{CommonBudget,BudgetWorkflow,PurchaseWorkflow};
|
|
use Illuminate\Support\Facades\{Artisan,DB};
|
|
if(DB::getSchemaBuilder()->hasTable('users'))throw new LogicException('Fresh order QA database required');Artisan::call('migrate',['--force'=>true]);
|
|
$invoices=$s['invoices']??false;$requests=$s['requests']??false;$sourcing=$s['sourcing']??false;$create=function(string $label)use($sourcing,$requests,$invoices){
|
|
$tenant=Tenant::create(['name'=>'Order QA '.$label]);$department=Department::create(['tenant_id'=>$tenant->id,'name'=>'QA']);$centre=CostCenter::create(['tenant_id'=>$tenant->id,'department_id'=>$department->id,'code'=>'QA','name'=>'QA']);$users=[];foreach(['owner'=>PurchasingRole::Requester,'buyer'=>PurchasingRole::Procurement,'head'=>PurchasingRole::DepartmentHead,'finance'=>PurchasingRole::Finance,'admin'=>PurchasingRole::Admin,'receiver'=>PurchasingRole::Warehouse]as$key=>$role)$users[$key]=User::factory()->create(['tenant_id'=>$tenant->id,'department_id'=>$department->id,'purchasing_role'=>$role]);if($invoices)foreach(['reviewer','auditor']as$key)$users[$key]=User::factory()->create(['tenant_id'=>$tenant->id,'department_id'=>$department->id,'purchasing_role'=>PurchasingRole::Finance]);auth()->setUser($users['buyer']);
|
|
$request=null;$item=null;if(!$requests||$label==='FOREIGN'){$request=Requisition::create(['tenant_id'=>$tenant->id,'requester_id'=>$users['owner']->id,'department_id'=>$department->id,'cost_center_id'=>$centre->id,'number'=>'QA-ORDER-'.$label,'priority'=>'normal','needed_by'=>now()->addMonth(),'justification'=>'Approved synthetic source for SGF issuance.','status'=>'approved','subtotal_minor'=>10000,'tax_minor'=>0,'total_minor'=>10000,'approval_snapshot'=>['first_limit_minor'=>2500000,'second_limit_minor'=>15000000,'approval_includes_tax'=>true,'rules_provisional'=>true]]);$request->steps()->create(['tenant_id'=>$tenant->id,'position'=>1,'role'=>'department_head','decision'=>'approved','approver_id'=>$users['head']->id,'decided_at'=>now()]);$item=$request->items()->create(['tenant_id'=>$tenant->id,'description'=>'Material QA '.$label,'category'=>'Material','purchase_type'=>'consumable','quantity'=>'1.000','unit'=>'UN','unit_price_minor'=>10000,'tax_rate'=>'0','subtotal_minor'=>10000,'tax_minor'=>0,'total_minor'=>10000]);}$quotes=[];$suppliers=[];
|
|
foreach(['111222333','222333444','333444555']as$i=>$nuit){$supplier=Supplier::create(['tenant_id'=>$tenant->id,'created_by'=>$users['buyer']->id,'name'=>'QA supplier '.$i,'nuit'=>$nuit,'contact'=>'QA','email'=>'qa'.$i.'@example.invalid','phone'=>'000','address'=>'QA','category'=>'Material','beneficiaries'=>'QA','document_references'=>'Synthetic evidence','diligence_notes'=>'Synthetic only','status'=>'active','next_review'=>now()->addYear()]);$suppliers[]=$supplier->id;if($sourcing)continue;$amount=10000*($i+1);$quote=Quotation::create(['tenant_id'=>$tenant->id,'requisition_id'=>$request->id,'supplier_id'=>$supplier->id,'created_by'=>$users['buyer']->id,'reference'=>'QA-PROP-'.$i,'delivery_days'=>5,'valid_until'=>now()->addMonth(),'payment_terms'=>'QA30days','subtotal_minor'=>$amount,'tax_minor'=>0,'total_minor'=>$amount,'weights'=>['price'=>40,'quality'=>20,'delivery'=>15,'history'=>15,'payment'=>10]]);$quote->items()->create(['tenant_id'=>$tenant->id,'requisition_item_id'=>$item->id,'description'=>$item->description,'quantity'=>'1.000','unit_price_minor'=>$amount,'tax_rate'=>'0','subtotal_minor'=>$amount,'tax_minor'=>0,'total_minor'=>$amount]);foreach([$users['buyer'],$users['finance']]as$evaluator)ProposalEvaluation::create(['tenant_id'=>$tenant->id,'quotation_id'=>$quote->id,'evaluator_id'=>$evaluator->id,'quality'=>'8','history'=>'5','payment'=>'8','no_conflict'=>true,'comment'=>'Explicit synthetic fixture evaluation']);$quotes[]=$quote;}
|
|
auth()->setUser($users['admin']);$budget=app(CommonBudget::class)->for($users['admin'])->create(['cost_center_id'=>$centre->id,'year'=>(int)now()->year,'kind'=>'operating','amount_minor'=>100000,'includes_tax'=>true,'reason'=>'Synthetic approved1000MZN allocation.']);auth()->setUser($users['finance']);app(CommonBudget::class)->for($users['finance'])->approve($budget);auth()->setUser($users['owner']);if($request)DB::transaction(fn()=>app(BudgetWorkflow::class)->record($users['owner'],$request,'reserve',10000,10000));
|
|
$award=null;if(!$sourcing){auth()->setUser($users['buyer']);$workflow=app(PurchaseWorkflow::class);$award=$workflow->select($users['buyer'],$request,['quotation_id'=>$quotes[0]->id,'justification'=>'Explicit synthetic best-ranked proposal.','delivery_date'=>today()->addWeek()->format('Y-m-d'),'delivery_location'=>'QA warehouse']);auth()->setUser($users['head']);$workflow->decide($users['head'],$award,'approved','Distinct synthetic final approval.');}auth()->setUser($users['receiver']);$warehouse=Warehouse::create(['tenant_id'=>$tenant->id,'created_by'=>$users['receiver']->id,'code'=>'QA-WH','name'=>'QA warehouse']);$stock=StockItem::create(['tenant_id'=>$tenant->id,'created_by'=>$users['receiver']->id,'code'=>'QA-ITEM','name'=>'QA material','unit'=>'UN']);
|
|
return ['tenant'=>$tenant->id,'buyer'=>$users['buyer']->id,'issuer'=>$users['buyer']->id,'head'=>$users['head']->id,'finance'=>$users['finance']->id,'finance_reviewer'=>$users['reviewer']->id??0,'finance_auditor'=>$users['auditor']->id??0,'receiver'=>$users['receiver']->id,'reader'=>$users['head']->id,'award'=>$award?->id??0,'owner'=>$users['owner']->id,'centre'=>$centre->id,'requisition'=>$request?->id??0,'quote'=>$quotes[0]->id??0,'supplier_ids'=>$suppliers,'line'=>$item?->id??0,'warehouse'=>$warehouse->id,'stock'=>$stock->id,'order'=>0,'budget'=>$budget];
|
|
};$f=$create('MAIN');$foreign=$create('FOREIGN');$f+=['foreign_requisition'=>$foreign['requisition'],'foreign_award'=>$foreign['award'],'foreign_order'=>0,'foreign_supplier'=>$foreign['supplier_ids'][0],'foreign_warehouse'=>$foreign['warehouse'],'foreign_stock'=>$foreign['stock']];file_put_contents($s['root'].'/native-fixture.json',json_encode($f,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));file_put_contents($s['root'].'/native-setup.json',json_encode(['passed'=>true,'approved_awards_created_by_original_workflow'=>$sourcing?0:2,'initial_orders'=>DB::table('purchase_orders')->count(),'initial_receipts'=>0,'initial_movements'=>0],JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));
|