18 lines
4.1 KiB
PHP
18 lines
4.1 KiB
PHP
<?php
|
|
use Illuminate\Support\Facades\Auth;use Illuminate\Support\Str;use App\Shared\Context\{CompanyContext,ModuleRecords};use App\Modules\Workshop\WorkshopBilling;
|
|
require __DIR__.'/sgf-ledger-proof-bootstrap.php';$direct=json_decode(file_get_contents($s['root'].'/single-direct-cost.json'),true);$commercial=json_decode(file_get_contents($s['root'].'/single-commercial.json'),true);$key=fn()=>(string)Str::uuid();
|
|
$select=function($role,$module='workshop')use($profiles,$f,$app){$u=App\Models\User::findOrFail($profiles[$role]['user_id']);Auth::guard('web')->setUser($u);$r=Illuminate\Http\Request::create('/api/workshop-billing','POST');$r->attributes->set('sgf_module',$module);$r->setUserResolver(fn()=>$u);$session=app('session')->driver();$session->start();$session->put('company_context',$f['scope']+['module_id'=>$module,'token'=>'wb-'.$role]);$r->setLaravelSession($session);$app->instance('request',$r);app(CompanyContext::class)->selectFor($u->id,1,2,2);return $u->id;};
|
|
$host->beginTransaction();try{
|
|
$w=app(WorkshopBilling::class);$preparer=$select('finance_prepare');$listing=$w->listing($preparer);$ok(in_array($commercial['service'],array_column($listing['services'],'id'),true),'workshop pricing reads authorised Commercial services without legacy module reassignment');
|
|
$data=['version'=>1,'previous_id'=>null,'client_id'=>$commercial['client'],'currency'=>'MZN','evidence'=>'Preços de venda QA independentes do custo interno295.','lines'=>[['entry_id'=>$direct['time'],'entry_version'=>1,'service_id'=>$commercial['service'],'service_version'=>1,'price'=>'200','price_source'=>'QA-PRECO-OFICINA-v1'],['entry_id'=>$direct['material'],'entry_version'=>1,'service_id'=>$commercial['service'],'service_version'=>1,'price'=>'75','price_source'=>'QA-PRECO-OFICINA-v1']]];
|
|
$command=$key();$proposal=$w->prepare($direct['order'],$preparer,$data,$command);$again=$w->prepare($direct['order'],$preparer,$data,$command);$ok($proposal['id']===$again['id'],'commercial proposal repeats without a second version');
|
|
$bad=false;try{$w->generate($direct['order'],$preparer,['id'=>$proposal['id'],'version'=>1],$key());}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $e){$bad=$e->getStatusCode()===409;}$ok($bad,'unreviewed commercial origins cannot generate a billing draft');
|
|
$reviewer=$select('finance_review');$w->review($direct['order'],$reviewer,['id'=>$proposal['id'],'version'=>1,'decision'=>'approved','reason'=>'Preços200/H e75/UN seleccionados e conferidos por outra pessoa.'],$key());
|
|
$select('finance_prepare');$command=$key();$generated=$w->generate($direct['order'],$preparer,['id'=>$proposal['id'],'version'=>1],$command);$again=$w->generate($direct['order'],$preparer,['id'=>$proposal['id'],'version'=>1],$command);$ok($generated['id']===$again['id']&&$generated['base_exact']==='500','reviewed105min and2UN produce one Commercial draft500; cost does not dictate price');
|
|
$ok(request()->attributes->get('sgf_module')==='workshop'&&request()->session()->get('company_context.module_id')==='workshop','server restores workshop context after explicit creation of Commercial destination records');
|
|
$select('finance_prepare','commercial');$ok(ModuleRecords::query('a_service_drafts')->where('id',$generated['service_draft_id'])->exists()&&ModuleRecords::query('a_billing_drafts')->where('id',$generated['billing_draft_id'])->exists(),'both newly created destination records are immediately accessible in chosen Commercial module');
|
|
$ok($host->table('wb_claims')->where('generation_id',$generated['id'])->count()===2,'each workshop origin claimed once, no implicit invoice or receivable');
|
|
$ok($host->table('si_invoices')->count()===1,'generating a Commercial draft does not issue another document automatically');
|
|
}finally{while($host->transactionLevel()>0)$host->rollBack();}
|
|
file_put_contents($work.'/workshop-commercial-result.json',json_encode(['passed'=>true,'checks'=>$checks,'proof_changes_rolled_back'=>true,'new_associations_only_at_destination_creation'=>true,'browser_visual_review'=>false],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/workshop-commercial-result.json']).PHP_EOL;
|