31 lines
6.1 KiB
PHP
31 lines
6.1 KiB
PHP
<?php
|
|
use Illuminate\Support\Facades\{Artisan,DB,Date};
|
|
use Illuminate\Support\Str;
|
|
use App\Models\{User,WarehouseRequestEvent};
|
|
use App\Services\{ReceiptWorkflow,WarehouseRequests,WarehouseFulfilment,WarehouseReturns};
|
|
use Tempo\Finance\GeneralLedger\{LedgerSchema,CycleSchema,StockSchema};
|
|
if(DB::getSchemaBuilder()->hasTable('users'))throw new LogicException('Fresh QA database required; no reset');
|
|
Artisan::call('migrate',['--force'=>true]);Date::setTestNow('2026-10-29 12:00:00');config(['stock_returns.enabled'=>true]);
|
|
require $s['root'].'/StockReceiptFixture.php';require $s['native'].'/tests/Support/SupplyFixture.php';
|
|
$f=stockValuationFixture('2.000');
|
|
$reviewer=User::factory()->create(['tenant_id'=>$f['tenant']->id,'department_id'=>$f['issuer']->department_id]);
|
|
supplyGrant($f['issuer'],['warehouse_request_prepare','warehouse_return_prepare','warehouse_return_read','warehouse_return_confirm','warehouse']);supplyGrant($reviewer,['warehouse_request_review']);supplyGrant($f['receiver'],['warehouse','warehouse_request_deliver','warehouse_return_read','warehouse_return_confirm']);
|
|
auth()->setUser($f['receiver']);$receipt=app(ReceiptWorkflow::class)->confirm($f['receiver'],$f['order'],stockValuationPayload($f,'2.000'));
|
|
auth()->setUser($f['issuer']);$request=app(WarehouseRequests::class)->draft($f['issuer'],['operation_key'=>(string)Str::uuid(),'warehouse_id'=>$f['warehouse']->id,'cost_center_id'=>$f['r']->cost_center_id,'destination'=>'Synthetic selected material use','reason'=>'Explicit selected QA valuation physical source.','priority'=>'normal','lines'=>[['stock_item_id'=>$f['stock']->id,'quantity'=>'1.000','use'=>'internal','equipment_id'=>null]]]);
|
|
$command=function($actor,$action,$extra)use($request){auth()->setUser($actor);return app(WarehouseFulfilment::class)->command($actor,$request->id,['operation_key'=>(string)Str::uuid(),'version'=>app(WarehouseFulfilment::class)->progress($request)['version'],'action'=>$action,'reason'=>'Explicit isolated physical workflow.']+$extra);};
|
|
$command($f['issuer'],'submit',['partial_allowed'=>false]);$command($reviewer,'authorize',['partial_allowed'=>false]);$delivery=$command($f['receiver'],'deliver',['lines'=>[['index'=>0,'quantity'=>'1.000']]]);$command($f['issuer'],'receive',['delivery_event_id'=>$delivery->id]);
|
|
$d=['operation_key'=>(string)Str::uuid(),'delivery_event_id'=>$delivery->id,'line_index'=>0,'quantity_milli'=>500,'declared_unused'=>true,'evidence'=>'Unused selected half unit physically returned to original warehouse.','reason'=>'Explicit unused material declaration for QA valuation.'];
|
|
auth()->setUser($f['issuer']);$p=app(WarehouseReturns::class)->prepare($f['issuer'],$d);auth()->setUser($f['receiver']);$returned=app(WarehouseReturns::class)->confirm($f['receiver'],$p['id'],['version'=>1,'received_in_warehouse'=>true,'reason'=>'Distinct physical receipt of selected unused half unit.']);
|
|
if(DB::table('stock_movements')->count()!==3||(int)DB::table('stock_movements')->sum('quantity_milli')!==1500)throw new LogicException('Expected actual receipt2/issue1/return0.5');
|
|
$app->instance('env','payable-testing');
|
|
LedgerSchema::install(DB::connection());CycleSchema::install(DB::connection());StockSchema::install(DB::connection());
|
|
if(!DB::getSchemaBuilder()->hasTable('ps_payments'))Tempo\Finance\Payables\SettlementSchema::install();if(!DB::getSchemaBuilder()->hasTable('ps_reversals'))Tempo\Finance\Payables\ReversalSchema::install();
|
|
$scope=['tenant_id'=>$f['tenant']->id,'company_id'=>0,'unit_id'=>0];$actors=[];
|
|
foreach(['prepare','validate','read']as$role){$u=User::factory()->create(['tenant_id'=>$f['tenant']->id,'department_id'=>$f['issuer']->department_id,'purchasing_role'=>App\Enums\PurchasingRole::Finance]);supplyGrant($u,['finance']);$actors[$role]=$u->id;foreach(match($role){'prepare'=>['view','prepare','post','period_prepare','period_close'],'validate'=>['view','validate','period_validate'],default=>['view']}as$a)DB::table('pa_access')->insert($scope+['user_id'=>$u->id,'action'=>'general_ledger.'.$a,'person'=>'qa-stock-person-'.$u->id]);}
|
|
$meta=['created_by'=>$actors['prepare'],'reason'=>'Authorised isolated stock valuation composition.','created_at'=>now()];$accounts=[];foreach(['QA-STOCK','QA-COMPENSACAO-STOCK','QA-CONSUMO-STOCK']as$code)$accounts[$code]=DB::table('gl_accounts')->insertGetId($scope+['code'=>$code,'label'=>'Artificial '.$code,'is_movement'=>true,'currency'=>'MZN']);
|
|
DB::table('gl_periods')->insert($scope+$meta+['period_key'=>'QA-2026-10','version'=>1,'starts_on'=>'2026-10-01','ends_on'=>'2026-10-31','status'=>'open']);
|
|
foreach(['stock.receipt'=>['QA-STOCK','QA-COMPENSACAO-STOCK'],'stock.issue'=>['QA-CONSUMO-STOCK','QA-STOCK'],'stock.return'=>['QA-STOCK','QA-CONSUMO-STOCK']]as$type=>[$debit,$credit])DB::table('gl_rules')->insert($scope+$meta+['rule_key'=>$type,'version'=>1,'policy'=>'QA-STOCK-VALUATION-v1','effect_type'=>$type,'currency'=>'MZN','valid_from'=>'2026-10-01','valid_to'=>'2026-10-31','debit_account_id'=>$accounts[$debit],'credit_account_id'=>$accounts[$credit]]);
|
|
$book=DB::table('gl_stock_books')->insertGetId($scope+$meta+['stock_item_id'=>$f['stock']->id,'warehouse_id'=>$f['warehouse']->id,'unit_code'=>'UN','period_key'=>'QA-2026-10']);
|
|
$fixture=['scope'=>$scope,'actors'=>$actors,'accounts'=>$accounts,'book_id'=>$book,'physical_actors'=>['issuer'=>$f['issuer']->id,'receiver'=>$f['receiver']->id,'reviewer'=>$reviewer->id],'movements'=>DB::table('stock_movements')->orderBy('id')->get(['id','movement_type','quantity_milli'])->all(),'return_proposal'=>$p['id'],'return_confirmation'=>$returned,'physical_receipt'=>$receipt->id,'physical_request'=>$request->id];
|
|
file_put_contents($s['root'].'/fixture.json',json_encode($fixture,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));file_put_contents($s['root'].'/setup.json',json_encode(['passed'=>true,'actual_receipt_issue_return_workflows'=>true,'movements'=>3,'quantity_milli'=>1500,'initial_rates'=>0,'initial_journals'=>0,'supplier_obligations'=>DB::table('pa_obligations')->count(),'native_scope_is_not_sgf_company_unit'=>true],JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));echo "Actual physical2/-1/+0.5; net1.5UN. New common ledger, no rates/journals or payable effects.\n";
|