Files
SGF/scripts/service-fiscal-fixture.php

36 lines
3.9 KiB
PHP

<?php
// Synthetic, isolated browser proof. Never creates a Tempo account/profile/operation.
use App\Modules\Services\ServiceFiscal;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
require __DIR__.'/../vendor/autoload.php';
$app=require __DIR__.'/../bootstrap/app.php';
$app->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap();
\App\Shared\Testing\TestingDatabaseGuard::assertSafe();
abort_unless(\App\Modules\Services\ServiceCalculation::isolated(),403);
$file='C:/laragon/data/sgf-tempo/secrets/browser-fixture.json';
$f=json_decode(file_get_contents($file),true,32,JSON_THROW_ON_ERROR);
abort_if(DB::table('a_services')->exists() || DB::table('sf_proposals')->exists(),409,'Fixture não vazia; nenhum dado apagado.');
$result=DB::transaction(function() use($f) {
foreach(['manager_id'=>['view','propose'],'reader_id'=>['view','approve']] as $who=>$actions) foreach($actions as $action) \Tests\Support\IdentityFixture::grant($f[$who],$f['tenant'],$f['company'],'service_fiscal.'.$action);
\Tests\Support\IdentityFixture::grant($f['manager_id'],$f['tenant'],$f['company'],'service_fiscal.calculate',$f['unit']);
$context=app(\App\Shared\Context\CompanyContext::class);
$select=function($actor) use($context,$f) { $context->selectFor($actor,$f['tenant'],$f['company'],$f['unit']); };
$select($f['manager_id']); $w=app(\App\Modules\Services\ServiceWorkflow::class); $actor=$f['manager_id'];
$client=$w->save('clients',null,$actor,['name'=>'Cliente de prova fiscal'],(string)Str::uuid())['id'];
$service=$w->save('services',null,$actor,['name'=>'Alojamento mensal — PROVA SINTÉTICA'],(string)Str::uuid())['id'];
$source=$w->save('service_drafts',null,$actor,['name'=>'Período de prova fiscal','client_id'=>$client,'currency'=>'MZN','lines'=>[['service_id'=>$service,'quantity'=>'1','unit_price'=>'7850.00']]],(string)Str::uuid())['id'];
$draft=$w->save('billing_drafts',null,$actor,['source_id'=>$source,'name'=>'Prova fiscal condicionada — 7850 sem IVA'],(string)Str::uuid())['id'];
app(\App\Modules\Services\DocumentPreparation::class)->save('billing_drafts',$draft,$actor,['version'=>0,'draft_version'=>1,'currency'=>'MZN','price_mode'=>'added','period_start'=>'2026-10-26','units'=>['PERIODO'],'payment_instruction_ids'=>[]]);
$fiscal=app(ServiceFiscal::class);
$profile=$fiscal->propose($actor,['kind'=>'profile','identifier'=>'PROVA-ALOJAMENTO-16','data'=>['service_id'=>$service,'service_version'=>1,'currency'=>'MZN','price_mode'=>'added','rate_percent'=>'16','valid_from'=>'2026-10-26','treatment'=>'domestic_normal','conditions'=>'EXCLUSIVAMENTE SINTÉTICO — operação interna fictícia.','evidence'=>'Fixture isolada de aceitação; referências da ficha v0.8, sem aplicação à Tempo.']])['id'];
$select($f['reader_id']); $fiscal->decide($profile,$f['reader_id'],['version'=>1,'decision'=>'approved','reason'=>'Validação sintética do perfil exacto.']);
$select($actor);
$temporal=$fiscal->propose($actor,['kind'=>'temporal','identifier'=>'PROVA-PERIODO','data'=>['profile_proposal_id'=>$profile,'draft_id'=>$draft,'draft_version'=>1,'preparation_version'=>1,'reference_date'=>'2026-10-26','reference_basis'=>'Referência contratual explícita para prova; não é exigibilidade.','period_start'=>'2026-10-26','next_billing'=>'2026-11-26','event'=>'pending','evidence'=>'Pendência temporal deliberada; não se presumem fim de cobertura ou emissão.']])['id'];
$select($f['reader_id']); $fiscal->decide($temporal,$f['reader_id'],['version'=>1,'decision'=>'approved','reason'=>'Aprovado resultado condicionado, sem exigibilidade determinada.']);
$fiscal->proofActivation($profile,$f['reader_id'],1,true);
return ['fiscal_draft'=>$draft,'fiscal_profile_proposal'=>$profile,'fiscal_temporal_proposal'=>$temporal];
});
file_put_contents($file,json_encode($f+$result,JSON_THROW_ON_ERROR));
echo "Synthetic fiscal proposals and draft prepared only in sgf_tempo_test; no calculation precomputed.\n";