id; $validator=$f['reader']->id; foreach(['view','propose'] as $a) IdentityFixture::grant($actor,$f['tenant'],$f['company'],'service_fiscal.'.$a); foreach(['view','approve'] as $a) IdentityFixture::grant($validator,$f['tenant'],$f['company'],'service_fiscal.'.$a); IdentityFixture::grant($actor,$f['tenant'],$f['company'],'service_fiscal.calculate',$f['unit']); foreach(['view','propose'] as $a) IdentityFixture::grant($actor,$f['tenant'],$f['company'],'invoice_series.'.$a); foreach(['view','approve'] as $a) IdentityFixture::grant($validator,$f['tenant'],$f['company'],'invoice_series.'.$a); foreach(['view','issue','correction_request'] as $a) IdentityFixture::grant($actor,$f['tenant'],$f['company'],'service_invoices.'.$a,$f['unit']); IdentityFixture::grant($validator,$f['tenant'],$f['company'],'service_invoices.view',$f['unit']); $select=function($id)use($f) { app(CompanyContext::class)->selectFor($id,$f['tenant'],$f['company'],$f['unit']); }; $select($actor); $w=app(ServiceWorkflow::class); $prepare=app(DocumentPreparation::class); $fiscal=app(ServiceFiscal::class); $invoices=app(ServiceInvoicing::class); $client=$w->save('clients',null,$actor,['name'=>'Cliente sintético Horizonte'],(string)Str::uuid())['id']; $service=$w->save('services',null,$actor,['name'=>'Alojamento mensal sintético'],(string)Str::uuid())['id']; $today=now(ServiceInvoicing::ZONE)->format('Y-m-d'); $start=now(ServiceInvoicing::ZONE)->subDays(30)->format('Y-m-d'); $end=now(ServiceInvoicing::ZONE)->subDay()->format('Y-m-d'); $source=$w->save('service_drafts',null,$actor,['name'=>'Prestação SINTÉTICA para emissão de teste','client_id'=>$client,'currency'=>'MZN','lines'=>[['service_id'=>$service,'quantity'=>'1','unit_price'=>'7850.00','description'=>'Serviço fictício para demonstração isolada.']]],(string)Str::uuid())['id']; $draft=$w->save('billing_drafts',null,$actor,['source_id'=>$source,'name'=>'Factura de TESTE — alojamento'],(string)Str::uuid())['id']; $prepare->save('billing_drafts',$draft,$actor,['version'=>0,'draft_version'=>1,'currency'=>'MZN','price_mode'=>'added','period_start'=>$start,'period_end'=>$end,'units'=>['período'],'payment_terms'=>'Condição sintética: vencimento na data de emissão.','proposed_due_date'=>$today,'payment_instruction_ids'=>[]]); foreach(['issuer'=>$f['company'],'client'=>$client] as $kind=>$id) $prepare->save($kind,$id,$actor,['version'=>0,'nuit'=>$kind==='issuer'?'999999991':'999999992','address'=>'Rua de demonstração, 1','locality'=>'Localidade sintética','country'=>'Moçambique']); $profile=$fiscal->propose($actor,['kind'=>'profile','identifier'=>'TEST-PROFILE-HOSTING','data'=>['service_id'=>$service,'service_version'=>1,'currency'=>'MZN','price_mode'=>'added','rate_percent'=>'16','valid_from'=>$start,'treatment'=>'domestic_normal','conditions'=>'Hipótese sintética interna, sem aplicação à empresa real.','evidence'=>'Fixture de teste; pressupostos fictícios, não prova de conformidade.']])['id']; $select($validator); $fiscal->decide($profile,$validator,['version'=>1,'decision'=>'approved','reason'=>'Aprovação sintética do perfil.']); $fiscal->proofActivation($profile,$validator,1,true); $select($actor); $temporal=$fiscal->propose($actor,['kind'=>'temporal','identifier'=>'TEST-CALC-PERIOD','data'=>['profile_proposal_id'=>$profile,'draft_id'=>$draft,'draft_version'=>1,'preparation_version'=>1,'reference_date'=>$start,'reference_basis'=>'Início explícito sintético para vigência, sem exigibilidade determinada.','period_start'=>$start,'period_end'=>$end,'event'=>'pending','evidence'=>'Pendência deliberada para provar que não autoriza emitir.']])['id']; $select($validator); $fiscal->decide($temporal,$validator,['version'=>1,'decision'=>'approved','reason'=>'Somente cálculo condicionado.']); $select($actor); $calculation=$fiscal->calculate($draft,$actor,['profile_proposal_id'=>$profile,'profile_version'=>1,'temporal_proposal_id'=>$temporal,'temporal_version'=>1,'draft_version'=>1,'preparation_version'=>1])['id']; $series=$invoices->propose($actor,['kind'=>'series','identifier'=>'TEST-SERIE-ISOLADA','data'=>['code'=>'TEST-SERIE-ISOLADA','first_number'=>1,'state'=>'open','valid_from'=>$start,'evidence'=>'Série exclusivamente sintética, sem autorização de uso real.']])['id']; $rule=$invoices->propose($actor,['kind'=>'temporal','identifier'=>'TEST-ISSUE-RULE','data'=>['valid_from'=>$start,'draft_id'=>$draft,'draft_version'=>1,'preparation_version'=>1,'profile_proposal_id'=>$profile,'period_start'=>$start,'period_end'=>$end,'issue_window_start'=>$today,'issue_window_end'=>$today,'event'=>'on_issue_within_deadline','readiness_basis'=>'Hipótese sintética: dados documentais, cobertura, representação e tempestividade validados apenas para testar o mecanismo.','evidence'=>'Janela fictícia de emissão validada, não regra legal ou calendário da Tempo.']])['id']; $select($validator); foreach([$series,$rule] as $id) $invoices->decide($id,$validator,['version'=>1,'decision'=>'approved','reason'=>'Validação sintética da versão e pressupostos de teste.']); $select($actor); return $f+compact('client','service','source','draft','profile','temporal','calculation','series','rule','today','start','end'); } public static function additionalDraft(array $f): array { TestingDatabaseGuard::assertSafe(); $actor=$f['manager']->id; $validator=$f['reader']->id; $select=function($id)use($f) { app(CompanyContext::class)->selectFor($id,$f['tenant'],$f['company'],$f['unit']); }; $select($actor); $w=app(ServiceWorkflow::class); $fiscal=app(ServiceFiscal::class); $invoices=app(ServiceInvoicing::class); $source=$w->save('service_drafts',null,$actor,['name'=>'Prestação sintética concorrente','client_id'=>$f['client'],'currency'=>'MZN','lines'=>[['service_id'=>$f['service'],'quantity'=>'1','unit_price'=>'7850.00']]],(string)Str::uuid())['id']; $draft=$w->save('billing_drafts',null,$actor,['source_id'=>$source,'name'=>'Documento sintético concorrente'],(string)Str::uuid())['id']; app(DocumentPreparation::class)->save('billing_drafts',$draft,$actor,['version'=>0,'draft_version'=>1,'currency'=>'MZN','price_mode'=>'added','period_start'=>$f['start'],'period_end'=>$f['end'],'units'=>['período'],'payment_instruction_ids'=>[]]); $temporal=$fiscal->propose($actor,['kind'=>'temporal','identifier'=>'TEST-CALC-'.$draft,'data'=>['profile_proposal_id'=>$f['profile'],'draft_id'=>$draft,'draft_version'=>1,'preparation_version'=>1,'reference_date'=>$f['start'],'reference_basis'=>'Referência explícita sintética.','period_start'=>$f['start'],'period_end'=>$f['end'],'event'=>'pending','evidence'=>'Prova concorrente isolada.']])['id']; $select($validator); $fiscal->decide($temporal,$validator,['version'=>1,'decision'=>'approved','reason'=>'Cálculo sintético condicionado.']); $select($actor); $calculation=$fiscal->calculate($draft,$actor,['profile_proposal_id'=>$f['profile'],'profile_version'=>1,'temporal_proposal_id'=>$temporal,'temporal_version'=>1,'draft_version'=>1,'preparation_version'=>1])['id']; $rule=$invoices->propose($actor,['kind'=>'temporal','identifier'=>'TEST-ISSUE-'.$draft,'data'=>['valid_from'=>$f['start'],'draft_id'=>$draft,'draft_version'=>1,'preparation_version'=>1,'profile_proposal_id'=>$f['profile'],'period_start'=>$f['start'],'period_end'=>$f['end'],'issue_window_start'=>$f['today'],'issue_window_end'=>$f['today'],'event'=>'on_issue_within_deadline','readiness_basis'=>'Pressupostos sintéticos validados para prova de concorrência.','evidence'=>'Prova isolada, sem calendário legal presumido.']])['id']; $select($validator); $invoices->decide($rule,$validator,['version'=>1,'decision'=>'approved','reason'=>'Validação sintética da regra.']); $select($actor); return array_replace($f,compact('source','draft','temporal','calculation','rule')); } }