Files
SGF/scripts/sgf-multiline-invoice-proof-bootstrap.php
T
2026-11-11 15:04:01 +02:00

9 lines
3.8 KiB
PHP

<?php
use Illuminate\Support\Facades\Auth;use Illuminate\Support\Str;use App\Shared\Context\CompanyContext;use App\Modules\Services\{ServiceWorkflow,DocumentPreparation,ServiceInvoicing,MultiLineInvoiceCalculation};
require __DIR__.'/sgf-ledger-proof-bootstrap.php';config(['multiline_invoices.enabled'=>true,'multiline_invoices.schema_sha256'=>hash_file('sha256',$repo.'/database/sql/multiline_invoices.sql'),'multiline_invoices.draft_schema_sha256'=>hash_file('sha256',$repo.'/database/sql/multiline_invoice_drafts.sql'),'sales_ledger.synthetic_enabled'=>true]);config(['fiscal_rules_qa.enabled'=>true,'fiscal_rules_qa.document_enabled'=>true,'fiscal_rules_qa.source_sha256'=>hash_file('sha256',$repo.'/resources/data/fiscal-rule-qa.json')]);
set_exception_handler(function($e){echo json_encode(['passed'=>false,'exception'=>get_class($e),'message'=>$e->getMessage(),'errors'=>$e instanceof Illuminate\Validation\ValidationException?$e->errors():null,'frames'=>array_map(fn($x)=>[basename($x['file']??''),$x['line']??0,$x['function']??''],array_slice($e->getTrace(),0,9))]).PHP_EOL;exit(1);});
$select=function($role,string $module='commercial')use($profiles,$app){$id=is_int($role)?$role:$profiles[$role]['user_id'];Auth::forgetGuards();Auth::shouldUse('web');$u=App\Models\User::findOrFail($id);Auth::guard('web')->setUser($u);$r=Illuminate\Http\Request::create('/api/multiline-invoices','POST');$r->attributes->set('sgf_module',$module);$r->setUserResolver(fn()=>$u);$session=app('session')->driver();$session->start();$session->put('company_context',['tenant_id'=>1,'company_id'=>2,'unit_id'=>2,'module_id'=>$module,'token'=>'multiline-'.$id]);$r->setLaravelSession($session);$app->instance('request',$r);app(CompanyContext::class)->selectFor($id,1,2,2);return$id;};
$inputs=json_decode(file_get_contents($s['root'].'/single-document-inputs.json'),true);$oldDraft=$host->table('a_billing_drafts')->where($f['scope'])->where('id',$inputs['credit_invoice']['draft_id'])->first();if(!$oldDraft)throw new LogicException('Known QA source missing');$client=(int)$oldDraft->client_id;$service=(int)json_decode($oldDraft->data,true)['lines'][0]['service_id'];$rules=$host->table('fr_events')->where($f['scope'])->where('state','reviewed')->where('definition->parameters->rate','0.16')->get();if($rules->count()!==1)throw new LogicException('Expected exact approved artificial16% fixture only');$ruleEvent=(int)$rules[0]->id;
$reject=function($fn,$status,$label)use($ok){$actual=null;try{$r=$fn();$actual=is_array($r)?($r['status']??null):null;}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface$e){$actual=$e->getStatusCode();}catch(Illuminate\Validation\ValidationException){$actual=422;}catch(DomainException){$actual=409;}$ok($actual===$status,$label);};
$fixture=function(string $mode,array $prices,string $suffix='')use($select,$service,$client){$actor=$select('commercial_prepare');$lines=array_map(fn($price)=>['service_id'=>$service,'description'=>'Linha fictícia '.$price,'quantity'=>'1','unit_price'=>$price,'unit'=>'UN'],$prices);$input=['draft_id'=>null,'version'=>0,'source_version'=>0,'preparation_version'=>0,'name'=>'QA-MULTI-'.$mode.'-'.$suffix,'client_id'=>$client,'currency'=>'MZN','price_mode'=>$mode,'service_date'=>'2026-11-11','period_start'=>'2026-11-01','period_end'=>'2026-11-30','proposed_due_date'=>'2026-11-30','payment_terms'=>'Prazo artificial de ensaio, sem afirmação legal.','lines'=>$lines,'reason'=>'Preparação explícita de rascunho multilinha, sem emissão.'];$writer=app(App\Modules\Services\MultiLineDrafts::class);$cut=$writer->preview($actor,$input,(string)Str::uuid());$r=$writer->confirm($actor,$cut['preview']);return ['source'=>['id'=>$r['source_id'],'version'=>$r['source_version']],'draft'=>['id'=>$r['id'],'version'=>$r['version']],'preparation'=>['version'=>$r['preparation_version']]];};