Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
56c0c6a7ca | ||
|
|
74f7f93a75 | ||
|
|
0ff402a11d | ||
|
|
51d536b7ba | ||
|
|
403c444a3e | ||
|
|
a78abf06d0 | ||
|
|
52f54655d2 | ||
|
|
4f9450a71d | ||
|
|
1afab4a2a7 | ||
|
|
3439f35038 | ||
|
|
c85e772d2f | ||
|
|
1436074819 | ||
|
|
11a6cee981 | ||
|
|
d5f11462e9 | ||
|
|
f8d57bddf9 | ||
|
|
ea2bceb5ce | ||
|
|
245549f9e8 | ||
|
|
a7434cd27c | ||
|
|
71551deb73 | ||
|
|
f33d99b4d5 | ||
|
|
632dc06930 | ||
|
|
ff84ab648f | ||
|
|
992c97ad4e | ||
|
|
ae0d74bb3a | ||
|
|
894ca4ec69 | ||
|
|
ba83afe7d8 | ||
|
|
4da7a16a50 | ||
|
|
eccd95f9e7 | ||
|
|
0bd5d49550 | ||
|
|
aed020d19e | ||
|
|
1649710cf7 | ||
|
|
e07f89da3d | ||
|
|
ab2ff2fdbc | ||
|
|
a2122dc34c | ||
|
|
d37fffb2d2 | ||
|
|
45fd591c7f | ||
|
|
17d633c99c | ||
|
|
5aaf1a56f9 | ||
|
|
2116f66b2b | ||
|
|
8f1ab24b22 | ||
|
|
56475acb2f | ||
|
|
0effdc9fcb | ||
|
|
e9fe102259 | ||
|
|
44d0858cee | ||
|
|
043dd35d8e | ||
|
|
f400e56a5b |
@@ -147,7 +147,7 @@ class OpportunityManagementController extends Controller
|
||||
Inertia::share('publicationPreview', app(OpportunityCanonicalContract::class)->publicProjection($values['canonical'] ?? []));
|
||||
$classification = $id ? DB::table('audit_events')->where('source_system', 'opportunity-origin-review')->where('after_data->opportunity_id', $id)->orderByDesc('occurred_at')->orderByDesc('id')->value('after_data') : null;
|
||||
|
||||
return Inertia::render('management/opportunity-draft', ['resourcesInstalled' => app(OpportunityResources::class)->installed(), 'record' => $record, 'values' => $values, 'etag' => $record ? $service->etag($record) : null, 'readOnly' => str_ends_with($request->path(), '/view') || ($record && ! $access->canEdit($request->user(), $record)), 'closedVersion' => $record ? $service->closed($record) : false, 'classification' => $classification ? json_decode($classification, true)['classification'] : 'undetermined', 'sectors' => Sector::choices()->orderBy('name')->get(['id', 'name', 'slug']), 'categories' => OpportunityManagement::CATEGORIES,
|
||||
return Inertia::render('management/opportunity-draft', ['proactiveHistory' => app(\App\Services\ProactiveInvestment::class)->history($record), 'proactiveOptions' => app(\App\Services\ProactiveInvestment::class)->options($record), 'resourcesInstalled' => app(OpportunityResources::class)->installed(), 'record' => $record, 'values' => $values, 'etag' => $record ? $service->etag($record) : null, 'readOnly' => str_ends_with($request->path(), '/view') || ($record && ! $access->canEdit($request->user(), $record)), 'closedVersion' => $record ? $service->closed($record) : false, 'classification' => $classification ? json_decode($classification, true)['classification'] : 'undetermined', 'sectors' => Sector::choices()->orderBy('name')->get(['id', 'name', 'slug']), 'categories' => OpportunityManagement::CATEGORIES,
|
||||
'maturityCatalogue' => ['version' => OpportunityMaturity::VERSION, 'stages' => OpportunityMaturity::STAGES, 'legacyVersion' => OpportunityMaturity::LEGACY, 'legacyLabels' => OpportunityMaturity::LEGACY_LABELS],
|
||||
'territoryPath' => app(InvestmentGeography::class)->path($values['primary_territory_id'] ?? null, true),
|
||||
'history' => $id ? DB::table('audit_events')->where('source_system', 'opportunity-management')->where('after_data->record_id', $id)->orderByDesc('occurred_at')->get(['id', 'action', 'actor_user_id', 'occurred_at']) : []]);
|
||||
|
||||
@@ -71,6 +71,7 @@ class PortalServicesController extends Controller
|
||||
$props = ['section' => $page, 'filters' => $filters, 'countries' => app(CountryCatalogue::class)->all()];
|
||||
if ($page === 'sectors') {
|
||||
$props['sectors'] = \App\Services\SectorOrganization::catalog();
|
||||
$props['sectorDetails'] = $props['sectors']->map(fn (Sector $sector) => app(\App\Services\SectorInvestment::class)->page($sector))->values();
|
||||
}
|
||||
if (in_array($page, ['documents', 'legislation'], true)) {
|
||||
$query = $this->resources();
|
||||
|
||||
@@ -25,9 +25,7 @@ class PublicPortalController extends Controller
|
||||
if ($slug === 'mercado-financeiro/fintech') $slug = 'fintech';
|
||||
$sector = Sector::where('slug', $slug)->where('is_active', true)->whereNotNull('published_at')->firstOrFail();
|
||||
|
||||
return Inertia::render('portal/services', ['section' => 'sector', 'sector' => $sector->only(['id', 'name', 'slug', 'description', 'short_description']),
|
||||
'sectorEntry' => array_key_exists($sector->slug, SectorInvestment::CONTENT) ? app(SectorInvestment::class)->publicView($sector) : null,
|
||||
'opportunities' => \App\Services\SectorOrganization::opportunities($sector)->latest('published_at')->limit(12)->get(['id', 'title', 'slug', 'province', 'summary'])]);
|
||||
return Inertia::render('portal/services', ['section' => 'sector', ...app(SectorInvestment::class)->page($sector)]);
|
||||
}
|
||||
|
||||
public function opportunity(string $slug): Response
|
||||
|
||||
@@ -35,6 +35,7 @@ class Opportunity extends Model
|
||||
{
|
||||
$data = parent::toArray();
|
||||
if (isset($data['description'])) $data['description'] = \App\Services\OpportunityPublicText::description($this, $data['description']);
|
||||
if ($this->exists && ($proactive = app(\App\Services\ProactiveInvestment::class)->publicData($this))) $data['proactive'] = $proactive;
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ class InvestmentCatalogue
|
||||
/** @return array<string,mixed> */
|
||||
public function filters(Request $request): array
|
||||
{
|
||||
$filters = $request->validate(['q' => ['nullable', 'string', 'max:120'], 'sector' => ['nullable', 'string', 'max:80'],
|
||||
$filters = $request->validate(['perspective' => ['nullable', 'in:exists,needs,ideas,opportunities'],'q' => ['nullable', 'string', 'max:120'], 'sector' => ['nullable', 'string', 'max:80'],
|
||||
'preparation' => ['nullable', \Illuminate\Validation\Rule::in(array_column(OpportunityMaturity::searchOptions(), 'value'))],
|
||||
'opportunity_id' => ['nullable', 'integer', 'min:1'],
|
||||
'province_id' => ['nullable', 'uuid'], 'district_id' => ['nullable', 'uuid'], 'admin_post_id' => ['nullable', 'uuid'], 'locality_id' => ['nullable', 'uuid'],
|
||||
@@ -63,6 +63,8 @@ class InvestmentCatalogue
|
||||
public function query(array $filters): Builder
|
||||
{
|
||||
$query = Opportunity::published()->with('sector:id,name,slug');
|
||||
if (in_array($filters['perspective'] ?? '', ['exists','needs','ideas'], true)) $query->where('workflow_context->promotional_summary->projection->proactive->group', $filters['perspective']);
|
||||
elseif (($filters['perspective'] ?? '') === 'opportunities') $query->whereNull('workflow_context->promotional_summary->projection->proactive');
|
||||
$associated = $this->publicAssociatedIds($filters);
|
||||
if (($filters['territory_basis'] ?? 'all') === 'direct') {
|
||||
$query->where(fn ($q) => $q->whereNotNull('opportunities.primary_territory_id')->orWhereExists(fn ($l) => $l->selectRaw('1')->from('opportunity_locations')->whereColumn('opportunity_id', 'opportunities.id')));
|
||||
|
||||
@@ -46,6 +46,10 @@ final class InvestmentComplements
|
||||
} else {
|
||||
$reference = app(InvestorContext::class)->reference($origin);
|
||||
abort_unless($reference['kind'] === 'opportunity', 422);
|
||||
// The context resolver has already checked the actor's private scope.
|
||||
// A private preparation is valid dossier input, not a public offer
|
||||
// from which this public-complement catalogue can infer services.
|
||||
if (($reference['visibility'] ?? 'public') === 'private') return [];
|
||||
$principal = Opportunity::published()->findOrFail($reference['id']);
|
||||
$text = $principal->summary;
|
||||
$basis = 'Resumo cadastrado da oportunidade '.$principal->reference;
|
||||
|
||||
@@ -159,6 +159,8 @@ final class InvestorContext
|
||||
$fields['sector_id'] = (string) $o->sector_id;
|
||||
$fields['sector'] = $o->sector->name;
|
||||
}
|
||||
$proactive = $published ? app(ProactiveInvestment::class)->publicData($o) : ($draft['proactive'] ?? null);
|
||||
if ($proactive) $zoneAnalysis = ['proactive' => $proactive, 'source_key' => $key, 'source_version' => $version, 'private_source' => !$published];
|
||||
// Text labels do not establish a canonical territorial correspondence.
|
||||
if ($o->province) {
|
||||
$fields['province'] = $o->province;
|
||||
|
||||
@@ -21,7 +21,7 @@ class OpportunityManagement
|
||||
|
||||
public const MATURITY_FIELDS = ['maturity_level', 'maturity_label', 'maturity_stage', 'maturity_catalogue_version'];
|
||||
|
||||
public const PRIVATE_DRAFT_FIELDS = [...self::MATURITY_FIELDS, 'real_estate', 'canonical'];
|
||||
public const PRIVATE_DRAFT_FIELDS = [...self::MATURITY_FIELDS, 'real_estate', 'canonical', 'proactive'];
|
||||
|
||||
/** @return array<string,mixed> */
|
||||
public function values(Opportunity $record): array
|
||||
@@ -63,7 +63,7 @@ class OpportunityManagement
|
||||
abort_if(array_key_exists('organization_id', $input) && $input['organization_id'] !== $existingRecord->organization_id, 403, 'A organização não pode ser alterada por edição.');
|
||||
}
|
||||
} elseif ($profileCreation) {
|
||||
abort_unless($access->canCreate($actor, $input['organization_id'] ?? null, $input['opportunity_category'] ?? ''), 403);
|
||||
abort_unless(($access->canCreate($actor, $input['organization_id'] ?? null, $input['opportunity_category'] ?? '') || (isset($input['proactive']) && empty($input['organization_id']) && !$access->has($actor, 'auditor') && $access->internalAssignment($actor, $input['opportunity_category'] ?? '') !== null)), 403);
|
||||
} else {
|
||||
abort_unless($access->legacyWriteAllowed($actor), 403, 'O papel v1 não usa a criação legada para contornar o seu âmbito.');
|
||||
}
|
||||
@@ -92,6 +92,7 @@ class OpportunityManagement
|
||||
'opportunity_category' => ['nullable', Rule::in(self::CATEGORIES)],
|
||||
'real_estate' => ['sometimes', 'array'],
|
||||
'canonical' => ['sometimes', 'array'],
|
||||
'proactive' => ['sometimes', 'array'],
|
||||
'estimated_investment_amount' => ['nullable', 'regex:/^\d{1,16}(\.\d{1,2})?$/'],
|
||||
'estimated_investment_currency' => ['nullable', 'in:MZN,USD,EUR,ZAR'],
|
||||
'reason' => ['required', 'string', 'min:20', 'max:1000'],
|
||||
@@ -127,6 +128,7 @@ class OpportunityManagement
|
||||
$this->check($record, $data['etag']);
|
||||
abort_if($record->trashed() || $record->status === 'archived', 409, 'Restaure antes de editar.');
|
||||
}
|
||||
if (array_key_exists('proactive', $data)) $data['proactive'] = app(ProactiveInvestment::class)->draft($data['proactive'], $record);
|
||||
$before = $record->getAttributes();
|
||||
$previousCanonical = $record->exists ? ($this->values($record)['canonical'] ?? []) : [];
|
||||
$changes = array_intersect_key($data, array_flip([...self::FIELDS, ...self::PRIVATE_DRAFT_FIELDS]));
|
||||
@@ -170,7 +172,7 @@ class OpportunityManagement
|
||||
$record->management_version = 1;
|
||||
$record->estimated_investment_currency = null;
|
||||
if ($profileCreation) {
|
||||
abort_unless($access->canCreate($actor, $data['organization_id'] ?? null, $data['opportunity_category'] ?? ''), 403);
|
||||
abort_unless(($access->canCreate($actor, $data['organization_id'] ?? null, $data['opportunity_category'] ?? '') || (isset($data['proactive']) && empty($data['organization_id']) && !$access->has($actor, 'auditor') && $access->internalAssignment($actor, $data['opportunity_category'] ?? '') !== null)), 403);
|
||||
$record->owner_user_id = $actor->id;
|
||||
$record->organization_id = $data['organization_id'] ?? null;
|
||||
$record->workflow_context = ['policy_version' => PortalProfileAccess::VERSION, 'contributors' => [$actor->id]];
|
||||
@@ -187,12 +189,12 @@ class OpportunityManagement
|
||||
$record->management_draft = json_encode([...$previous, ...$changes], JSON_THROW_ON_ERROR);
|
||||
} else {
|
||||
foreach ($changes as $key => $value) {
|
||||
if (in_array($key, ['real_estate', 'canonical', 'maturity_stage', 'maturity_catalogue_version'], true) || (($changes['maturity_catalogue_version'] ?? null) === OpportunityMaturity::VERSION && in_array($key, ['maturity_level', 'maturity_label'], true))) {
|
||||
if (in_array($key, ['real_estate', 'canonical', 'proactive', 'maturity_stage', 'maturity_catalogue_version'], true) || (($changes['maturity_catalogue_version'] ?? null) === OpportunityMaturity::VERSION && in_array($key, ['maturity_level', 'maturity_label'], true))) {
|
||||
continue;
|
||||
}
|
||||
$record->{$key} = $value;
|
||||
}
|
||||
if (isset($changes['maturity_catalogue_version']) || array_key_exists('real_estate', $changes) || array_key_exists('canonical', $changes)) {
|
||||
if (isset($changes['maturity_catalogue_version']) || array_key_exists('real_estate', $changes) || array_key_exists('canonical', $changes) || array_key_exists('proactive', $changes)) {
|
||||
// The existing draft JSON holds the versioned catalogue; legacy columns stay intact.
|
||||
$previous = $record->management_draft ? json_decode($record->management_draft, true, 512, JSON_THROW_ON_ERROR) : [];
|
||||
$record->management_draft = json_encode([...$previous, ...array_intersect_key($changes, array_flip(self::PRIVATE_DRAFT_FIELDS))], JSON_THROW_ON_ERROR);
|
||||
@@ -225,6 +227,7 @@ class OpportunityManagement
|
||||
$record = Opportunity::withTrashed()->whereKey($id)->lockForUpdate()->firstOrFail();
|
||||
abort_if($record->owner_user_id !== null, 403, 'A v1 exige pedido e decisão de arquivo; não concede exclusão ou restauro ao Promotor.');
|
||||
$this->check($record, $data['etag']);
|
||||
if (array_key_exists('proactive', $data)) $data['proactive'] = app(ProactiveInvestment::class)->draft($data['proactive'], $record);
|
||||
$before = $record->getAttributes();
|
||||
if ($data['action'] === 'restore') {
|
||||
abort_unless($record->trashed() || $record->status === 'archived', 409, 'Registo não está eliminado/arquivado.');
|
||||
|
||||
@@ -48,7 +48,7 @@ final class OpportunityPromotion
|
||||
'limitations' => '', 'territory_ids' => $existing ? DB::table('opportunity_locations')->where('opportunity_id', $record->id)->pluck('geo_location_id')->all() : [],
|
||||
'sector_id' => $record->sector_id];
|
||||
return ['record' => ['id' => $record->id, 'reference' => $record->reference], 'etag' => app(OpportunityManagement::class)->etag($record),
|
||||
'initial' => $form, 'publicNow' => $existing && $record->status === 'published',
|
||||
'proactiveRelations' => app(ProactiveInvestment::class)->publicationRelations($record), 'proactiveKind' => app(OpportunityManagement::class)->values($record)['proactive']['kind'] ?? null, 'proactiveEnabled' => isset(app(OpportunityManagement::class)->values($record)['proactive']), 'proactiveEvidence' => array_values(array_filter(app(OpportunityManagement::class)->values($record)['proactive']['evidence'] ?? [], fn ($e) => $e['access'] === 'public')), 'proactiveOptions' => app(ProactiveInvestment::class)->options(), 'initial' => [...$form, ...($saved['input']['proactive_public'] ?? null ? ['proactive_public' => $saved['input']['proactive_public']] : [])], 'publicNow' => $existing && $record->status === 'published',
|
||||
'reauthenticationRequired' => ! app(PortalProfileAccess::class)->mfa($actor),
|
||||
'sectors' => \App\Models\Sector::catalog()->orderBy('name')->get(['id', 'name']),
|
||||
'territories' => app(InvestmentGeography::class)->publicReferences()->orderBy('name')->get(['id', 'name', 'location_type']),
|
||||
@@ -63,6 +63,7 @@ final class OpportunityPromotion
|
||||
'title' => 'required_if:action,disclose|nullable|string|max:255', 'summary' => 'required_if:action,disclose|nullable|string|max:499',
|
||||
'description' => 'nullable|string|max:6000', 'limitations' => 'nullable|string|max:2500',
|
||||
'source_reference' => 'nullable|string|max:2000', 'edition' => 'nullable|string|max:150', 'source_date' => 'nullable|date_format:Y-m-d',
|
||||
'proactive_public' => 'sometimes|array', 'proactive_reviewed' => 'sometimes|boolean',
|
||||
'sector_id' => ['nullable', 'integer', Rule::in(\App\Models\Sector::catalog()->pluck('id')->all())],
|
||||
'territory_ids' => 'sometimes|array|max:30', 'territory_ids.*' => 'required|uuid|distinct',
|
||||
])->validate();
|
||||
@@ -83,6 +84,7 @@ final class OpportunityPromotion
|
||||
$projection = ['title' => $text('title'), 'summary' => $text('summary'), 'description' => $body,
|
||||
'sector_id' => $data['sector_id'] ?? null, 'maturity_label' => 'Em preparação', 'notice' => self::NOTICE,
|
||||
'territories' => array_map(fn ($p) => ['id' => end($p)->id, 'label' => implode(' / ', array_column($p, 'name'))], $paths)];
|
||||
if ($data['action'] === 'disclose' && ($proactive = app(ProactiveInvestment::class)->publication($record, $data))) { $projection['proactive'] = $proactive; $projection['description'] .= "\n\n".implode("\n", [$proactive['group'] === 'ideas' ? 'Ideia em preparação' : ($proactive['group'] === 'needs' ? 'Necessidade — '.$proactive['state'] : 'O que existe'), 'Necessidade: '.$proactive['need'], 'Proposta: '.$proactive['proposal'], 'Fundamento: '.$proactive['basis'], 'Limitações: '.$proactive['limitations'], 'Próximo passo: '.$proactive['next_action'], ProactiveInvestment::NOTICE]); }
|
||||
if ($data['action'] === 'disclose') abort_unless($projection['title'] !== '' && $projection['summary'] !== '', 422, 'Indique título e resumo em texto simples.');
|
||||
if ($data['action'] === 'withdraw') $projection = [...$projection, ...$record->only(['title', 'summary', 'description', 'sector_id', 'maturity_label'])];
|
||||
$payload = ['actor_id' => $actor->id, 'record_id' => $record->id, 'etag' => $data['etag'], 'action' => $data['action'],
|
||||
|
||||
@@ -245,7 +245,9 @@ class PortalProfileAccess
|
||||
|
||||
return $this->canView($actor, $record) && $this->promoterRecordScope($actor, $record) && ! $record->trashed()
|
||||
&& in_array($this->state($record), ['draft', 'needs_information'], true)
|
||||
&& $this->scoped($actor, 'promoter', $record->organization_id, $newType ?? $record->opportunity_category)
|
||||
&& ($this->scoped($actor, 'promoter', $record->organization_id, $newType ?? $record->opportunity_category)
|
||||
|| ($record->organization_id === null && isset(app(OpportunityManagement::class)->values($record)['proactive'])
|
||||
&& $this->internalAssignment($actor, $newType ?? $record->opportunity_category) !== null))
|
||||
&& $this->operational($actor, 'edit', $record->id);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\Opportunity;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
|
||||
/** Analysis in the existing opportunity draft; publication and private preparation remain separate. */
|
||||
final class ProactiveInvestment
|
||||
{
|
||||
public const VERSION = 1;
|
||||
public const NOTICE = 'A ausência de registo não comprova ausência de oferta. Proximidade não comprova contrato, participação, energia acessível, terra disponível ou benefício fiscal. Necessidade confirmada não comprova viabilidade comercial; hipótese de fornecimento não é encomenda.';
|
||||
public const GROUPS = ['exists' => 'O que existe', 'needs' => 'Necessidades identificadas', 'ideas' => 'Ideias de investimento'];
|
||||
|
||||
public function draft(array $input, ?Opportunity $record = null): array
|
||||
{
|
||||
$d = Validator::make(['proactive' => $input], [
|
||||
'proactive' => 'required|array:version,kind,evidence,need,idea,relations', 'proactive.version' => 'required|integer|in:1',
|
||||
'proactive.kind' => 'required|in:exists,needs,ideas', 'proactive.evidence' => 'present|array|max:60',
|
||||
'proactive.evidence.*' => 'array:id,category,purpose,statement,interpretation,source,locator,period,scope,coverage,verified_on,access,document_id',
|
||||
'proactive.evidence.*.id' => 'required|uuid|distinct',
|
||||
'proactive.evidence.*.category' => 'required|in:activity,resource,infrastructure,supply,demand',
|
||||
'proactive.evidence.*.purpose' => 'required|in:local,methodology',
|
||||
'proactive.evidence.*.access' => 'required|in:internal,public',
|
||||
'proactive.evidence.*.document_id' => 'nullable|uuid',
|
||||
'proactive.evidence.*.verified_on' => 'nullable|date_format:Y-m-d|before_or_equal:today',
|
||||
...collect(['statement','interpretation','source','locator','period','scope','coverage'])->mapWithKeys(fn ($k) => ['proactive.evidence.*.'.$k => 'present|nullable|string|max:4000'])->all(),
|
||||
'proactive.need' => 'required|array:state,problem,observed_supply,observed_demand,type,clients,evidence_ids,limitations,missing,confirmation',
|
||||
'proactive.need.state' => 'required|in:hypothesis,confirmed',
|
||||
'proactive.need.type' => 'nullable|in:quantity,quality,logistics,processing,coordination,support',
|
||||
...collect(['problem','observed_supply','observed_demand','clients','limitations','missing','confirmation'])->mapWithKeys(fn ($k) => ['proactive.need.'.$k => 'present|nullable|string|max:6000'])->all(),
|
||||
'proactive.need.evidence_ids' => 'present|array|max:60', 'proactive.need.evidence_ids.*' => 'uuid|distinct',
|
||||
'proactive.idea' => 'required|array:solution,activity,chain_id,stage,coverage,mode,resources,assumptions,conditions,pending,next_action',
|
||||
'proactive.idea.chain_id' => ['nullable','uuid',Rule::exists('value_chains','id')->whereNull('deleted_at')],
|
||||
'proactive.idea.mode' => 'nullable|in:create,expand,associate',
|
||||
...collect(['solution','activity','stage','coverage','resources','assumptions','conditions','pending','next_action'])->mapWithKeys(fn ($k) => ['proactive.idea.'.$k => 'present|nullable|string|max:6000'])->all(),
|
||||
'proactive.relations' => 'present|array|max:40',
|
||||
'proactive.relations.*' => 'array:id,kind,target_id,relation,reference,evidence_ids',
|
||||
'proactive.relations.*.id' => 'required|uuid|distinct',
|
||||
'proactive.relations.*.kind' => 'required|in:project,cluster,corridor,park,chain',
|
||||
'proactive.relations.*.target_id' => 'required|uuid',
|
||||
'proactive.relations.*.relation' => 'required|in:documented,hypothesis,proximity',
|
||||
'proactive.relations.*.reference' => 'required|string|max:4000',
|
||||
'proactive.relations.*.evidence_ids' => 'present|array|max:60', 'proactive.relations.*.evidence_ids.*' => 'uuid|distinct',
|
||||
])->validate()['proactive'];
|
||||
$ids = array_column($d['evidence'], 'id');
|
||||
foreach ([$d['need'], ...$d['relations']] as $row) {
|
||||
if (array_diff($row['evidence_ids'], $ids)) $this->fail('evidence', 'Seleccione apenas evidências desta análise.');
|
||||
}
|
||||
$seen = [];
|
||||
foreach ($d['evidence'] as $e) {
|
||||
$key = mb_strtolower(trim(($e['source'] ?? '').'|'.($e['locator'] ?? '').'|'.($e['statement'] ?? '')));
|
||||
if (trim($key, '| ') !== '' && isset($seen[$key])) $this->fail('evidence', 'A mesma evidência já foi registada; edite a entrada existente.');
|
||||
$seen[$key] = true;
|
||||
if (! empty($e['document_id'])) $this->document($record, $e['document_id'], $e['access'] === 'public');
|
||||
}
|
||||
$seen = [];
|
||||
foreach ($d['relations'] as $row) {
|
||||
$target = app(OpportunityClassification::class)->targets($row['kind'])->where('id', $row['target_id'])->exists();
|
||||
if (! $target) $this->fail('relations', 'Referência existente indisponível; não foi criada outra empresa, zona ou estrutura.');
|
||||
$key = $row['kind'].'|'.$row['target_id'];
|
||||
if (isset($seen[$key])) $this->fail('relations', 'A referência já está nesta análise; reúna o fundamento na entrada existente.');
|
||||
$seen[$key] = true;
|
||||
if ($row['relation'] === 'documented' && ! $row['evidence_ids']) $this->fail('relations', 'Relação documentada exige evidência seleccionada; mantenha hipótese ou proximidade quando não demonstrada.');
|
||||
}
|
||||
if ($d['kind'] !== 'exists' && $d['need']['state'] === 'confirmed') {
|
||||
foreach (['problem','observed_supply','observed_demand','type','clients','confirmation'] as $field) {
|
||||
if (trim($d['need'][$field] ?? '') === '') $this->fail('need.'.$field, 'Confirmação exige observação e fundamento concretos; pode guardar como hipótese.');
|
||||
}
|
||||
if (! $d['need']['evidence_ids']) $this->fail('need.evidence_ids', 'Uma hipótese não é confirmada sem evidência seleccionada.');
|
||||
foreach ($d['evidence'] as $e) {
|
||||
if (! in_array($e['id'], $d['need']['evidence_ids'], true)) continue;
|
||||
if ($e['purpose'] !== 'local') $this->fail('need.evidence_ids', 'Uma referência metodológica internacional não confirma oferta ou procura local. Preserve a hipótese e recolha evidência local.');
|
||||
foreach (['statement','source','locator','period','scope','coverage','verified_on'] as $field) {
|
||||
if (trim($e[$field] ?? '') === '') $this->fail('evidence', 'Evidência da necessidade confirmada: faltam facto, fonte, localizador, período, abrangência, cobertura ou data de verificação.');
|
||||
}
|
||||
}
|
||||
}
|
||||
return $d;
|
||||
}
|
||||
|
||||
private function document(?Opportunity $record, string $id, bool $public): void
|
||||
{
|
||||
$row = $record?->exists ? DB::table('opportunity_documents as link')->join('documents as d','d.id','=','link.document_id')
|
||||
->where('link.opportunity_id', $record->id)->where('d.id', $id)->whereNull('link.deleted_at')->first(['d.data_classification','d.status','d.malware_scan_status','d.sha256','d.malware_scanned_sha256','d.rights_status','link.payload','link.deleted_at']) : null;
|
||||
if (! $row) $this->fail('evidence', 'Documento não associado à ficha neste âmbito; reutilize o gestor documental existente.');
|
||||
if ($public && ($row->data_classification !== 'public' || $row->status !== 'active' || $row->malware_scan_status !== 'clean' || $row->sha256 !== $row->malware_scanned_sha256 || $row->rights_status === 'restricted' || data_get(json_decode($row->payload, true), 'visibility') !== 'public')) {
|
||||
$this->fail('evidence', 'Documento interno, restrito ou sem disponibilização pública: preserve a evidência interna, sem a divulgar.');
|
||||
}
|
||||
}
|
||||
|
||||
/** No private field is copied into the public summary automatically. */
|
||||
public function publication(Opportunity $record, array $input): ?array
|
||||
{
|
||||
$private = app(OpportunityManagement::class)->values($record)['proactive'] ?? null;
|
||||
if (! $private) {
|
||||
if (isset($input['proactive_public'])) $this->fail('publication', 'Prepare a análise antes de divulgar esta síntese.');
|
||||
return null;
|
||||
}
|
||||
$d = Validator::make($input, [
|
||||
'proactive_reviewed' => 'required|accepted',
|
||||
'proactive_public' => 'required|array:group,state,need,proposal,basis,limitations,next_action,evidence_ids,chain_id,stage,resources,assumptions,conditions,relation_ids',
|
||||
'proactive_public.group' => 'required|in:exists,needs,ideas',
|
||||
'proactive_public.resources'=>'nullable|string|max:2500', 'proactive_public.assumptions'=>'nullable|string|max:2500', 'proactive_public.conditions'=>'nullable|string|max:2500',
|
||||
'proactive_public.relation_ids'=>'sometimes|array|max:40', 'proactive_public.relation_ids.*'=>'uuid|distinct',
|
||||
'proactive_public.state' => 'required|in:hypothesis,confirmed', 'proactive_public.chain_id' => 'nullable|uuid', 'proactive_public.stage' => 'nullable|string|max:1000',
|
||||
'proactive_public.need'=>'required_unless:proactive_public.group,exists|nullable|string|max:2500', 'proactive_public.proposal'=>'required_if:proactive_public.group,ideas|nullable|string|max:2500',
|
||||
...collect(['basis','limitations','next_action'])->mapWithKeys(fn ($k) => ['proactive_public.'.$k => 'required|string|max:2500'])->all(),
|
||||
'proactive_public.evidence_ids' => 'present|array|max:60', 'proactive_public.evidence_ids.*' => 'uuid|distinct',
|
||||
])->validate()['proactive_public'];
|
||||
$d += ['need'=>'','proposal'=>''];
|
||||
if ($d['group'] !== $private['kind']) $this->fail('publication', 'O grupo público deve corresponder à análise guardada.');
|
||||
$proofs = [];
|
||||
foreach ($d['evidence_ids'] as $id) {
|
||||
$e = collect($private['evidence'])->firstWhere('id', $id);
|
||||
if (! $e || $e['access'] !== 'public') $this->fail('publication', 'Não pode divulgar evidência interna nem a sua fonte indirectamente. Redija uma síntese independente ou seleccione evidência pública autorizada.');
|
||||
if (! empty($e['document_id'])) $this->document($record, $e['document_id'], true);
|
||||
$proofs[] = array_intersect_key($e, array_flip(['id','category','purpose','statement','source','locator','period','scope','coverage','verified_on']));
|
||||
}
|
||||
if ($d['group'] !== 'exists' && $d['state'] === 'confirmed' && ($private['need']['state'] !== 'confirmed' || array_diff($private['need']['evidence_ids'], $d['evidence_ids']))) $this->fail('publication', 'Confirmação pública exige a necessidade confirmada e o fundamento público seleccionado; pode divulgar uma hipótese com limitações explícitas.');
|
||||
if (!empty($d['chain_id']) && !app(OpportunityClassification::class)->targets('chain')->where('id', $d['chain_id'])->exists()) $this->fail('publication', 'Cadeia de valor pública indisponível.');
|
||||
$relations=[];
|
||||
foreach ($d['relation_ids'] ?? [] as $id) {
|
||||
$r=collect($private['relations'])->firstWhere('id',$id);
|
||||
if (!$r || array_diff($r['evidence_ids'],$d['evidence_ids'])) $this->fail('publication','A relação exige o fundamento público seleccionado; nenhuma referência interna é copiada.');
|
||||
$target=app(OpportunityClassification::class)->targets($r['kind'])->where('id',$r['target_id'])->first(['id',OpportunityClassification::TARGETS[$r['kind']][1].' as name']);
|
||||
if (!$target) $this->fail('publication','Referência pública da relação indisponível.');
|
||||
$relations[]=['kind'=>$r['kind'],'target_id'=>$r['target_id'],'label'=>$target->name,'relationship'=>$r['relation'],'evidence_ids'=>$r['evidence_ids'],'basis'=>$d['basis']];
|
||||
}
|
||||
// Catch literal reuse of private statements, interpretations, references and document identities.
|
||||
$publicText = mb_strtolower(implode(' ', [...array_filter($input, 'is_scalar'), ...array_filter($d, 'is_scalar')]));
|
||||
foreach ($private['evidence'] as $e) {
|
||||
if ($e['access'] === 'public') continue;
|
||||
foreach (['statement','interpretation','source','locator','document_id'] as $key) {
|
||||
$value = trim($e[$key] ?? '');
|
||||
if (mb_strlen($value) >= 10 && str_contains($publicText, mb_strtolower($value))) $this->fail('publication', 'O resumo contém informação de evidência interna. Reveja a síntese e a divulgação indirecta antes de publicar.');
|
||||
}
|
||||
}
|
||||
return [...array_map(fn ($v) => is_string($v) ? trim(strip_tags($v)) : $v, $d),
|
||||
'version' => self::VERSION, 'relations'=>$relations, 'evidence' => $proofs, 'notice' => self::NOTICE,
|
||||
'availability_confirmed' => false, 'economic_validation' => false];
|
||||
}
|
||||
|
||||
public function publicData(Opportunity $record): ?array
|
||||
{
|
||||
$p = data_get($record->workflow_context, 'promotional_summary.projection.proactive');
|
||||
return is_array($p) && Opportunity::published()->whereKey($record->id)->exists() ? $p : null;
|
||||
}
|
||||
|
||||
public function publicationRelations(Opportunity $record): array
|
||||
{
|
||||
return collect(app(OpportunityManagement::class)->values($record)['proactive']['relations'] ?? [])->map(function($r){
|
||||
$label=app(OpportunityClassification::class)->targets($r['kind'])->where('id',$r['target_id'])->value(OpportunityClassification::TARGETS[$r['kind']][1]);
|
||||
return $label?['id'=>$r['id'],'label'=>$label,'relationship'=>$r['relation']]:null;
|
||||
})->filter()->values()->all();
|
||||
}
|
||||
|
||||
public function history(?Opportunity $record): array
|
||||
{
|
||||
if (!$record) return [];
|
||||
return DB::table('audit_events')->where('source_system', 'opportunity-management')->where('after_data->record_id', $record->id)->orderByDesc('occurred_at')->orderByRaw("(after_data->>'version')::integer DESC")->limit(30)->get()->map(function ($event) {
|
||||
$entry=json_decode($event->after_data,true);$snapshot=json_decode(Crypt::decryptString($entry['snapshot']),true);
|
||||
$draft=json_decode($snapshot['management_draft'] ?? '{}',true);$need=$draft['proactive']['need'] ?? null;
|
||||
return $need ? ['at'=>$event->occurred_at,'version'=>$entry['version'],'state'=>$need['state'],'problem'=>$need['problem'],'confirmation'=>$need['confirmation'],'evidence_ids'=>$need['evidence_ids']] : null;
|
||||
})->filter()->values()->all();
|
||||
}
|
||||
|
||||
public function options(?Opportunity $record = null): array
|
||||
{
|
||||
return ['documents' => $record ? DB::table('opportunity_documents as l')->join('documents as d','d.id','=','l.document_id')->where('l.opportunity_id',$record->id)->whereNull('l.deleted_at')->whereNull('d.deleted_at')->get(['d.id','d.file_name as title'])->all() : [], 'groups' => self::GROUPS, 'references' => collect(['project','cluster','corridor','park','chain'])->mapWithKeys(fn ($kind) => [$kind => app(OpportunityClassification::class)->targets($kind)->orderBy(OpportunityClassification::TARGETS[$kind][1])->limit(300)->get(['id', OpportunityClassification::TARGETS[$kind][1].' as name'])])->all()];
|
||||
}
|
||||
|
||||
private function fail(string $key, string $message): never
|
||||
{
|
||||
throw ValidationException::withMessages(['proactive.'.$key => $message]);
|
||||
}
|
||||
}
|
||||
@@ -34,6 +34,17 @@ final class SectorInvestment
|
||||
return [...$sector->only(['id', 'name', 'slug']), 'href' => SectorOrganization::href($sector->slug)];
|
||||
}
|
||||
|
||||
/** Public detail shared by the catalogue and the individual sector page. */
|
||||
public function page(Sector $sector): array
|
||||
{
|
||||
return [
|
||||
'sector' => $sector->only(['id', 'name', 'slug', 'description', 'short_description']),
|
||||
'sectorEntry' => $this->publicView($sector),
|
||||
'opportunities' => SectorOrganization::opportunities($sector)->latest('published_at')
|
||||
->limit(12)->get(['id', 'title', 'slug', 'province', 'summary']),
|
||||
];
|
||||
}
|
||||
|
||||
public function publicView(Sector $sector): array
|
||||
{
|
||||
$query = SectorOrganization::opportunities($sector);
|
||||
|
||||
@@ -558,3 +558,848 @@ Actualização de **AUD-SIM-INT02**, na matriz existente. O percurso instalado e
|
||||
**Provas apenas do delta:** 14 testes frontend; API privada1 teste/78 asserções com transacção revertida na base QA127.0.0.1:55441; geração de routes/actions pelo procedimento existente, TypeScript e build; interface real com edição, taxa/categoria incompatível, falta de juros, gravação/recuperação, download e perda corrente; relatórios/dossier construídos a partir dos dados recuperados. Recibo `docs/investmoz/simulations/irpc-l6-compatible-sets-qa-20261025.json`; pacote/bundle em `outputs/irpc-l6-sets`. Sem alteração de schema, API, configuração, permissões ou dependências.
|
||||
|
||||
**Âmbitos próprios preservados:** L7 conserva benefícios, isenções, taxas reduzidas, tributações autónomas e operações especiais; L8 conserva retenções, pagamentos, créditos e saldo final. M22 campo302 não é preenchido só com a parcela normal300, nem os campos309–316 são preenchidos com zeros presumidos. As dez dúvidas deL5 continuam na mesma matriz, sem nova pesquisa e bloqueando apenas dependências efectivas. L6 continua parcial exclusivamente pelas pendências concretas da tabela; nenhum desses pontos reabre o percurso instalado.
|
||||
|
||||
## 25/10/2026 — conjunto L6 a2de7259 entregue pelo Git
|
||||
|
||||
Instalado `a2de725901c308fb2ac2bc3d72181ab50ef46b7a` sobre `2f684e59`, pelo procedimento Git existente, sem força, migrações ou importações. Backup fresco `2026-10-25T20:34:03Z` e restauro isolado sem rede/porta55441: **174tabelas** conferidas por contagem/checksum; **369ficheiros/configuração** preservados. Conferidos **8ficheiros do delta,38protegidos e31originais**; schema,roles/grants e permissões iguais. Tabelas de negócio preservadas; cache/sessões reconciliadas com os eventos operacionais da entrega. `2f684e59` permanece como versão anterior. Dependências de5versões antigas arquivadas e verificadas para espaço, sem modificar as versões actual/anterior, fontes, dados ou backups.
|
||||
|
||||
Revisão/manifest público,10marcadores compilados e simuladorHTTP200 conferidos. Pipeline normal concluído; as provas QA aceites foram reutilizadas, sem nova ronda manual. **Disponível no âmbito demonstrado: lucro6980 → base4680 → colecta1497,60MZN. O saldo final a pagar/recuperar continua indeterminado emL8.** Também preservados o caso de perda corrente e as distinções conhecido/ausência/falta de informação, os períodos/EP demonstrados e a preparação parcialM20/M22. Recibo:`docs/investmoz/simulations/irpc-l6-sets-delivery-20261025.json`.
|
||||
|
||||
O estado «QA sem instalação» da nota anterior é histórico para este conjunto. **L6 continua parcial pelos seis grupos concretos da secção seguinte**, cada um com condição de resolução e bloqueio delimitado. L7 eL8 mantêm os seus âmbitos.
|
||||
|
||||
|
||||
## 25/10/2026 — saldo curto de L6 após o conjunto a2de7259
|
||||
|
||||
Actualização de **AUD-SIM-INT02 na mesma matriz**, sem novo lote ou backlog. O percurso financeiro → ajustamentos documentados → lucro tributável → matéria colectável → colecta está demonstrado; no caso novo,6980 →4680 →1497,60MZN. A colecta não é saldo final a pagar. As pendências abaixo substituem a enumeração genérica anterior para o saldo actual deL6; não revogam as provas aceites.
|
||||
|
||||
| Caso ou correspondência pendente | Condição concreta de resolução | Limite do bloqueio |
|
||||
|---|---|---|
|
||||
| Custos com limites36(1)e/f/h/i/n, provisões28/29, obras plurianuais19 e componentes de exercícios anteriores18(2). | Implementar a regra de cada categoria a partir do diploma aplicável: parcela contabilizada, limite/base próprios, documentação e exercício de imputação; demonstrar o efeito com sinal nos totais. Nos exercícios anteriores, distinguir o que era imprevisível/manifestamente desconhecido no encerramento. | Só a categoria ou parcela ainda sem regra; os acréscimos36a/b/c/g, juros ordinários e periodização corrente/seguinte demonstrados permanecem utilizáveis. Eventual tributação autónoma pertence aL7. |
|
||||
| Amortizações além dos itensII/3/9 e9.1: restantes tabelas, quotas inferiores, duodécimos, quotas decrescentes, bens usados/reavaliados/intangíveis e recuperação de quotas anteriormente tributadas. | Corresponder categoria/tabela prevalecente, método, entrada em uso, vida útil, base depreciável e quotas contabilizadas/fiscais acumuladas; implementar o cálculo e a reconciliação que impeçam dupla dedução. | Só os activos/métodos afectados. Computadores25% e servidores20% no recorte anual constante e a perda corrente já demonstrada não são reabertos. |
|
||||
| Períodos curtos, transição/liquidação e reconciliação fiscal anual de plano noutra moeda. | Ligar os meses e factos de início/cessação/transição ao período fiscal; implementar os efeitos sobre quotas e contagem das perdas. Para outra moeda, identificar os eventos/datas e a regra de conversão anual aplicável, reutilizando o motor cambial aceite. | Só o período ou origem cambial sem reconciliação. Os períodos anuais emMZN e oEP com imputação documentada conservam o cálculo demonstrado. |
|
||||
| Representação fiscal de fracções de unidade/cêntimo. | Identificar a instrução de representação/arredondamento da edição/campo aplicável ou obter esclarecimento específico daAT; então implementar essa regra conservando o valor racional original. O exemplarM20A.1 pede meticais sem centavos, mas isso não determina sozinho como arredondar uma fracção. | Só a transcrição do valor não exactamente representável. Os cálculos racionais e os valores exactamente representáveis permanecem disponíveis; não é necessária nova validação genérica das fontes. |
|
||||
| M20A.1: discriminação de vendas/serviços, fornecimentos/outros gastos, imposto sobre o rendimento e resultado líquido; M22: campo200 e detalhe dos restantes ajustamentos. | Reutilizar a origem financeira, recolhendo apenas a classificação em falta e o imposto contabilizado; reconciliar resultado antes/depois de imposto e cada ajustamento com a edição aplicável. Não usar a colecta simulada como imposto contabilizado. Completar as correspondências por campo e demonstrar a recuperação/exportação. | Só os campos sem correspondência. M20A.1/Q4 contas6.1.1/6.2/6.5/6.9 e M22 campos259/260,269/270,276/277/278 e300 conservam a preparação parcial demonstrada. |
|
||||
| Transporte de resultado entre ediçõesM20/M22: XLSXM20A.1 remete para201/quadro8; PDFM22 inventariado usa200/quadro10. | Identificar a edição do formulário de destino e corresponder explicitamente o resultado líquido a essa edição; registar a remissão corrigida sem substituir os exemplares ou reutilizar fórmulas antigas por aproximação. | Só esse transporte entre edições; não bloqueia os cálculos independentes nem os outros campos já correspondidos. |
|
||||
|
||||
**L6 continua parcial por estes casos concretos.** Documento ou parâmetro em falta dentro de regra implementada é uma pendência do caso, não outra tarefa genérica deL6. Juros capitalizáveis, relações especiais e tratamentos especiais conservam o enquadramento próprio, sem presumir que satisfazem o recorte de juros ordinários.
|
||||
|
||||
**L7** mantém benefícios, isenções, taxas reduzidas, tributações autónomas e operações especiais. **L8** mantém retenções, pagamentos, créditos e saldo final a pagar/recuperar. A ausência desses tratamentos não reabre o percurso normal entregue nem justifica, por si, «L6 parcial». A divergência documental não autoriza preencher M22 campo302 ou309–316 com zeros presumidos. As dez dúvidas deL5 permanecem válidas e bloqueiam apenas os casos efectivamente dependentes; sem nova pesquisa ou repetição das provas aceites.
|
||||
|
||||
## 26/10/2026 — L6: custos com limites, provisões e periodização em QA
|
||||
|
||||
Actualização de **AUD-SIM-INT02 na mesma matriz**, sobre o conjunto instalado `a2de7259`. **Novo incremento em QA, sem instalação.** O percurso e as provas já aceites deL6/L3/ISPC/câmbio/L5 foram reutilizados; não foram novamente executados os testes funcionais anteriores. A fotografia5 continua actual sem activar os novos campos; a fotografia6 guarda estes mapas e conserva o resultado anterior no histórico.
|
||||
|
||||
**Reutilização e resultado demonstrado:** resultado financeiro6240MZN, acréscimos anteriores220 e mapas anteriores520 conservados; novos ajustamentos de custos/provisões/periodização+350 e obra−600 → **lucro tributável6730MZN**. Dedução expressa das perdas anteriores2300 → **matéria colectável4430MZN**; taxa normal32% → **colecta1417,60MZN**. Não é saldo final a pagar. Nenhum saldo oficial de provisões/perdas é consumido, nem é alterada declaração ou história anterior.
|
||||
|
||||
| Categoria e condição no exercício anual com termo em2026 | Parcela aceite, limite e ajustamento demonstrados | Informação insuficiente ou caso separado |
|
||||
|---|---|---|
|
||||
| Ajudas de custo/deslocação em viatura própria36(1)e: parcelas facturadas e tributadas emIRPS identificadas sem sobreposição. Representação36(1)f/36(3) ordinária documentada. | Ajudas100:facturadas20,tributadas e não facturadas20;remanescente60 →30 acrescido/70 aceite. Representação50 →40 acrescido/10 aceite. Zero conhecido nos parâmetros é distinto de campo vazio. | Parcela facturada/tributada em falta impede a aceitação dependente; não presumir ausência deIRPS. Eventual tributação autónoma continuaL7. |
|
||||
| Publicidade ordinária36(1)n,Lei20/2009: receita declarada reconciliada com vendas normais e completude anual das parcelas. | Um limite anual partilhado de1% de12000=120. Caso com duas parcelas100+100:aceites60+60,acréscimo80. A repartição proporcional é apenas aritmética de simulação, não uma ordem fiscal obrigatória. | Campanha de lançamento com horizonte superior a um ano não recebe este tratamento por aproximação: periodização36-A e articulação do limite permanecem por implementar. |
|
||||
| Encargos com viaturas36(4), combustível36i e aluguer sem condutor36h, distinguindo categoria/serviço público/locação na actividade normal. | Outros encargos100 de passageiros sem excepção:aceite50/acréscimo50. Combustível50 não sujeito a36(4),com40 comprovados no activo/locação e consumo normal:aceite40/acréscimo10. Renda100 no caso documentado de excepção36(4),quota não aceite36h de20:aceite80/acréscimo20; a quota é reutilizada do suporte e não apurada automaticamente. | Se há simultaneamente parcela excluída porh/i e aplicação dos50% de36(4), a combinação fica pendente. Exemplo:fuel100,comprovado80,passageiro sem excepção; não somar nem repartir correcções por presunção. Resolver a regra de articulação dos trechos aplicáveis ou esclarecer esse exemplo especificamente comAT. Apuramento automático da quota36h permanece no saldo de amortizações; só bloqueia esse caso. |
|
||||
| Provisão/perda por imparidade de créditos28a/29: regime ordinário identificado, créditos normais finais e provisão fiscal anterior conhecidos. | Base10000:limite anual1,5%=150,acumulado6%=600. Saldo anterior550 deixa50;provisão contabilística200 →50 aceite/150 acrescido. Duas parcelas100+100 partilham25+25; não repetem os limites nem consomem o saldo oficial. | Saldo anterior vazio não é zero; anterior superior ao tecto pede reconciliação/reversão28(2). Provisões sujeitas a supervisão financeira/seguradora28d ou reforços financeiros28(3) exigem correspondência própria, sem aplicar29 por aproximação. |
|
||||
| Existências28b:perda efectivamente observada. Processo judicial28c:em curso e obrigação subjacente fiscalmente dedutível. | Existências:parcela60,perda total40,provisão anterior10 →30 aceite/30 acrescido. Judicial:parcela90,obrigação100,anterior20 →80 aceite/10 acrescido. Perda não observada ou processo que não esteja em curso são condições negativas conhecidas:acréscimo integral, sem zero presumido como dedução. | Falta de prova do evento,obrigação,perda ou saldo anterior fica indeterminada. Objecto/saldo repetido entre documentos impede reutilizar a cobertura; agregar/reconciliar as parcelas do mesmo objecto. |
|
||||
| Reversões28(2) e provisões anteriormente tributadas:mesmo objecto e tratamento fiscal anterior comprovados. | Provisão antes deduzida:reversão50 já incluída no resultado não acrescenta novamente;omitida dos proveitos acrescenta50. Reversão contabilística50 de provisão antes tributada comprovada é excluída por50. | Não inferir o tratamento anterior do saldo contabilístico. Quantia superior à parcela fiscal demonstrada,evento que continua a subsistir ou objecto duplicado ficam pendentes. Sem alteração retrospectiva ou consumo do saldo oficial. |
|
||||
| Componentes de exercícios anteriores18(2):conhecimento/imprevisibilidade no encerramento anterior documentados. | Custo80 conhecido no fecho2025,incluído no resultado actual →acréscimo80. Se imprevisível/manifestamente desconhecido à data daquele fecho →sem acréscimo por periodização. Proveito50 conhecido no fecho anterior →excluído do actual por50;se imprevisível/desconhecido →considerado no actual. | Conhecimento no fecho em falta impede apenas a imputação da parcela. Nenhuma rectificação de declaração anterior é executada. Periodizações específicas18(6–10) não passam a estar cobertas por este recorte18(2). |
|
||||
| Obras plurianuais19 e perdas meramente estimadas36m:critério uniforme,preço,custo incorporado/custo total e acumulados fiscais anteriores documentados. | Percentagem:preço2000,custo total1000,incorrido500;proveito fiscal acumulado1000 menos anterior600=400 corrente;custo500 menos anterior300=200 corrente. Proveito contabilizado1000/custo200 →ajustamento−600. Encerramento tem caso separado;facturação parcial com acabamento correspondente/entregas fraccionadas impõem percentagem;95% com preço conhecido ou recepção provisória pública determina conclusão. Perda meramente estimada50 de obra em curso →acréscimo50. | Acumulados incoerentes ou método incompatível bloqueiam essa obra. Receita antecipada19(5) positiva e mudança de critério com autorização19(6) ficam por corresponder; o caso demonstrado declara expressamente zero de receita antecipada e método mantido, sem presumir essas condições. |
|
||||
|
||||
**Percurso demonstrado:** cálculo → gravação → recuperação pela API privada → relatório/dossier/exportação em cinco casos:conjunto calculado,informação insuficiente,categorias adicionais,limites partilhados e encerramento de obra. Só os novos casos foram testados: **22 testes frontend,1 testeAPI/83asserções**, transacção revertida na base QA127.0.0.1:55441; routes/actions gerados pelo procedimento existente,TypeScript/build e interface real passaram. Interface permite reutilizar a parcela livre da origem e o saldo financeiro de créditos quando conhecido; alterações às somas dos temas são revistas antes de aplicar e não apagam escolhas ou históricos. Fonte ausente ou saldo não acompanhado nunca cria zero. Valores racionais são conservados, apresentações decimais aproximadas são identificadas e uma perda inferior a um cêntimo não é truncada para zero.
|
||||
|
||||
**Preservação:**6ficheiros de runtime no delta,42protegidos e31originais conferidos; sem schema/API/configuração/permissões/dependências alterados, sem escrita no activo. Recibo:`docs/investmoz/simulations/irpc-l6-costs-provisions-timing-qa-20261026.json`;bundle/pacote em `outputs/irpc-l6-costs`. DivergênciaM20/M22 permanece limitada ao transporte201/quadro8 versus200/quadro10; não é uma condição destes cálculos. Não foram criadas correspondências oficiais de campos para estes novos ajustamentos por presunção.
|
||||
|
||||
**Saldo deL6 após estes casos QA:**combinação36h/i+36(4);quota36h automática e restantes amortizações;campanhas36-A e sua articulação com1%;provisões reguladas/reforços financeiros e periodizações específicas não cobertas;receita antecipada positiva/mudança autorizada do método de obra;períodos curtos/conversão fiscal anual;representação fiscal de fracções e restantes correspondênciasM20/M22. Cada pendência afecta o caso/campo dependente, não o conjunto independente demonstrado. Benefícios,isenções,taxas reduzidas e operações especiais mantêm âmbitoL7;retenções,pagamentos,créditos e saldo anual mantêm âmbitoL8. **L6 continua parcial.** As dez dúvidas deL5 não foram reabertas.
|
||||
|
||||
## 26/10/2026 — conjunto L6 043dd35d entregue pelo Git
|
||||
|
||||
Instalado `043dd35d8ee247123b3a32f1fc10fd2ede81e9f4` sobre `a2de7259`, pelo procedimento Git existente, sem força, migrações ou importações. Backup fresco `2026-10-26T06:35:29Z` e restauro isolado sem rede/porta55441: **174tabelas** conferidas por contagem/checksum; **369ficheiros/configuração** preservados. Conferidos **6ficheiros do delta,42protegidos e31originais**; schema,roles/grants e permissões iguais. Tabelas de negócio preservadas; cache/sessões reconciliadas com os eventos operacionais da entrega. `a2de7259` permanece como versão anterior. Dependências de4versões antigas arquivadas e verificadas para espaço, sem modificar as versões actual/anterior, fontes, dados ou backups.
|
||||
|
||||
Revisão/manifest público,11marcadores compilados e simuladorHTTP200 conferidos. Pipeline normal concluído; as provas QA aceites foram reutilizadas, sem nova ronda manual. **Disponível no âmbito demonstrado: lucro6730 → base4430 → colecta1417,60MZN. O saldo final a pagar/recuperar continua indeterminado emL8.** Também preservados o caso de perda corrente e as distinções conhecido/ausência/falta de informação, os períodos/EP demonstrados e a preparação parcialM20/M22. Recibo:`docs/investmoz/simulations/irpc-l6-costs-delivery-20261026.json`.
|
||||
|
||||
O estado «QA sem instalação» da nota anterior é histórico para este conjunto. **L6 continua parcial pelos seis grupos concretos da secção seguinte**, cada um com condição de resolução e bloqueio delimitado. L7 eL8 mantêm os seus âmbitos.
|
||||
|
||||
|
||||
## 26/10/2026 — saldo de L6 após a entrega043dd35d
|
||||
|
||||
Mesma matriz AUD-SIM-INT02. Custos/provisões/periodização demonstrados entregues; trabalho seguinte:amortizações. Provas aceites reutilizadas.
|
||||
|
||||
| Caso ou correspondência pendente | Condição concreta de resolução | Limite do bloqueio |
|
||||
|---|---|---|
|
||||
| Combinação36h/i com36(4) | Corresponder a regra de articulação dos trechos aplicáveis ou esclarecer comAT o exemplo combustível100/comprovado80/passageiro sem excepção;sem somar ou repartir correcções por presunção. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Quota36h automática e amortizações restantes | Reconciliar tabela/método/entrada emuso/quotas contabilísticas e fiscais anteriores;prioridade seguinte deL6. A parcela36h documentada continua reutilizável nos casos independentes. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Campanhas plurianuais36-A e limite1% | Implementar a periodização por três exercícios e a sua articulação com36n; não tratar a campanha como publicidade ordinária. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Provisões reguladas28d e reforços financeiros28(3) | Corresponder a regra sectorial/supervisão ou o reforço financeiro e os saldos documentados; não usar os limites ordinários29 por aproximação. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Receita antecipada19(5) positiva e mudança autorizada19(6) | Corresponder os custos futuros/receita antecipada e o transporte entre exercícios ou a autorização da mudança de método;os casos zero conhecido/método mantido permanecem executáveis. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Outras periodizações,âmbitos eM20/M22 | Tratar apenas os casos específicos18(6–10),períodos curtos/conversão anual,representação fiscal e campos ainda sem correspondência,com os parâmetros da edição/caso;divergência201/Q8 versus200/Q10 só afecta o transporte indicado. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
|
||||
L6 continua parcial. L7 mantém benefícios/casos especiais;L8 mantém retenções/pagamentos/créditos/saldo final. As dez dúvidasL5 não foram reabertas.
|
||||
|
||||
## 26/10/2026 — L6: amortizações em QA, sem instalação
|
||||
|
||||
O portal mantém `043dd35d` instalado: colecta demonstrada1417,60MZN, sem saldo finalL8. O novo conjunto optativo `IRPC-normal-adjustments/7` reutiliza os activos e o resultado financeiro já declarados. Versões1–6 e históricos permanecem intactos; activar o novo mapa substitui o efeito fiscal anterior das amortizações, sem o somar novamente. Ausência declarada de quotas anteriores é distinta de informação em falta e exige referência.
|
||||
|
||||
Cobertura delimitada ao exercício anual2026/MZN e bens novos ao custo histórico: tabelaII/3/9 computadores25%,3/9.1 servidores20%,3/23 segurança20%,3/22 máquinas não especificadas10%,5/7 mobiliário10%,1/2.2 edifícios comerciais/administrativos2%,4/9.2 veículos ligeiros/mistos25%,5/8 software25%; tabelaI/84.2/B decoração hoteleira20% e84.3/A máquinas de lavandaria12,5%. A tabelaI prevalece quando aplicável; não se presume que esta lista cobre todo o catálogo. Fonte: Decreto72/2013, artigos3–10/17 e tabelas, exemplar original anteriormente aceite e hash preservado; CIRPC27e para limite800000MZN de viaturas e exclusão de terrenos.
|
||||
|
||||
Método constante com taxa expressamente escolhida no recorte metade–máximo; degressivo apenas para bens elegíveis novos, factores máximos1,5/2/2,5 segundo vida útil. Opção8(2) demonstrada apenas em ano civil/início1Janeiro, com quotas anteriores completas documentadas. Duodécimos incluem mês de entrada e excluem mês de saída, respeitando vida máxima. Software exige direitos onerosos/exclusivos e duração limitada; art17 exige bem individual até20000 e opção documentada. Quotas anteriores recuperáveis têm prova contabilística/fiscal e são limitadas à parte elegível: quotas nunca contabilizadas ou permanentemente excluídas não se tornam dedutíveis. Nenhum saldo oficial é consumido.
|
||||
|
||||
| Novo caso | Efeito demonstrado em MZN: lucro → matéria colectável → colecta |
|
||||
|---|---|
|
||||
| Computador em uso desdeJulho: quota fiscal50, ajustamento70, substituindo anterior20 | 6780 →4480 →1433,60 |
|
||||
| Mesmo activo, saída15Outubro:3meses/quota25 | Colecta1441,60; entrada/saída identificadas no relatório |
|
||||
| Degressivo elegível: quota200, ajustamento40 | 6630 →4330 →1385,60 |
|
||||
| Quota anterior documentada:20 recuperados,20 restantes; ajustamento−20 | 6730 →4430 →1417,60 |
|
||||
| Máquina de lavandariaI/84.3/A: quota62,50, ajustamento57,50 | 6767,50 →4467,50 →1429,60 |
|
||||
| Quota contabilística anterior em falta | Lucro/base/colecta indeterminados; ajustamentos independentes conhecidos continuam discriminados |
|
||||
|
||||
Cálculo → gravação → recuperação pela API privada → relatório/dossier demonstrado em cinco casos. **18novos testes frontend;1testeAPI/84asserções**, rollback na baseQA127.0.0.1:55441; routes/actions gerados, TypeScript/build e interface real passaram, incluindo edição, reutilização, ausência declarada, falta de informação, recuperação e exportação. Provas aceites reutilizadas. **7ficheiros de runtime no delta,43protegidos e31originais conferidos**; sem migração/API/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
| Saldo concreto das amortizações | Condição de retoma |
|
||||
|---|---|
|
||||
| Outros códigos/taxas, por exemploII/3/3 ar condicionado12,5% | Acrescentar correspondência verificada, elegibilidade e prova apenas desse delta; sem aprovação genérica adicional |
|
||||
| Bens usados, abertura de escrita, grandes reparações/benfeitorias7(2)/(4), reavaliações15 e transição anterior2014 | Documentar vida esperada, bases/quotas anteriores e implementar a regra específica aplicável |
|
||||
| Uso intensivo11, concessões12, peças14, intangíveis específicos16 e eventos de transferência/relocação | Corresponder condições legais e histórico do evento; desenvolvimento/goodwill não herdam taxa do software |
|
||||
| Mudança de método10, excepções, taxas fora do recorte, vida máxima anual terminada a meio do período e opção8(2) fora do caso demonstrado | Histórico concreto e regra/excepção correspondente; autorização apenas quando a norma a exigir |
|
||||
| Restantes custos/provisões/periodizações da entrega043dd35d; períodos curtos, conversão anual, representação fiscal e correspondênciasM20/M22 | Mantêm os critérios concretos já registados na matriz; este incremento não os encerra |
|
||||
|
||||
A divergência201/quadro8 versus200/quadro10 bloqueia apenas o transporte afectado. Não foram presumidas correspondências oficiais para estes novos campos. **L6 continua parcial;L7 eL8 mantêm os seus âmbitos.** As dez dúvidasL5 não foram reabertas. Recibo: `docs/investmoz/simulations/irpc-l6-depreciation-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — amortizações e9fe1022 entregues pelo Git
|
||||
|
||||
Instalado `e9fe102259c183a9d9bf7e39f246a8c3860839c6` sobre `043dd35d`, preservado como versão anterior. Backup fresco `2026-10-26T07:31:29Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **7ficheiros do delta,43protegidos e31originais** verificados; schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup. Cache:reinício da fila,contadores/timers e renovação da validade do mesmo valor de cache da página inicial. Sessões:expiração individual comprovada pelo prazo configurado120minutos,novas consultas da entrega e acessos anónimos correlacionados por agente/data no nginx;sem perda de dados de negócio. Dependências de5versões antigas arquivadas/verificadas para a margem do pipeline,preservando versões actual/anterior,fontes,dados e backups.
|
||||
|
||||
Revisão/manifest público,5marcadores compilados,4assets e simuladorHTTP200 conferidos. Pipeline normal concluído; provas QA18frontend/API1-84/UI/tipos/build reutilizadas,sem nova ronda manual. **Exemplo disponível: lucro6780 → matéria colectável4480 → colecta1433,60MZN. Saldo final a pagar/recuperar indeterminado emL8.** Históricos1–6 preservados; versão7 apenas por activação do novo mapa,substituindo o efeito anterior sem duplicação. Recibo:`docs/investmoz/simulations/irpc-l6-depreciation-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de e9fe1022 é histórico. Mantêm-se explícitos os outros códigos de tabela;usados/abertura de escrita/reparações/reavaliação/transição;uso intensivo/concessões/peças/intangíveis específicos/eventos;mudanças/excepções de método e opções fora do recorte. Retoma por correspondência da regra específica,base/vida/quotas e prova do delta,sem autorização genérica adicional. Períodos curtos e planos noutra moeda são o próximo incrementoQA,reutilizando o mecanismo cambial. Restantes custos/períodos/representação/camposM20-M22 conservam critérios próprios;divergência201/Q8 versus200/Q10 restringe apenas o transporte afectado. **L6 parcial;L7/L8 próprios;dez dúvidasL5 não reabertas.**
|
||||
|
||||
## 26/10/2026 — L6: períodos curtos e planos noutra moeda em QA
|
||||
|
||||
`e9fe1022` está instalado, com o âmbito de amortizações já demonstrado e os restantes casos de tabela/método explícitos acima. Este novo conjunto optativo `IRPC-normal-adjustments/8` está **emQA,sem instalação**. Reutiliza os meses e montantes do plano,os mapas fiscais emMZN e o mecanismo cambial entregue. Os históricos1–7 e o plano original não são reescritos.
|
||||
|
||||
Períodos de meses completos com termo em2026: início7(4)a,cessação7(4)b,início/fim de sujeição7(4)c e transição7(4)d,mediante identificação do evento/datas/suporte; plano com6meses ou selecção explícita de6dos12meses,sem anualizar receita,resultado,base ou taxa. Primeiro mês civil do plano é declarado,não inferido do mês orçamental. Anual diferente do ano civil conserva a correspondência do período autorizado/comunicado existente. Duodécimos ordinários do art9(3) do Decreto72/2013 aplicam o número de meses de utilização;art17 integral em período curto e restantes excepções não se tornam suportados por aproximação. Elemento conhecido como não amortizável mantém acréscimo integral,sem exigir método irrelevante.
|
||||
|
||||
Planos em outra moeda: cada mês seleccionado reutiliza ou confirma selecção cambial pelo procedimento existente,coluna/data/boletim/sentido e vínculo à origem. Moeda e valores originais permanecem no relatório. Não se adopta taxa actual,única ou de outro mês por defeito. **A conversão mensal para simulação exige pressuposto documentado;não confirma automaticamente uma regra fiscal de conversão anual.** Os mapas/activos/quotas/perdas existentes continuam emMZN e são reconciliados expressamente;nenhuma segunda conversão automática. Saldos patrimoniais de créditos em moeda estrangeira não são apresentados comoMZN pela conversão dos fluxos do plano;correspondência de saldo/data/taxa continua separada.
|
||||
|
||||
| Caso novo | Efeito demonstrado emMZN |
|
||||
|---|---|
|
||||
| Início1Julho–31Dezembro,meses7–12: resultado3120;quota fiscal50 e ajustamento10 | Lucro3130 → matéria colectável3130 → colecta1001,60,à taxa32%;ausência de perdas/benefícios declarada |
|
||||
| Mesmo recorte emUSD,pressuposto sintético64MZN/USD identificado em cada mês;mapasMZN reconciliados | Resultado199680;ajustamento640;lucro/base200320 → colecta64102,40. Taxa64 é pressupostoQA,não boletimBM real ou parâmetro fiscal confirmado |
|
||||
| Anual emUSD;plano de6meses iniciado emJulho;cessação e sujeição no mesmo ano | Novos testes próprios;respectivamente colecta128204,80 e1001,60nos casos correspondidos,sem anualização do semestre |
|
||||
| Falta de selecção de um mês,moeda incompatível ou taxa editada sem confirmação | Valores originais e conversões independentes visíveis;resultado/lucro/base/colecta dependentes indeterminados |
|
||||
| Perdas reportadas propostas num período curto | Lucro3130conhecido;dedução/base/colecta pendentes da sequência de períodos. Art41(5) exclui da contagem o período de transição7(4)d inferior a6meses;não autoriza agregar todos os períodos curtos |
|
||||
|
||||
Cálculo → gravação → recuperaçãoAPI → relatório/dossier demonstrado em4casos. **13testes novos frontend,API1teste/58asserções**, rollback na baseQA127.0.0.1:55441;routes/actions pelo procedimento existente,TypeScript/build e interface real passaram. Interface demonstrou alteração de datas e taxa,confirmação cambial,recuperação e exportação. Mudança na origem cambial invalida a actualidade do novo resultado,conservando o histórico. Provas aceites reutilizadas,sem repetição manual. Delta:**9ficheiros de runtime,43protegidos e31originais**;sem API/schema/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
| Pendência concreta | Condição de retoma e bloqueio |
|
||||
|---|---|
|
||||
| Datas parciais,períodos superiores a12meses/liquidação e curtos fora do recorte2026 | Corresponder datas/evento,parcelas de dias e regra aplicável;apenas esse período depende da implementação |
|
||||
| Dedução de perdas em sequência com períodos curtos/transição | Declarar sequência efectiva de períodos posteriores e aplicar41(5) ao caso7(4)d inferior a6meses;sem prazo presumido só por ano civil. Lucro independente continua calculável |
|
||||
| Limites anuais de publicidade e provisão de créditos em período curto | Corresponder expressamente a base/limite do período e regra de proporcionalização,se aplicável;sem anualização ou rateio presumidos. Outros custos e períodos anuais não bloqueados |
|
||||
| Quota integral art17 em período curto,opções/métodos/tabelas e casos de amortização ainda não suportados | Implementar combinação específica e provar só o novo efeito;condições restantes do conjuntoe9fe1022 continuam válidas |
|
||||
| Conversão fiscal anual confirmada,saldos em moeda estrangeira e fracções de cêntimo da conversão | Identificar regra fiscal/data/base,taxa e âmbito;para saldos,conversão própria em vez de somar fluxos;para fracções,regra de representação. Até lá,pressupostos de simulação explícitos e total indeterminado quando não representável neste recorte |
|
||||
| Restantes custos/periodizações e correspondênciasM20/M22 | Mantêm os critérios já registados. Divergência201/Q8 versus200/Q10 limita só o transporte afectado |
|
||||
|
||||
Fontes primárias reutilizadas: CIRPC Lei34/2007 PDF4/p768(58),art7(4)/(7),ePDF12/p768(66),art41(5);Decreto72/2013 PDF3/p1074(7),art9(3). Exemplar e originais/hash preservados;sem importação/publicação documental. **L6 continua parcial. Colecta não é saldo final a pagar;L7 eL8 mantêm âmbitos próprios.** As dez dúvidasL5 não foram reabertas. Recibo:`docs/investmoz/simulations/irpc-l6-periods-fx-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — períodos curtos e planos noutra moeda56475acb entregues pelo Git
|
||||
|
||||
Instalado `56475acb2f39e58cb51664913f7fb499f58eb7ab` sobre `e9fe1022`,preservado como versão anterior. Backup fresco `2026-10-26T08:17:39Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **9ficheiros do delta,43protegidos e31originais** verificados;schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup. Cache/sessões reconciliadas com os eventos operacionais e acessos anónimos registados;expiração,quando aplicável,comprovada individualmente pelo prazo configurado. Dependências de5versões antigas arquivadas/verificadas,preservando versões actual/anterior,fontes,dados e backups.
|
||||
|
||||
Revisão/manifest público,6marcadores compilados,4assets e simuladorHTTP200 conferidos. Pipeline normal concluído;provasQA13frontend/API1-58/UI/tipos/build reutilizadas,sem nova ronda manual. **Semestre demonstrado: lucro3130 → matéria colectável3130 → colecta1001,60MZN.** PlanoUSD:pressuposto sintético64MZN/USD por mês identificado,originais conservados e mapasMZN reconciliados;lucro/base200320 → colecta64102,40MZN. **Não confirma regra fiscal de conversão anual nem boletimBM real. Saldo final a pagar/recuperar continua indeterminado emL8.** Históricos1–7 preservados;versão8 optativa,sem anualizar resultados ou usar taxa actual por defeito. Recibo:`docs/investmoz/simulations/irpc-l6-periods-fx-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de56475acb é histórico. Permanecem explícitos os casos de datas parciais/liquidação,sequência de perdas41(5),limites anuais em período curto,art17 curto/restantes amortizações,conversão fiscal anual/saldos em outra moeda/fracções e demais custos/periodizações. Condições de retoma continuam na mesma matriz. Próximo incrementoQA:representação de valores e camposM20/M22 por corresponder;divergência201/Q8 versus200/Q10 limitada ao transporte do resultado afectado,sem reabrir cálculos demonstrados. **L6 parcial;L7/L8 próprios;dez dúvidasL5 não reabertas.**
|
||||
|
||||
## 26/10/2026 — L6: representação dos valores e campos M20/M22 em QA
|
||||
|
||||
`56475acb` está instalado. Este novo conjunto optativo `IRPC-normal-adjustments/9` está **em QA, sem instalação** e acrescenta preparação dos valores/campos, sem alterar fórmulas de lucro tributável, matéria colectável ou colecta. Históricos1–8, plano original, pressupostos cambiais e demais livros preservados. A falta de uma correspondência documental afecta o campo e a sua reconciliação, mantendo os totais fiscais existentes.
|
||||
|
||||
**Representação:** valor racional exacto conservado, apresentação aproximada identificada por«≈» e fracção original; zero conhecido, informação em falta e campo sem aplicação distintos. M20A.1/quadro4/M12 pede meticais sem centavos: valores inteiros são representáveis, fracções ficam por corresponder, sem arredondamento/truncagem. Preparação M22 já aceite com valores exactos ao cêntimo preservada; fracções de cêntimo continuam explícitas e pendentes da regra fiscal aplicável. Resultado líquido negativo M20 é apresentado entre parêntesis; M22 separa campo de lucro do de prejuízo, sem colocar perda no lucro ou criar matéria colectável negativa.
|
||||
|
||||
**M20:** reutiliza as quatro correspondências directas de custos das vendas,pessoal,depreciação e juros. Discrimina as receitas e despesas operacionais por conta com suporte e reconciliação exacta ao plano do período/moeda. Demonstra prestação de serviços7.2,fornecimentos/serviços6.3,outros gastos6.8 e imposto contabilizado8.5, além das contas directas6.1.1/6.2/6.5/6.9. Rótulos das demais contas são estrutura disponível; não constituem novas regras fiscais nem provam a qualificação de uma parcela. Uma origem incompleta não apaga as contas directas independentes.
|
||||
|
||||
O imposto contabilizado tem valor/ausência e suporte próprios, e localização já incluída ou exterior ao plano. Colecta não é despesa contabilística presumida. Valor já incluído não é subtraído novamente; contradição com o mapa de imposto próprio ou coexistência das duas localizações fica identificada. O resultado líquido é apurado para preparação; o transporte automático entre edições continua impedido só no resultado afectado.
|
||||
|
||||
**M22 PDF:** correspondências de variações patrimoniais201/202,resultado203,amortizações não aceites206,provisões/imparidade209,impostos de outrem213,multas/juros compensatórios215,ajudas219,representação220,publicidade221,despesas não documentadas223,aluguer224,combustíveis225,viaturas226 e reposição de provisões tributadas239. Reutiliza os ajustamentos demonstrados; não reaplica as percentagens impressas. A representação já calculada usa80%,compatível com220. Campo213 é apenas de outrem: imposto próprio36(1)a continua **sem campo presumido**. Efeitos positivos de amortização vão a206; recuperações negativas de quotas anteriores ficam separadas até correspondência própria, sem compensação no mesmo campo.
|
||||
|
||||
Somas238/258 e lucro reconstruído apenas quando todas as parcelas têm correspondência e reconciliam; campos259/260/269/270/276/277/278/300 reutilizam o cálculo existente, mesmo havendo uma parcela sem campo. Colecta total302 só é preparada com ausência de parcela de taxa reduzida declarada com suporte;caso conhecido mantém âmbitoL7 e não apaga300. Campos309–316/saldo final permanecem emL8.
|
||||
|
||||
| Caso novo | Resultado e limite de aplicação |
|
||||
|---|---|
|
||||
| Correspondência no semestre demonstrado, ausência de imposto contabilizado e taxa reduzida declaradas | Resultado líquido3120;203=3120;206=10;238=3130;258=0;lucro/base3130;colecta normal300 e total302=1001,60MZN. Reconciliação aritmética exacta, sem transporte automático entre edições |
|
||||
| Fornecimentos300,50 e outros gastos299,50, origem600 | Parcela300,50 conserva601/2;M20 em meticais inteiros pendente só nas parcelas fraccionárias;resultado e colecta1001,60inalterados |
|
||||
| Imposto contabilizado em falta | Resultado líquido/campo200 e somas dependentes indeterminados;lucro/base3130 e colecta1001,60mantidos |
|
||||
| Recuperação de quota anterior:ajustamento−26 | Efeito fiscal e colecta1001,60preservados;sem código de dedução inventado,somas238/258 pendentes;260/278/300 conhecidos |
|
||||
| Imposto próprio320 contabilizado exterior ao plano | Resultado líquido2800 conhecido;campo de acréscimo próprio por corresponder,sem usar213 de outrem;lucro/base3130 e colecta1001,60preservados |
|
||||
|
||||
Percurso cálculo → gravação → recuperação privada → relatório/dossier demonstrado em **5casos**. **15testes novos frontend;API1teste/97asserções**, transacção revertida na baseQA127.0.0.1:55441;routes/actions gerados pelo procedimento existente,TypeScript/build e interface real passaram. Interface demonstrou edição de parcelas,imposto em falta sem apagar valor anterior,recuperação/exportação e pendências apenas dependentes. Provas aceites reutilizadas;sem repetir suites anteriores. **4ficheiros de runtime no delta,50protegidos e31originais** conferidos;sem API/schema/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
Fontes: PDF M22 SHA2564b61bd83d1fbcfd3b7b5c5523cea5923f7d0f65dc4c004eff58e5db38f763c88,3páginas já aceites reutilizadas;M20A.1 SHA2561ceca6f4c6d77853c1b2b445876599b42093175fa89eecf40590180956d83a9e,M12/D13–D35. Inventariados os20ficheiros acessíveis deModelos/Notas,incluindo temporários;originais/hash preservados. Só rótulos genéricos necessários extraídos do XLSX;sem valores privados,fórmulas/cache do exemplar,importação ou publicação documental.
|
||||
|
||||
| Saldo concreto da preparação M20/M22 | Condição de retoma e alcance |
|
||||
|---|---|
|
||||
| Transporte do resultado M20A.1/D35→M22 | Exemplar compatível ou instrução que resolva201/quadro8 versus200/quadro10. Só esse transporte fica impedido;valor líquido próprio e demais campos continuam visíveis |
|
||||
| Imposto próprio36(1)a,quota anterior recuperada e restantes efeitos de periodização/obras/reversões sem campo | Corresponder rótulo,edição/período e regra específica do campo. Efeito/valor conservados sem código provisório;apenas somas/campos dependentes aguardam |
|
||||
| Fracções M20 e subcentavos M22 | Identificar regra de representação do caso;preservar fracção e apresentar aproximação identificada até então. InteirosM20 e cêntimos exactosM22 não bloqueados |
|
||||
| Imposto contabilizado simultaneamente incluído e exterior ao plano | Discriminar ambas as componentes/referências e conciliar8.5/acréscimo próprio sem repetir gasto;sem inferir o valor da colecta |
|
||||
| Contas/quadros e anexos restantes fora das seis linhas financeiras demonstradas | Reutilizar dados existentes,classificar componentes com suporte e acrescentar correspondência específica;sem tomar campos preenchidos do exemplar como dados do investidor |
|
||||
|
||||
L7 mantém benefícios/casos especiais/taxas reduzidas eL8 mantém retenções,pagamentos,créditos e saldo final. Restantes regras deL6 e as dez dúvidasL5 conservam o saldo e as condições já documentadas. **L6 continua parcial;colecta não é saldo final a pagar.** Recibo:`docs/investmoz/simulations/irpc-l6-values-forms-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — representação dos valores e campos M20/M22 5aaf1a56 entregues pelo Git
|
||||
|
||||
Instalado `5aaf1a56f9d928331364fcc8b0d1528e51dba327` sobre `56475acb`,preservado como versão anterior. Backup fresco `2026-10-26T08:57:09Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **4ficheiros do delta,50protegidos e31originais** verificados;schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup;cache/sessões reconciliadas com eventos operacionais/acessos anónimos,sem alteração de dados de negócio. Revisão/manifest público,7marcadores compilados,4assets e simuladorHTTP200 conferidos. Sem migrações,importações ou escrita privada sintética no activo.
|
||||
|
||||
Pipeline normal concluído;provasQA15frontend/API1-97/UI/tipos/build reutilizadas,sem nova ronda manual. **Disponível no âmbito demonstrado: resultado líquido3120 + ajustamento10 → lucro/base3130 → colecta1001,60MZN.** Representação exacta,ausência/informação em falta/campo sem aplicação e valores ainda sem correspondência conservados. M20 mantém fracções sem arredondamento presumido;M22 mantém preparação exacta ao cêntimo já aceite. Imposto próprio320 exterior produz resultado líquido2800,mas campo de acréscimo próprio continua pendente,sem usar213 de outrem. Divergência201/Q8 versus200/Q10 só limita o transporte afectado. Históricos e cálculos anteriores,pressupostos cambiais e âmbitosL3/ISPC/câmbio/L5 preservados. **Colecta não é saldo finalL8.** Recibo:`docs/investmoz/simulations/irpc-l6-values-forms-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de5aaf1a56 é histórico. O saldo seguinte separa desenvolvimento de esclarecimento documental,com exemplo e condição de retoma,para decidir o fecho operacional delimitado. **L6 não está integralmente concluído;L7 eL8 mantêm os seus âmbitos.** Não foi executada pesquisa nova nem repetição dos testes aceites para esta consolidação.
|
||||
|
||||
## 26/10/2026 — saldo consolidado de L6 para decisão de fecho operacional delimitado
|
||||
|
||||
Referência actual após a entrega `5aaf1a56`: percurso normal demonstrado até à **colecta**, com períodos/moedas/ajustamentos e preparação parcialM20/M22 documentados. Colecta não é saldo final a pagar ou recuperar;L8 conserva esse fecho. Esta lista consolida o saldo das notas anteriores,sem reabrir o que já foi demonstrado. Os pormenores e exemplares continuam nas mesmas secções/recibos;nenhuma nova matriz ou backlog é criado.
|
||||
|
||||
**Código ainda por implementar.** São extensões não demonstradas;as fontes já aceites permitem iniciar os casos correspondidos. Dados de um investidor em falta dentro de regra já implementada são uma pendência desse caso, não outra tarefa genérica deL6.
|
||||
|
||||
| Trabalho | Exemplo | Condição de retoma / alcance |
|
||||
|---|---|---|
|
||||
| Amortizações e quota de aluguer36h restantes | Ar condicionadoII/3/3,12,5%,fora dos10códigos implementados;bem usado com vida esperada e quotas anteriores documentadas. | Acrescentar catálogo e variantes previstas nas fontes aceites:usados/abertura/reparações/reavaliação,uso intensivo/concessões/peças/intangíveis,transição e excepções de método/vida útil,art17 em período curto e quota36h automática. Implementar só o caso escolhido e provar o delta;sem aguardar validação genérica daAT. Só activo,método ou quota ainda não suportados;amortizações demonstradas preservadas. |
|
||||
| Custos e periodizações específicos | Campanha de lançamento300 com imputação por3exercícios;obra com receita antecipada positiva em vez do zero demonstrado. | Implementar36-A e articulação com36n,reforços financeiros28(3),19(5)/19(6) e18(6–10),com saldos/condições do caso. Autorização de mudança de método apenas quando a disposição aplicável a exigir. Provisões sectoriais dependem primeiro da norma específica indicada abaixo. Só campanha,obra ou periodização específica;limites/provisões ordinários e casos já demonstrados mantidos. |
|
||||
| Períodos e sequência de perdas | Transição de4meses seguida dos períodos posteriores:aplicar a exclusão de contagem de41(5) ao período7(4)d,sem contar apenas anos civis. | Representar a sequência efectiva de períodos/perdas e acrescentar datas parciais,liquidação/períodos superiores a12meses e outros exercícios com regra/taxa aplicável. Não há nova pesquisa necessária para repetir o recorte de meses completos2026 já entregue. Só período ou utilização de perda dependente;lucro independente e semestres demonstrados preservados. |
|
||||
| Desdobramentos contabilísticos e quadros/anexos M20/M22 restantes | Imposto próprio200 já incluído no plano e320 exterior:discriminar as duas componentes sem duplicar gasto;contas fora das6linhas financeiras ainda não transportadas. | Acrescentar o desdobramento e as correspondências dos quadros/anexos escolhidos,reutilizando dados existentes. Campos sem correspondência aguardam a referência concreta abaixo;os outros componentes podem ser implementados/provados separadamente. Só componente/conta/campo ainda não suportado;valores e campos correspondidos preservados. |
|
||||
| Saldos em moeda estrangeira | Crédito final100USD não é soma das receitas convertidas por mês. | Implementar reconciliação de saldo e conversão pela data/regra que vier identificada,usando o motor cambial já entregue. A selecção mensal para simulação continua disponível;esta tarefa não cria outro mecanismo cambial. Só saldo/conversão fiscal dependente da regra;plano e pressupostos mensais permanecem disponíveis. |
|
||||
|
||||
**Esclarecimentos documentais aguardados.** Cada ponto abaixo exige apenas a referência/resposta específica indicada. A ausência dessa informação não significa revogação das fontes aceites,nem autoriza transformar a dúvida numa validação genérica deL6. Não se presume que um pedido já tenha sido enviado àAT;estes são pontos delimitados para o esclarecimento aplicável.
|
||||
|
||||
| Informação em falta | Exemplo da dúvida | Condição de retoma / alcance |
|
||||
|---|---|---|
|
||||
| Edição e campos M20/M22 | M20A.1/D35 remete201/quadro8;PDF M22 usa200/quadro10. Imposto próprio320 não pertence ao213 de outrem;quota recuperada−26 não tem campo de dedução confirmado. | Obter exemplar compatível ou instrução que identifique edição/período,campo e sentido do transporte. Para periodização/obras/reversões ainda sem campo,identificar a correspondência específica. Até informação nova,manter valores/efeitos sem código presumido e não repetir pesquisa. Só transporte,campo e somas dependentes;resultado líquido próprio,260/278/300 e demais campos conhecidos mantidos. |
|
||||
| Representação fiscal de fracções | M20:300,50=601/2MZN,num exemplar que pede meticais sem centavos;M22:1/300MZN não é um número exacto de cêntimos. | Identificar instrução de representação/arredondamento da edição/campo ou esclarecimento específico. Conservar a fracção até lá;não deduzir regra de arredondamento apenas do rótulo «sem centavos». Só transcrição não exactamente representável;inteirosM20,cêntimos exactosM22 e cálculo racional preservados. |
|
||||
| Articulação de limites em combinações não demonstradas | Combustível100,comprovado80,viatura de passageiros sem excepção:36h/i com36(4). Provisão de créditos200 num período curto de3meses:limite anual por corresponder. | Esclarecer especificamente a articulação h/i/36(4) e a base/limite dos períodos curtos de publicidade/créditos,se houver proporcionalização aplicável. Não somar exclusões,anualizar ou repartir por presunção. Retomar só perante referência/resposta concreta para o exemplo. Só combinação ou limite do período;casos independentes com regra já aplicada mantidos. |
|
||||
| Regra fiscal de conversão anual | PlanoUSD com64MZN/USD por mês é pressuposto sintético de simulação,não confirmação da data/taxa fiscal anual ou da cotação do saldo final. | Identificar disposição/âmbito,data,base e taxa/boletim aplicáveis ao resultado e,quando necessário,ao saldo. Reutilizar o motor existente e demonstrar só a correspondência nova;sem taxa actual por defeito ou nova ronda da pesquisa anterior. Só confirmação fiscal anual e saldo dependente;conversões mensais documentadas de simulação mantidas com os avisos. |
|
||||
| Norma sectorial de provisões reguladas | Provisão200 de uma entidade financeira sujeita ao28d não herda os1,5%/6% do regime ordinário29. | Identificar sector,regulador,norma de supervisão aplicável e saldos/condições necessários,antes da implementação específica. A fonte oficial fornecida é aceite;falta a regra concreta do caso,não certificação genérica da fonte. Só provisão regulada respectiva;provisões ordinárias demonstradas preservadas. |
|
||||
|
||||
**Base da decisão operacional:** o âmbito demonstrado e as suas limitações permanecem disponíveis na interface e nas exportações;as provas aceites mantêm validade. Um fecho operacional delimitado pode referir esse âmbito,com estas extensões/documentos fora da cobertura e retoma por caso. Esta consolidação **não declara L6 integralmente concluído nem regista uma decisão de fecho ainda não tomada**. Permite preparar o avanço paraL7 sem condicionar os casos independentes à resolução de todo este saldo. Benefícios/isenções/taxas reduzidas/tributações autónomas e operações especiais mantêm âmbitoL7;retenções,pagamentos,créditos e saldo anual mantêm âmbitoL8. As dez dúvidasL5 só afectam dependências efectivas e não foram pesquisadas novamente.
|
||||
|
||||
## 26/10/2026 — L6 operacional no âmbito demonstrado e delimitação de L7
|
||||
|
||||
**Decisão expressa da Tempo:** L6 fica operacional no âmbito demonstrado disponível em `5aaf1a56`, com limitações explícitas. Não é conclusão integral de L6 ou do IRPC. Os cinco grupos de código e cinco grupos documentais da secção «saldo consolidado de L6» permanecem separados, com exemplos e condições de retoma. As notas anteriores que deixavam a decisão operacional por tomar conservam o seu valor histórico; esta decisão é posterior. As provas aceites são reutilizadas. As pendências de L5/L6 só impedem tratamentos que dependam delas.
|
||||
|
||||
**Estado deste incremento:** delimitação documental de L7, sem novo cálculo, instalação, migração, importação ou alteração de dados activos. A colecta normal entregue mantém-se distinta do saldo a pagar/recuperar. Retenções, pagamentos, aplicação anual de créditos e liquidação final permanecem em L8. Recibo: `simulations/irpc-l7-scope-20261026.json` (relativo a `docs/investmoz/`).
|
||||
|
||||
### Dados existentes e fronteiras de integração
|
||||
|
||||
| Reutilização | Contrato para L7 e limite |
|
||||
| --- | --- |
|
||||
| Oportunidade/dossier: `context_opportunity`, `context_opportunity_snapshot`, `context_applicability_snapshot`, `context_reuse` | Conservar origem e data, selecção de campos compatíveis e edições deliberadas; `context-inheritance.ts` e `dossier-prefill.tsx` já sustentam esta reutilização. Associação documental a oportunidade/âncora não confirma implantação ou incentivo. |
|
||||
| `sector_id`, `province_id`, `district_id`, `admin_post_id`, `locality_id` e respectivas designações | Servem para identificar candidatos e pedir apenas elementos em falta. Confirmar actividade efectivamente exercida, estabelecimento/projecto e parcela abrangida por documentos do caso. Localização, polígono, DUAT ou código sectorial isolados não concedem benefício. |
|
||||
| Sujeito, NUIT, residência/EP, período, início de actividade/exploração e dados do plano | Reutilizar valores declarados e respectivas provas. Data prevista no dossier não substitui início efectivo quando esse for o termo inicial da norma. Distinguir conhecido, ausência declarada e desconhecido. |
|
||||
| `business_plan_snapshot`, livro `modelo_a_snapshot.irpcNormal` e versões L6 | Receber lucro/base/colecta e parcelas identificadas, com chave e versão de origem. Só alterar o ponto previsto pela norma: ajustamento ao lucro, dedução à base, taxa por parcela ou tributação autónoma separada. Não alterar nem recalcular silenciosamente históricos. |
|
||||
| Activos, quotas anteriores e despesas já registadas | Reutilizar os mesmos identificadores e montantes; calcular apenas o efeito adicional permitido. Não repetir o acréscimo de uma despesa nem deduzir duas vezes a amortização do mesmo activo. Um caso dependente de regra L6 não implementada conserva essa dependência específica. |
|
||||
| Preparação M20/M22 e aritmética racional existentes | Conservar montante exacto, unidade/moeda e parcela. Transporte só com correspondência demonstrada para a edição; campo desconhecido, fracção não representável ou divergência editorial não invalida o cálculo independente. Não arredondar por conveniência. |
|
||||
|
||||
O motor actual de matéria colectável não subtrai benefícios positivos livres: exige regra, condições, limite e ordem. A colecta normal cobre a taxa geral no recorte demonstrado; escolher «outro tratamento» não implementa uma taxa especial. A presença de campos ou de fontes no portal não equivale a execução de L7.
|
||||
|
||||
### Famílias de tratamentos a implementar por casos compatíveis
|
||||
|
||||
As referências seguintes delimitam a regra e o ponto de integração; **não constituem benefícios concedidos nem cobertura executável nova**. O exercício do caso, alterações aplicáveis e duração individual ficam associados à versão da regra. Não se transportam taxas temporárias para outro período.
|
||||
|
||||
| Família / fonte identificada | Condições e período a guardar | Efeito e exemplo de dúvida delimitada / condição de retoma |
|
||||
| --- | --- | --- |
|
||||
| **Despesas com tributação autónoma** — CIRPC, Lei34/2007, art.61(4), com art.36(1)g; PDF17/p768(71) | Natureza legal documentada da despesa não devidamente documentada, confidencial ou ilícita; valor e exercício; taxa de 35% da disposição e versão aplicável ao período. Não classificar pela simples falta de ficheiro anexado. | Parcela autónoma separada da colecta normal; reutilizar o acréscimo36g já feito, sem duplicação. Ex.: despesa100 já acrescida em L6 → parcela autónoma35 no caso qualificado; não é saldo final. Se só falta anexo, pedir a caracterização/prova da despesa e manter indeterminado apenas este tratamento. |
|
||||
| **Mais-valias autónomas** — Lei12/2025, art.2, CIRPC61-A; art.3 revoga39/47; art.6 vigora em01/01/2026; PDF20/p2180(20) | Alienação, activo, datas, realização/valor fiscal, origem contabilística, período e parcela identificados; taxa32% do61-A. Separar eventos anteriores a2026. | Apurar parcela autónoma, reconciliando o que já integra o resultado L6, sem dupla incidência ordinária/autónoma nem compensação presumida de perdas. Ex.: ganho100 incluído no resultado exige identificar a sua parcela antes de integrar a colecta autónoma32. Retoma: implementar essa reconciliação e a regra de apuramento aplicável ao activo; não bloqueia despesas autónomas ou benefícios independentes. |
|
||||
| **Isenções e redução por natureza da entidade** — CIRPC9–14; cooperativas no art.12, PDF5/p768(59), e taxa geral61(1) | Tipo efectivo da entidade, rendimentos elegíveis/excluídos, destino dos rendimentos, constituição e reconhecimento apenas onde exigido pela disposição; exercício e norma aplicável. Art.12 refere cooperativas agrárias, de artesanato e culturais e redução de50% da taxa geral; não todas as cooperativas. Arts.12(2)/14 separam rendimentos sujeitos a retenção. | Isenção ou taxa reduzida apenas na parcela coberta; actividade comercial acessória não se torna isenta por designação da entidade. Ex.: cooperativa com actividade elegível e outra não abrangida exige separar rendimentos e custos. Retoma: classificação documental e segregação da parcela, sem transportar a dispensa para retenções L5 ou liquidar créditos L8. |
|
||||
| **Amortização acelerada** — CBF, Lei4/2009, art.16; compilaçãoAPIEX p72 | Imóveis novos usados no projecto; imóveis reabilitados e máquinas/equipamentos industriais/agro-industriais nas condições da disposição; enquadramento CBF3/9/10 quando aplicável, entrada em uso, taxa normal, base, quota contabilizada e quotas anteriores. Incremento de50% sobre a taxa normal, não cinquenta pontos percentuais. | Efeito no ajustamento ao lucro e, através da cadeia L6, na base/colecta. Ex.: taxa normal10% → taxa acelerada15%, antes das restantes condições/limites; não autoriza uma segunda dedução integral. Retoma por activo com classificação/documentos e conciliação de quotas/custo disponíveis; tabelas L6 em falta bloqueiam só o activo dependente. |
|
||||
| **Deduções e majorações de despesas/investimentos** — CBF17–19; compilaçãoAPIEX pp73–74 | Tecnologia de ponta, formação de trabalhadores moçambicanos e despesas elegíveis de utilidade pública: natureza, base, exercício inicial, janela dos primeiros cinco anos/exercícios conforme artigo, limites, exclusões, ordem e não cumulaçãoCBF4. Distinguir dedução à matéria colectável de majoração de custo. | Efeito no ponto exacto previsto pela disposição. Ex.: formação sem prova do tipo não permite escolher entre o limite5% e o ramo10% para novas tecnologias do art.18. Retoma: identificar tipo/base de limite e conciliar a despesa já contabilizada; não converter percentagem em dedução livre. |
|
||||
| **Crédito fiscal por investimento** — CBF15; compilaçãoAPIEX pp71–72 | Investimento novo elegível, exclusões, início, Maputo/outras províncias como uma das condições, parcela da colecta atribuível ao projecto e prazo de utilização/transporte de cinco exercícios. Taxas5%/10% distinguem os ramos da disposição, sem direito automático por localização. | **L7 identifica origem, elegibilidade e crédito potencial; L8 aplica o crédito anual, limites/saldos e liquidação.** Ex.: projecto situado fora de Maputo, sem discriminação do investimento elegível, não gera automaticamente10% de crédito. Retoma: base elegível e calendário documentados; utilização anual aguarda o mecanismo L8. |
|
||||
| **Tratamentos sectoriais/territoriais CBF** — infra-estruturas20–22; agricultura/pescas27–29; turismo30–33; parques de ciência34–35; grandes projectos36–38; zonas de rápido desenvolvimento39–44; ZFI45–46; ZEE47–48 | Seleccionar a disposição de IRPC efectivamente pertinente, actividade/projecto, delimitação/estabelecimento e estatuto comprovados, data de autorização/início quando exigidos, escalões, duração, cumulação e cessaçãoCBF49–52. ZFI46 e ZEE48 são os artigos de impostos sobre rendimento. Não tratar benefícios exclusivamente aduaneiros como benefícios IRPC. | Isenção, redução ou dedução por parcela e intervalo próprio, em vez de taxa comum ao sector/localização. Ex.: endereço numa ZEE sem estatuto documentado deixa o ramo ZEE pendente; o cálculo normal independente continua. CIRPC61(2) na Lei20/2022 tem termo31/12/2025: não presumir prorrogação para2026. Retoma de cada ramo: condições e cronologia da disposição específica preenchidas, com regra versionada; não exigir pesquisa repetida de todos os sectores. |
|
||||
| **Operações e regimes especiais** — CIRPC54–56 (entradas de activos, fusões/cisões e sócios), transferência de perdas41-A; regimes sectoriais específicos do acervo | Tipo de operação, intervenientes, residência, datas, activos/passivos/valores fiscais e continuidade; identificar diploma sectorial/artigo e regra aplicável antes de escolher tratamento. Não inferir neutralidade por chamar «fusão» à operação nem aplicar regime mineiro/petrolífero por rótulo sectorial. | Continuidade/ajustamento/tributação diferida ou parcela própria conforme norma, mantendo bases históricas. Ex.: perda recebida de outra sociedade não é perda própria ordinária41 de L6. Retoma: correspondência específica41-A e operação documentada; regras sectoriais sem artigo correspondido ficam candidatas, sem taxa provisória. Não há bloqueio transversal de L7. |
|
||||
|
||||
### Registo por tratamento e demonstração a exigir ao código novo
|
||||
|
||||
Cada tratamento terá: identificador estável; sujeito/NUIT; oportunidade/projecto/estabelecimento e parcela; contexto herdado e divergências; fonte/exemplar/hash/artigo/versão; intervalo de vigência e período do caso; facto que inicia/termina a duração; condições individualizadas em «sim/não/desconhecido» com prova ou ausência declarada; título/reconhecimento somente quando a regra o exige; base elegível, taxa, limite, ordem e compatibilidade com outros tratamentos; resultado normal de origem; efeito adicional e ponto da cadeia; moeda/conversão e pressupostos; montante exacto; motivos de exclusão/informação em falta; versão/histórico e dependência concreta.
|
||||
|
||||
Os estados «candidato», «não aplicável», «informação em falta» e «calculado por regra implementada» não se confundem. Ausência declarada pode produzir efeito zero justificado; desconhecido não produz benefício zero nem benefício presumido. Uma condição negativa exclui o tratamento e conserva o percurso normal quando os seus dados são suficientes. Com potencial benefício ainda indeterminado, apresentar o cenário normal de referência e a parcela pendente sem declarar total fiscal definitivo. Mudança de sector/localização/documento invalida apenas a correspondência dependente e pede confirmação de reutilização; conserva o original e as edições deliberadas.
|
||||
|
||||
**Primeiro incremento delimitado para implementação:** qualificação comum e segregação de efeitos, acompanhadas do caso35% do61(4), com despesa já ajustada36g e caso de informação insuficiente. É independente de transporte M20/M22 não correspondido e de amortizações L6 em falta. **Incremento compatível seguinte:** cooperativa abrangida pelo12 com parcela elegível separada e amortização acelerada16 para activo já suportado em L6; cada caso só acompanha a entrega se demonstrado. Mais-valias61-A, deduções17–19, ramos sectoriais e operações especiais seguem separadamente quando as respectivas parcelas/regras estiverem correspondidas. Crédito15 prepara direito potencial em L7 e contrato de passagem para L8, sem antecipar liquidação anual.
|
||||
|
||||
Para cada nova regra: condição satisfeita, negativa, informação em falta, período incompatível/benefício expirado, sobreposição com ajustamento existente e alteração de contexto. Demonstrar apenas o delta: cálculo → gravação → recuperação → relatório, incluindo fonte, período, condições, efeito no lucro/base/colecta ou parcela autónoma e saldo final L8 por determinar. Recuperar históricos anteriores sem os alterar; não duplicar ajustamentos ao voltar a guardar. Reutilizar as provas aceites; não reabrir L3, ISPC, câmbio ou percursos L5/L6 independentes.
|
||||
|
||||
### Fontes consultadas e pendências delimitadas
|
||||
|
||||
Reutilizado o inventário autorizado de **8143ficheiros**, sem nova varredura de pastas. Para delimitação foram consultados os originais CIRPC/alterações já arquivados, a Lei4/2009 local e a compilação oficial [APIEX — Legislação de Investimentos em Moçambique](https://pt.apiex.gov.mz/wp-content/uploads/2025/02/LEGISLACAO-DE-INVESTIMENTOS-EM-MOCAMBIQUE.pdf), que reúne Lei8/2023, Decreto8/2024 e CBF4/2009. Disponibilidade, situação documental/jurídica e uso no cálculo continuam estados independentes. O acesso actual à cópia CBF supera a indisponibilidade assinalada em notas antigas; não activa regra nem apaga a nota histórica. Artigos, páginas, hashes e limites no recibo. A compilação não dispensa o período/alterações de cada tratamento, nem cria validação jurídica genérica adicional.
|
||||
|
||||
**Código por implementar em L7:** qualificação e persistência específicas; efeitos segregados; regras das famílias acima, por parcelas; conciliação sem duplicação; relatório/exportação correspondente. **Documentação por caso:** estatuto/reconhecimento ou enquadramento individual quando a fonte o exige; identificação de parcela/limite/cronologia; norma sectorial ainda sem correspondência; edição/campo de transporte afectado. Cada uma conserva exemplo e condição de retoma na linha correspondente. Não é necessário resolver todos os documentos para começar o primeiro incremento independente. L6 operacional não elimina este desenvolvimento; L7 delimitado não é L7 implementado; L8 conserva a liquidação final.
|
||||
|
||||
## 26/10/2026 — L7: qualificação, despesas autónomas e casos compatíveis em QA
|
||||
|
||||
**QA, sem instalação.** Base instalada preservada `5aaf1a56`; delimitação `d37fffb2`; ramo `codex/irpc-l7-common-autonomous-qa-20261026`, fotografia opcional `IRPC-normal-adjustments/10`. L6 continua operacional no âmbito demonstrado, com os cinco grupos de código e cinco documentais preservados. A implementação abaixo acrescenta apenas os tratamentos demonstrados; não conclui L7 nem o IRPC. Saldo final, retenções, pagamentos e aplicação anual de créditos permanecem em L8.
|
||||
|
||||
**Qualificação comum executável:** reutiliza sujeito/NUIT, âmbito, período, origem da oportunidade/dossier, sector e território; guarda condições, prova, fonte/artigo e período por tratamento. «Informação em falta», «ausência declarada», «não aplicável/condição negativa» e «calculado» têm resultados distintos. Desconhecido não vira zero. Período incompatível, identidade por reconciliar ou contradição afectam só o resultado dependente. A localização não escolhe taxa nem activa benefício. Os snapshots de origem ficam internos; o relatório apresenta contexto legível e as condições documentadas.
|
||||
|
||||
**Despesas61(4):** cada parcela aponta para uma linha `undocumented` do mapa36(1)g de L6, com acréscimo integral já calculado. Montante, documento e linha são reutilizados; L7 não introduz outro acréscimo nem outra despesa. A classificação legal e incidência são declaradas com prova própria; falta de anexo não classifica uma despesa. O imposto autónomo usa35% apenas nos casos qualificados. Duplicação da referência, parcela não correspondida, ausência contraditória ou informação insuficiente deixam o imposto reconciliado indeterminado; as parcelas conhecidas permanecem discriminadas. Condição negativa documentada conserva o ajustamentoL6 e não aplica imposto autónomo à parcela.
|
||||
|
||||
**Cooperativas12/14:** agrárias, artesanato ou culturais, residentes, com base ordinária integralmente elegível e ausência documentada de rendimentos sujeitos a retenção, aplicam redução de50% à taxa geral32%, ou16%. Não depende de seleccionar um sector semelhante. A qualificação especial pode coexistir com a opção «outro tratamento» da colectaL6: não exige fingir que a taxa reduzida é regime geral. Parcela mista, rendimentos retidos, outra entidade ou ausência contraditória conservam pendência própria; não recebem redução global presumida. O imposto autónomo de despesas não é reduzido por esta taxa.
|
||||
|
||||
**CBF16:** reutiliza identificadores e valores dos activosL6 suportados; imóvel novo do projecto ou máquinas industriais/agro-industriais das categorias correspondidas, com enquadramentoCBF3/9 e reconhecimento10 quando exigido (ou excepção identificada). Recorte inicial: primeiro exercício anual civil2026, método constante pela taxa normal máxima da tabela, activo desde01/01/2026, custo histórico novo, sem quotas anteriores/saída e sem cumulação de outros benefícios. Incrementa a taxa normal em50% e reutiliza limites de contabilização/saldo fiscal. Deduz apenas a diferença entre o mapa normal e o acelerado, sem alterar o activo de origem, os documentos ou os saldos oficiais. Quotas constantes gerais e demais cálculosL6 conservam o comportamento anterior quandoL7 está ausente.
|
||||
|
||||
| Caso sintético recuperado da API QA | Lucro/base e colecta de referênciaL6 | EfeitoL7 demonstrado | Resultado e limite |
|
||||
| --- | --- | --- | --- |
|
||||
| Despesa100 já acrescida36g | Lucro/base3230;colecta1033,60MZN | Novo ajustamento ao lucro0;imposto autónomo35 | Colecta combinada1068,60MZN;saldo finalL8indeterminado |
|
||||
| Classificação da mesma despesa em falta | Lucro/base3230;colecta1033,60MZN preservados | Imposto autónomo indeterminado | Colecta combinada indeterminada;sem perda dos cálculos independentes |
|
||||
| Condição negativa documentada na parcela | Ajustamento36g100 preservado | Parcela não aplicável;imposto autónomo0 justificado | Não confunde condição negativa com informação em falta |
|
||||
| Ausência declarada de despesas autónomas | Lucro/base3130;colecta1001,60MZN | Ausência com suporte;imposto autónomo0 | Ausência contraditória com despesa36g fica pendente |
|
||||
| Cooperativa integralmente abrangida | Base3130;colecta geral1001,60MZN | Taxa16%;colecta500,80MZN | Base/proveitos não alterados;sem retenções/créditos abatidos |
|
||||
| Máquina industrial existente:base1000,taxa10%,quota contabilística120 | Quota normal100;lucro/base6260;colecta2003,20MZN | Quota acelerada150,mas dedução limitada120;diferença adicional20 | Lucro/base6240;colecta1996,80MZN;sem deduzir50 nem150 outra vez |
|
||||
|
||||
**Cálculo → gravação → recuperação → relatório:** fotografia10 opcional no mesmo livro/snapshot, chave com entradas/contexto e histórico imutável anterior. SemL7, a fotografia9 aceite e a sua chave/totais permanecem iguais. Recalcular não acumula imposto nem duplica o acréscimo. HTML e dossier financeiro mostram referênciaL6, efeitosL7, parcelas autónomas, fonte, condições, período e limitações; recuperação e download demonstrados no componente real. Uma mudança de origem/entradas torna a fotografia anterior histórica; não altera o registo anterior. M20/M22 conservam a preparaçãoL6 de referência: **este incremento não transporta efeitosL7 para campos oficiais por aproximação**, nem resolve as divergências documentais existentes.
|
||||
|
||||
**Provas novas:** Wayfinder `--with-form` gerou routes/actions pelo wrapper QA; TypeScript e build QA passaram. Dezanove testes dirigidos novos passaram, incluindo comparação exacta com a fotografia9 aceite, duplicação, período curto, opção especial de cooperativa, ausência contraditória, dados em falta e contexto apresentado sem despejar snapshots internos. API privada:1teste/108asserções, `simulator_fiscal_delta_20261021_test`,127.0.0.1:55441, transacção com rollback e guarda de identidade/base; seis casos recuperados com plano/livro/históricos idênticos. UI do componente real: alteração de classificação, informação em falta, ausência, cooperativa mista, cumulação pendente, gravação/recuperação local e exportação; sem erros de página. A prova local é distinta da API. Não houve testes/escrita no activo nem repetição das suites funcionais aceites de L3, ISPC, câmbio ou L5/L6.
|
||||
|
||||
**Entrega agrupada preparada:** qualificação + despesas autónomas, cooperativa integralmente elegível e amortizaçãoCBF16 no recorte acima. Despesa autónoma e cooperativa também foram demonstradas juntas:parcela35 sem redução,colecta sobre a base516,80 e combinada551,80MZN no exemplo de base3230. Isto não autoriza cumulação cooperativa+CBF16: essa combinação mantém resultado dependente indeterminado. A futura instalação segue o procedimento Git existente, com backup/restauro fresco e conferência do delta; não foi executada nesta passagem.
|
||||
|
||||
**SaldoL7 na mesma matriz:**
|
||||
|
||||
| Natureza | Ainda fora da cobertura / exemplo | Condição concreta de retoma |
|
||||
| --- | --- | --- |
|
||||
| Código | Despesa autónoma fora de linha36g calculada ou parcela ainda não segregada | Implementar origem/segregação correspondente e prova da incidência;não copiar montante para uma segunda despesa |
|
||||
| Código | Cooperativa com actividade abrangida e outra não abrangida,ou rendimento sujeito a retenção | Segregar proveitos/custos/base e aplicar o tratamento apenas à parcela elegível;L5 conserva a retenção |
|
||||
| Código | CBF16 em imóvel reabilitado,outra categoria,quota inferior à máxima,método degressivo,duodécimos,quotas anteriores ou exercício posterior | Corresponder regra e cronologia respectivas e reutilizar o activo/quotas existentes;pendênciaL6 limita apenas o activo dependente |
|
||||
| Código/documento por caso | Cooperativa+CBF16 ou outro benefício positivo a cumular | Identificar compatibilidade,ordem e limites específicos;implementar a combinação,sem presumir soma de benefícios |
|
||||
| Código | Mais-valias61-A,demais isenções/deduçõesCBF17–19,regimes sectoriais/territoriais e operações especiais | Implementar a família/parcelas já delimitadas na secção anterior;período e fonte específicos,sem nova pesquisa transversal |
|
||||
| Documento por caso | Estatuto/título/excepçãoCBF ou prova das condições em falta;endereçoZEE sem estatuto | Juntar o elemento que a disposição exige ou registar condição negativa;localização isolada permanece insuficiente |
|
||||
| Transporte/documento | CampoM20/M22 para efeitoL7,edição divergente ou representação não correspondida | Correspondência do campo/edição e regra de representação demonstradas;preservar o cálculo independente exacto |
|
||||
| ÂmbitoL8 | Direito potencial ao créditoCBF15,aplicação anual de créditos,retenções,pagamentos e saldo final | Executar o mecanismo próprioL8;nenhuma dedução/compensação anual é presumida neste lote |
|
||||
|
||||
Fontes reutilizadas: inventário autorizado8143ficheiros; originaisCIRPC/alterações e CBF/compilaçãoAPIEX já identificados na delimitação,com hashes conservados. Sem activação por consulta ou revalidação jurídica genérica. Recibo: `docs/investmoz/simulations/irpc-l7-common-qa-20261026.json`. Provas locais: `outputs/irpc-l7-common/`; reprodução dirigida: `node --test tests/frontend/irpc-special.test.mjs`, `php tools/irpc-special-qa.php routes`, `php tools/irpc-special-qa.php test`, `tsc --noEmit`, build com `INVESTMOZ_QA_BUILD=1`.
|
||||
|
||||
## 26/10/2026 — preparação da entrega L7 e preservação do main concorrente
|
||||
|
||||
A entrega do âmbito QA `ab2ff2fd` integra o `main` concorrente `a2122dc3`, sem substituir as alterações de apresentação/navegação. Os seis ficheiros de execução L7 conservam exactamente o código QA;os oito ficheiros concorrentes conservam exactamente o código do main. Reutilizadas as provas19testes/API108/UI/tipos/build de L7. O conflito documental foi resolvido recuperando586linhas de histórico do manual que tinham sido removidas no merge concorrente,sem apagar a sua notaV2-01 no CSV. As3555linhas mantêm-se,com o único delta fiscal emAUD-SIM-INT02. O registo de instalação só será actualizado após backup/restauro fresco,conferência do destino e conclusão da entrega Git;esta nota não a antecipa.
|
||||
|
||||
## 26/10/2026 — primeira entrega agrupada L7 instalada pelo Git
|
||||
|
||||
Instalada `e07f89da3d59d06aa1b8c50c22a478b7b167bfdd` (integração do código QA `ab2ff2fdbcbe6fb94f03e4bc4cc7ccbd647d94fc` com o main concorrente`a2122dc3`),com `5aaf1a56f9d928331364fcc8b0d1528e51dba327` preservado como versão anterior. Os seis ficheiros de execução L7 são exactamente os da prova QA aceite;as sete alterações concorrentes de apresentação/navegação e o respectivo teste foram preservados. Recuperadas586linhas de histórico do manual removidas no merge concorrente;notaV2-01 conservada,sem alterar o seu conteúdo.
|
||||
|
||||
Backup fresco `2026-10-26T10:55:59Z`;restauro isolado sem rede/55441 verificou174tabelas por contagem/checksum e369ficheiros/configuração. Conferidos13ficheiros de execução do delta,50protegidos e31originais. Schema,roles/grants e permissões mantêm-se;172tabelas de negócio iguais ao backup. Cache/sessões reconciliadas por eventos operacionais e acessos públicos,sem inferir perda por RLS. A versão activa e a anterior foram preservadas durante o arquivo conferido de dependências antigas para recuperar espaço;nenhum dado,original ou backup foi eliminado.
|
||||
|
||||
Revisão/manifest público,marcadoresL7/L6/câmbio,assets e simuladorHTTP200 conferidos. Procedimento Git concluído;provas funcionais aceites19testes/API108/UI/tipos/build reutilizadas. Os controlos automáticos obrigatórios da instalação ficaram registados no recibo,sem nova ronda manual dos casos aceites. Sem migrações,importações,recálculo de históricos ou escrita privada sintética no activo.
|
||||
|
||||
Disponíveis apenas qualificação e tratamentos demonstrados:despesas61(4) sobre36g já ajustado,cooperativas12 integralmente abrangidas eCBF16 no recorte documentado. L6 permanece operacional no âmbito aceite;as suas pendências condicionam só dependentes. L7/IRPC não estão integralmente concluídos;localização não concede benefício;saldo final permaneceL8. O estado anterior deQA sem instalação é histórico. Recibo:`docs/investmoz/simulations/irpc-l7-common-delivery-20261026.json`.
|
||||
|
||||
## 26/10/2026 — saldo concreto de L7 após a primeira entrega agrupada
|
||||
|
||||
O âmbito demonstrado compreende qualificação comum, imposto autónomo61(4) sobre parcelas36g já calculadas emL6, cooperativas12 integralmente abrangidas e amortizaçãoCBF16 nos activos/período/método expressamente suportados. L7 permanece parcial. Este saldo distingue implementação de prova documental por caso; não cria outra matriz nem exige revalidação genérica das fontes aceites. L6 mantém o estado operacional delimitado e as suas pendências; só condiciona tratamentos que efectivamente dependam delas.
|
||||
|
||||
### Código ainda por implementar
|
||||
|
||||
| Tratamento / caso fora da cobertura | Exemplo | Condição concreta de retoma |
|
||||
| --- | --- | --- |
|
||||
| Despesas autónomas fora de parcela36g calculada e segregações adicionais | Despesa100 com apenas60 correspondidos no mapa de origem,ou encargo não incluído no resultado de partida | Implementar origem/parcela e reconciliação próprias,documentar incidência61(4) e impedir nova contabilização/acréscimo da mesma despesa. O ramo já entregue36g não é reaberto. |
|
||||
| Cooperativas com rendimentos mistos/retidos;demais isenções por natureza da entidade,CIRPC9–14 | Cooperativa com actividade agrária e serviços não abrangidos;associação com rendimentos comerciais acessórios | Segregar proveitos,custos e base elegível e implementar o artigo específico. Não reduzir a base inteira nem estender a redução às retençõesL5. |
|
||||
| ExtensõesCBF16 e combinações de benefícios | Imóvel reabilitado,método degressivo,quota inferior à máxima,duodécimos,quotas anteriores,ano posterior,cooperativa+CBF16 | Corresponder a regra temporal/método/contabilização e a compatibilidade/ordem/limite da combinação;reutilizar activo e quotas. Tabela ou casoL6 em falta impede apenas o activo dependente. |
|
||||
| Mais-valias autónomas61-A e operações especiais | Ganho100 já incluído no resultado em2026;entrada de activos/fusão;perda transferida de outra sociedade | Implementar apuramento/parcela e reconciliação com resultadoL6,sem dupla incidência ou compensação de perdas presumida;para operações,aplicar54–56/41-A e preservar valores históricos. |
|
||||
| Deduções/majoraçõesCBF17–19 e crédito potencialCBF15 | Formação sem ramo/base de limite;investimento novo com activos elegíveis e excluídos | Implementar elegibilidade,base,limite,ordem,janela temporal e não cumulação. CBF15 emL7 delimita direito/origem/crédito potencial;utilização anual,limitação por créditos/saldos e liquidação ficam emL8. |
|
||||
| Regimes sectoriais/territoriais e disposições especiais | Projecto emZEE sem tratamentoIRPC correspondido;actividade mineira/petrolífera com regime próprio | Implementar a disposição/versão/período aplicáveis ao projecto e à parcela (CBF20–48 ou diploma específico). Endereço/código sectorial só identifica candidato;benefício aduaneiro não se transforma em benefícioIRPC. |
|
||||
| Transporte de efeitosL7 paraM20/M22 | Imposto autónomo ou redução calculados mas sem campo/edição correspondente | Implementar apenas a correspondência demonstrada e a representação aplicável;conservar os montantes exactos e a preparaçãoL6 de referência,sem campo/taxa provisórios. |
|
||||
|
||||
### Dependências documentais que condicionam apenas o caso afectado
|
||||
|
||||
| Elemento em falta / dúvida concreta | Exemplo | Condição de retoma |
|
||||
| --- | --- | --- |
|
||||
| Classificação/incidência,parcela e período da operação | Há uma despesa36g e falta qualificar61(4);ou há actividade elegível e outra não abrangida | Associar prova/declaração da natureza e parcela ao exercício correcto. Informação em falta continua indeterminada;condição negativa e ausência declarada têm suporte próprio. Não inferir pela falta de anexo. |
|
||||
| Estatuto e reconhecimento exigidos pela disposição | Endereço numaZEE sem estatuto do projecto;CBF16 sem instrumento10 ou norma de excepção | Juntar o elemento concreto exigido ou documentar a condição negativa/excepção aplicável. Não pedir aprovador ou parecer jurídico genérico adicional. |
|
||||
| Norma/período/compatibilidade específicos ainda não correspondidos | Redução com termo31/12/2025 pretendida em2026;cumulação cooperativa+CBF16 | Disposição de vigência/prorrogação efectiva ou correspondência da combinação e seus limites. Sem informação nova,não repetir pesquisa transversal;prosseguir com os restantes casos. |
|
||||
| Edição,campo ou representação do formulário | EfectoL7 com campoM20/M22 não identificado ou fracção sem regra de representação | Identificar exemplar/edição,instrução/campo e forma de representar o valor;limitar a pendência ao transporte afectado. O cálculo independente mantém-se disponível. |
|
||||
|
||||
**Limites conservados:** localização não concede benefícios automaticamente;benefício desconhecido não é zero;colecta normal,L7 e imposto autónomo permanecem discriminados. Retenções,pagamentos,aplicação anual de créditos e saldo final a pagar/recuperar continuam emL8. As provas aceites não são invalidadas por esta lista nem por uma dúvida documental num caso independente.
|
||||
|
||||
## 26/10/2026 — reconciliação do estado servido L7 e capacidade do instalador
|
||||
|
||||
Conferência autenticada por leitura em `2026-10-26T13:56:51.412248+02:00` (Africa/Johannesburg):o portal,o registo do instalador e o main actual coincidem em `e07f89da3d59d06aa1b8c50c22a478b7b167bfdd`. **L7 já está instalado no âmbito demonstrado**,com origemQA`ab2ff2fd`;o estado «ainda emQA,sem instalação» é histórico/desactualizado. A instalação terminou em26/10/2026 às13:02:35 locais;backup anterior às12:55:59 e restauro174tabelas/369ficheiros permanecem comprovados pelo recibo de entrega. Nesta passagem,o dump e o arquivo de ficheiros ainda coincidem com os hashes desse backup e a prova de restauro refere o mesmo dump. Não foi apresentado um novo backup/restauro como executado,nem repetida a instalação da revisão já activa.
|
||||
|
||||
**Partição do instalador e backup:**`/dev/md2 / ext4`;release,state,backup,tmp eDocker no mesmo dispositivo. Livres5.52GiB e21448231inodes de29089792. O código do instalador mantém o limiar5GiB;os ficheiros do backup observado ocupam0.164GiB. A leitura satisfaz5GiB+um backup desse tamanho,com margem0.35GiB. A release actual tem28674ficheiros e2503directórios sem seguir links,como referência de escala,não um novo limite arbitrário de inodes. Futuras entregas devem voltar a medir a capacidade imediatamente antes da operação;estes números não garantem uma carga futura diferente. Nenhuma limpeza local/remota foi executada;SGF TEMPO não foi afectado.
|
||||
|
||||
**Só o delta L7:**seis hashes de código correspondem à provaQA;revisão/manifest,sete marcadoresL7,quatroassets e entrada do simuladorHTTP200 conferidos. Reutilizadas as provas19testes/API108/UI/tipos/build e as provas anteriores de preservaçãoL6/L3/ISPC/câmbio;sem nova ronda funcional,escrita privada sintética,migração ou importação. A revisão activa e a anterior permanecem preservadas.
|
||||
|
||||
**Próximo conjunto delimitado para implementaçãoQA:CBF16 com duodécimos.** Reutilizar activos,tabela/taxa normal máxima,método constante,qualificaçãoCBF e periodizaçãoL6 existentes. Primeiro caso:exercício anual civil2026 com entrada em uso durante o ano;imóvel novo do projecto ou máquina industrial/agro-industrial já suportada;sem quotas anteriores,saída ou cumulação de outros benefícios. Ligar a quota mensalL6 ao incrementoCBF16,limitando ao contabilizado/saldo fiscal e mostrando apenas a diferença adicional. Demonstrar condição satisfeita,negativa,informação em falta e ausência declarada,cálculo→gravação→recuperação→relatório,efeitos no lucro/base/colecta e conservação dos históricos. Este conjunto está apenas delimitado:não é novo cálculo instalado.
|
||||
|
||||
Degressivo,reabilitados/usados/reavaliados,quotas anteriores e cumulação cooperativa+CBF16 continuam nos casos próprios. O saldo anterior de sete grupos de código e quatro dependências documentais permanece na mesma matriz,com exemplos/condições de retoma;nenhuma pendência foi apagada. Documento individual em falta limita só o activo/caso dependente. Localização não concede benefício. **L6 operacional delimitado;L7 parcial;retenções,pagamentos,créditos anuais e saldo final emL8.** Recibo:`docs/investmoz/simulations/irpc-l7-server-state-20261026.json`.
|
||||
|
||||
## 26/10/2026 — CBF16 com duodécimos demonstrado em QA
|
||||
|
||||
**QA preparado, sem instalação.** O portal mantém `e07f89da`, incluindo o primeiro conjuntoL7 `ab2ff2fd`. Este incremento implementa a ligação CBF16–duodécimos delimitada no recibo `irpc-l7-server-state-20261026.json`. L6 permanece operacional no âmbito aceite;L7 continua parcial;L8 conserva retenções,pagamentos,aplicação anual de créditos e saldo final a pagar/recuperar. SGF TEMPO não foi afectado.
|
||||
|
||||
**Reutilização e condições:** a opção «Preparar CBF16 com duodécimos» é explícita e conserva os activos,datas,valores e restantes escolhas. O utilizador confirma a reutilização dos meses e da opção mensal do mapaL6. Sem essa opção,os livros/resultados entregues permanecem na fotografia10,com a mesma chave e valores. Com ela,a fotografia11 guarda a preparação,o cálculo e o histórico10 anterior. É possível manter a preparação anual sem alterar automaticamente activos ou apagar resultados anteriores.
|
||||
|
||||
Recorte demonstrado:exercício anual civil2026,activo novo já suportado emL6,imóvel novo afecto ao projecto ou máquina industrial/agro-industrial das categorias correspondidas,método constante pela taxa normal máxima,entrada emuso durante2026,sem saída,quotas anteriores ou cumulação de outros benefícios. Mantêm-se prova das condiçõesCBF3/9,reconhecimento10 quando exigido (ou excepção identificada),afectação e período. Localização/sector não activam benefício. Os meses calculados por L6 incluem o mês da entrada emuso;não se introduz cálculo diário nem uma segunda agenda de amortização.
|
||||
|
||||
**Cálculo:** usa o motor de amortizaçõesL6 existente,com taxa normal×1,5 e os mesmos duodécimos/12. Mantém base depreciável,terreno/residual,limite contabilístico e saldo fiscal. L7 aplica apenas a diferença entre a dedução fiscal normal e a acelerada;não cria outro activo ou uma segunda depreciação contabilística. Os outros activos do mapa conservam a quota normal. O resultado de referênciaL6 e o resultado apósL7 são apresentados separadamente.
|
||||
|
||||
| Caso sintético | Valores demonstrados |
|
||||
| --- | --- |
|
||||
| Máquina existente:base1000,taxa normal10%,entrada15/07/2026,6duodécimos,contabilizado60 | Quota normal50;quotaCBF16 75;dedução limitada60;diferença adicional10MZN. Lucro/base de referência6310 e colecta2019,20;apósL7 lucro/base6300 e colecta2016,00MZN. Saldo finalL8indeterminado. |
|
||||
| Entrada emOutubro,3duodécimos | Quota normal25;quotaCBF16 37,50;diferença12,50 quando o contabilizado a suporta. |
|
||||
| Entrada emDezembro,1duodécimo | Quota normal25/3,quotaCBF16 25/2;diferença exacta25/6MZN,sem arredondamento fiscal presumido. Aproximação de apresentação e valor exacto permanecem distintos. |
|
||||
| Imóvel novo já classificado emL6 | Terreno/residual e base são reutilizados;taxa e meses aplicam-se à mesma base. O exemplo confirma quota40→60,limitada50,com diferença10. |
|
||||
| Falta de suporte da opção/datas/condições | CBF16 fica indeterminado;entradas e referênciaL6 conhecidas conservadas. Não substituir desconhecido por zero. |
|
||||
| Condição negativa / ausência declarada | Estados distintos e documentados;nenhuma taxaCBF16 aplicada à parcela negativa;ausência produz efeito zero justificado. |
|
||||
|
||||
**Demonstração executada:**15testes dirigidos novos,com comparação exacta dos três livros10 aceites (despesa autónoma,cooperativa e amortização anual),sem repetir as suas suites funcionais. API privada:1teste/89asserções,cinco casos mensal/fracção/falta/negativa/ausência,em `simulator_fiscal_delta_20261021_test`,127.0.0.1:55441,guarda de identidade/base e transacção com rollback. Cálculo→gravação→recuperação→HTML e dossier financeiro conferidos a partir dos casos recuperados,com plano/activos/históricos conservados. Recalcular não acumula a diferença adicional. Alterar a data invalida a fotografia corrente sem alterar a anterior.
|
||||
|
||||
UI do componente real:opção explícita/cancelamento,alteração das datas e opção mensal no activoL6,informação em falta,6→3duodécimos,limite75→60,diferença10,fracção25/6,gravação/recuperação local e download do relatório;sem erros de página. Esta prova local é distinta da API. Wayfinder`--with-form`,TypeScript e buildQA passaram. Não houve escrita no activo,migração,importação,activação por consulta de fonte ou nova ronda das provas não afectadas deL3/ISPC/câmbio/L5/L6. O motor de amortizaçõesL6 não foi alterado.
|
||||
|
||||
**Saldo e condição de retoma:** este recorte cobre duodécimos em exercício anual civil2026;períodos fiscais curtos/autorizados distintos,saídas,anos posteriores,quotas anteriores,quota escolhida inferior à máxima,degressivo,reabilitados/usados/reavaliados e cumulações mantêm correspondência própria. Retomar cada caso quando a respectiva regra/período/contabilização e compatibilidade estiverem ligados ao activo/documentos já existentes,e demonstrar só o seu efeito novo. Uma pendênciaL6 afecta apenas o activo dependente. Os restantes grupos do saldoL7 e os camposM20/M22 ainda sem correspondência mantêm-se;este lote não preenche campos oficiais por aproximação nem conclui o IRPC.
|
||||
|
||||
**Entrega agrupada:** os casos compatíveis mensal/fracção/negativa/ausência/informação insuficiente acompanham o mesmo candidato. A capacidade remota de5,52GiB/21448231inodes observada às13:56:51 de26/10 é histórica,não confirmação para nova instalação. Antes da próxima entrega,medir outra vez espaço/inodes na partição de release+backup+temporários,confrontar com o limiar existente5GiB e o backup/carga dessa execução,conferir o main então actual e executar backup/restauro fresco. Manter a versão activa até a nova ficar pronta. Não executar limpeza local ou doSGF para substituir esse controlo remoto.
|
||||
|
||||
Fontes e inventário8143 reutilizados dos cotejos aceitesCBF16 eDecreto72/2013art9;originais preservados,sem pesquisa transversal repetida. Recibo:`docs/investmoz/simulations/irpc-l7-months-qa-20261026.json`;provas locais:`outputs/irpc-l7-months/`. Reprodução dirigida: `node --test tests/frontend/irpc-special-months.test.mjs`; `php tools/irpc-special-months-qa.php routes`; `php tools/irpc-special-months-qa.php test`; `tsc --noEmit`; build com `INVESTMOZ_QA_BUILD=1`.
|
||||
|
||||
## 26/10/2026 — CBF16 com duodécimos instalado pelo Git
|
||||
|
||||
Instalado `0bd5d495505d512088887efd3dc5c61f645b1647`,com `e07f89da3d59d06aa1b8c50c22a478b7b167bfdd` preservado como versão anterior. O main não apresentava divergência;integração por fast-forward sem alterações de código à candidataQA. Backup fresco `2026-10-26T12:34:42Z` e restauro isolado sem rede/55441:174tabelas e369ficheiros/configuração conferidos. Capacidade medida imediatamente antes:5.50GiB e21448052inodes;depois do backup:5.33GiB,acima do limiar existente5GiB,com inodes disponíveis confrontados com a carga observada. Sem limpeza local/remota ou intervençãoSGF.
|
||||
|
||||
Conferidos3ficheiros do delta,60ficheiros de execução protegidos e31originais. Schema,roles/grants e permissões iguais;172tabelas de negócio mantêm o backup,cache/sessões reconciliadas com eventos operacionais/acessos públicos. Revisão/manifest,marcadoresCBF16 e suporte10,assets e simuladorHTTP200 conferidos. Sem migrações,importações,recálculo de históricos ou escrita privada sintética no activo. Reutilizadas as provasQA15testes/API89/UI/tipos/build;apenas os controlos automáticos obrigatórios do procedimentoGit e a conferência do delta instalado.
|
||||
|
||||
O exemplo mantém quota normal50,quotaCBF16 75 limitada ao contabilizado60:dedução adicional**60−50=10MZN**,não75 nem uma segunda amortização. Lucro/base apósL7 6300 e**colecta simulada2016MZN**;saldo final a pagar/recuperar por determinar emL8. Os tratamentos de despesas autónomas,cooperativas abrangidas e amortizações anuais anteriores permanecem disponíveis,com fotografias/históricos conservados. O estadoQAsem instalação é histórico para este incremento.
|
||||
|
||||
**SaldoL7:**CBF16 anual com duodécimos entregue;continuam fora deste recorte períodos curtos/não civis,saídas,anos/quotas anteriores,métodos/categorias não correspondidos,cumulações e restantes famílias/transportesM20M22 já discriminados na mesma matriz. Retoma por regra/período/contabilização e compatibilidade do caso;documentos em falta só limitam o dependente. O próximo conjunto a executar emQA é**CBF16 em período curto por início de actividade de residente em2026**,reutilizando tipo/período e mesesL6,sem anualizar base ou taxa. Cessação,transição e outras extensões conservam âmbito próprio. L6operacional delimitado;L7parcial;localização não concede benefício;L8conserva liquidação final. Recibo:`docs/investmoz/simulations/irpc-l7-months-delivery-20261026.json`.
|
||||
|
||||
## 26/10/2026 — CBF16 no início de actividade demonstrado em QA
|
||||
|
||||
**QA preparado, sem instalação.** O portal mantém `0bd5d495`, com duodécimos anuais e os tratamentos anteriores preservados. Este incremento cobre apenas CBF16 num período curto por início de actividade de residente em2026,com meses completos até31/12. Reutiliza período,tipo,suporte e activosL6,sem anualizar resultados. Não altera o motor cambial/de amortizaçõesL6 nem volta a pesquisar fontes/provas aceites.
|
||||
|
||||
A preparação é explícita dentro dos duodécimosCBF16. Pode reutilizar o suporte já declarado emL6 por acção do utilizador,sem modificar datas,activos ou qualificação. Exige condiçõesCBF3/9,reconhecimento10 quando aplicável ou excepção identificada,afectação do activo e suporte do período. Activo novo já correspondido,entrada emuso no período,método constante pela taxa normal máxima,sem quotas anteriores,saída ou cumulação. A localização não activa benefícios. Sem a nova opção,as fotografias10/11 mantêm chaves e resultados;com ela,a fotografia12 conserva o resultado11 e todo o histórico anterior.
|
||||
|
||||
| Caso novo | Efeito demonstrado |
|
||||
| --- | --- |
|
||||
| Início1Julho;máquina com entrada15Julho,base1000,taxa10%,contabilizado60 | 6mesesL6;quota normal50,acelerada75,limitada60:dedução adicional10MZN. Lucro/baseL6 3130→L7 3120;colecta simulada1001,60→998,40MZN. Saldo finalL8indeterminado. |
|
||||
| InícioOutubro / Dezembro | 3 /1meses efectivos;sem anualização. Dedução adicional5 /5/3MZN,com fracção exacta e aproximação de apresentação separadas. |
|
||||
| Suporte em falta | SóCBF16 fica indeterminado;referênciaL6 conhecida e entradas conservadas. |
|
||||
| Condição negativa / ausência declarada | Estados distintos e justificados;efeito zero identificado,sem taxa acelerada aplicada à parcela negativa. |
|
||||
|
||||
Provas novas dirigidas:9testes;API privada1teste/97asserções emQA isolada127.0.0.1:55441/base `simulator_fiscal_delta_20261021_test`,com guarda e transacção/rollback. Cinco casos passaram cálculo→gravação→recuperação→HTML e dossier financeiro. Comparação exacta do resultado11 aceite e conservação de todo o histórico,plano,activos e outros livros;recalcular não acumula deduções. Interface real demonstrou preparar/cancelar,reutilizar suporteL6,pendência,limites,fracções,guardar/recuperar e exportar,sem erros. Wayfinder`--with-form`,TypeScript e buildQA passaram. Conferidos584ficheiros protegidos e31originais sem alteração;nenhuma migração/importação/escrita privada no activo. SGF TEMPO separado.
|
||||
|
||||
**Saldo concretoL7 — código:**(1)outras origens/parcelas de despesas autónomas;(2)cooperativas mistas/retidas e demais entidades9–14;(3)CBF16 cessação/transição/períodos não civis,saídas,quotas/anos anteriores,quota inferior,métodos/categorias e cumulações;(4)mais-valias61-A/operações54–56/41-A;(5)CBF17–19 e direito potencial15;(6)regimes sectoriais/territoriais;(7)transporteL7M20/M22. A extensão de início de actividade sai deste saldo apenas no recorteQA acima;cessação é um próximo candidato compatível,reutilizando o períodoL6,com regra/quotas/saída próprias a demonstrar antes de se declarar suportada.
|
||||
|
||||
**Documentos por caso — exemplos/retoma:**despesa36g sem qualificação61(4)→associar natureza/parcela/período;projecto sem reconhecimento10→instrumento ou norma de excepção exigida;cumulação cooperativa+CBF16→disposição aplicável,ordem e limites;efeitoL7 sem campoM20/M22→exemplar/edição/campo e representação das fracções. Não são novos aprovadores ou revalidações genéricas. A dúvida limita o caso/campo dependente;as demais provas permanecem válidas.
|
||||
|
||||
Entrega agrupada preparada para os cinco casos compatíveis,sem instalação deste incremento. Na futura entrega:medir novamente espaço/inodes/carga de compilação e backup,conferir o main então actual e executar backup/restauro fresco,mantendo a versão activa até a nova ficar pronta. O controlo de5,50GiB antes/5,33GiB após backup desta entrega0bd5d495 é histórico,não garantia futura. **L6 operacional delimitado;L7 parcial;colecta distinta do saldo final deL8.** Recibo:`docs/investmoz/simulations/irpc-l7-start-period-qa-20261026.json`;provas:`outputs/irpc-l7-start-period/`. Reprodução dirigida:`node --test tests/frontend/irpc-special-start-period.test.mjs`;`php tools/irpc-special-start-period-qa.php routes`;`php tools/irpc-special-start-period-qa.php test`;`tsc --noEmit`;build com `INVESTMOZ_QA_BUILD=1`.
|
||||
|
||||
## 26/10/2026 — CBF16 cessação e quotas anteriores: entrega agrupada preparada em QA
|
||||
|
||||
**QA, sem instalação.** O conjunto inclui `ba83afe7` (início de actividade) e acrescenta cessação da actividade em2026 e quotas anteriores documentadas de activos que entraram emuso em2025. A versão do portal comunicada permanece `0bd5d495`;não se voltou a instalar ou a conferir remotamente o activo nesta passagem. O main entretanto avançou para `ae0d74bb`;a candidata incorpora a alteração visual de «Porquê investir»,a nota do manual e a linhaV2-01 da matriz,sem perda das notas fiscais. Nenhum ficheiro dessa alteração foi substituído pelo incrementoL7.
|
||||
|
||||
**Condições e reutilização.** Preparação opcional13,distinta de início12 e do recorte mensal11,sem alteração das chaves/resultados anteriores. Usa sujeito/período/activos/quotas e saldosL6. CBF3/9/10/16,Decreto72/2013 art3(3),9(1–3) e10 eCIRPC7(4):condições/afectação/reconhecimento ou excepção identificados,ano civil2026 ou cessação de residente desde1Janeiro até ao último mês completo,contabilização/saldos reconciliados,método constante pela taxa normal máxima,duodécimos desde entrada emuso e ausência de cumulação. Localização não concede benefício.
|
||||
|
||||
O recorte de implementação admite activos novos a custo histórico com entrada2025/2026. A selecção destes anos é coberturaQA,não um limite legal inventado para os restantes activos. Valores anteriores contabilísticos,fiscais,parcela temporariamente tributada e suporte são reutilizados deL6;não se recalculam taxas/benefícios de exercícios passados. Uma entrada em2026 com quotas anteriores positivas fica por reconciliar. Informação em falta não é zero;condição negativa e ausência declarada permanecem distintas.
|
||||
|
||||
**Cessação não é saída do activo.** O termo do período limita os meses efectivos,sem preencher transmissão/inutilização por presunção. Uma saída de activo documentada dentro do período reutiliza a dataL6 e exclui o mês do evento,conformeart9(2);sem ela,reutiliza os meses do período. Este ramo só apura a amortização,não calcula uma mais-valia ou operação de transmissão por aproximação.
|
||||
|
||||
| Caso sintético novo | Efeito no cálculo |
|
||||
| --- | --- |
|
||||
| Cessação30Junho,activo emuso desdeJaneiro2026,sem quotas anteriores,contabilizado60 | 6meses;quota normal50,acelerada75 limitada60;diferença adicional10MZN. Lucro/base3130→3120;colecta simulada1001,60→998,40MZN. Sem saída do activo presumida. |
|
||||
| Mesmo período,activo2025;quotas anteriores contabilísticas150,fiscais100,parcela recuperável50 | Dedução normal50;acelerada75,incluindo15 de parcela anterior. Diferença adicional25MZN,sem somar novamente os15. Saldo anterior aritmético50→35;saldo fiscal após dedução850→825. Lucro/base3130→3105;colecta simulada1001,60→993,60MZN. Os saldos declarados150/100/50 permanecem intactos. |
|
||||
| Ano civil2026,mesmos saldos anteriores,contabilizado120 | Dedução100→150,incluindo30 de parcela anterior;diferença adicional50MZN e saldo anterior aritmético20. Lucro/base6260→6210;colecta simulada2003,20→1987,20MZN. |
|
||||
| CessaçãoJunho com saída do activo documentada20Junho | 5meses;quota normal125/3 eacelerada125/2;diferença125/6MZN. Fracção exacta preservada,sem arredondamento fiscal presumido. |
|
||||
| Saldo fiscal remanescente20 ou contabilização/parcela anterior insuficiente | Ambos os cálculos respeitam os mesmos limites;dedução adicional pode ser zero,sem exceder a base nem consumir saldos oficiais. |
|
||||
| Suporte em falta / condição negativa / ausência declarada | Estados e efeitos separados;uma falta de suporteCBF16 mantém a referênciaL6 conhecida e limita apenas o benefício dependente. Um saldoL6 desconhecido limita também os cálculos que dele dependem. |
|
||||
|
||||
**Provas novas:**11testes dirigidos,API privada1teste/123asserções,sete casos cálculo→gravação→recuperação→HTML/dossier financeiro. BaseQA `simulator_fiscal_delta_20261021_test`,127.0.0.1:55441,guarda de identidade e transacção com rollback. Comparação exacta do resultado12 aceite,conservação de todo o histórico,activos,plano e outros livros;recalcular não acumula a dedução nem reduz os saldos declarados. Interface real:preparar/cancelar,preencher apenas os suportes novos,pendência,recuperação15/saldo35,saída5meses/fracção,gravação/recuperação/exportação e ausência/negativa,sem erros. Wayfinder`--with-form`,TypeScript ebuildQA passaram;build/tipos conferidos também após incorporar o main. Reutilizadas,sem repetir,as provas aceites de `ba83afe7` e dos restantes percursos. MotoresL6 de amortizações/periodização/câmbio,schema,configuração,permissões,originais e provas anteriores preservados. SGF TEMPO separado;nenhuma escrita no activo,migração ou importação.
|
||||
|
||||
**Saldo concreto — código:**(1)outras origens/segregações de despesas autónomas;(2)cooperativas mistas/retidas e demais entidades9–14;(3)CBF16 com activos anteriores a2025,períodos parciais/não civis/transição,saídas fora do recorte,quota inferior,métodos/categorias e cumulações;(4)mais-valias61-A/operações54–56/41-A;(5)CBF17–19 e direito potencial15;(6)regimes sectoriais/territoriais;(7)transporteL7M20/M22. O recorte agora demonstrado deixa de figurar como integralmente por implementar,mas permanece apenas emQA. Retomar extensõesCBF16 com a regra temporal/método/base ligada aos activos e demonstrar o efeito novo;retomar mistos/cumulações com segregação,ordem e limites,sem pesquisar novamente o que já está aceite.
|
||||
|
||||
**Dependências documentais por caso:**natureza/parcela/período da operação→associar os factos e o exercício;reconhecimentoCBF10→instrumento ou excepção exigida;quotas anteriores150/100/50 sem suporte→reconciliar a parcela temporariamente tributada,sem incluir exclusões permanentes;cumulação→disposição/ordem/limites aplicáveis;campoM20/M22→exemplar/edição/campo e representação exacta. A falta limita só o caso/campo dependente,não exige aprovadores ou revalidação genérica de fontes.
|
||||
|
||||
**Entrega agrupada preparada:**início12 de `ba83afe7` mais cessação/quotas anteriores13,com as provas aceites e novas separadas no mesmo pacote. Antes de instalar,voltar a conferir main,espaço/inodes/carga de compilação ebackup,executar backup/restauro fresco e manter a versão activa até a nova ficar pronta. **L6 operacional delimitado;L7 parcial;colecta simulada não é saldo final:retenções,pagamentos,créditos anuais e saldo a pagar/recuperar permanecem emL8.** Recibo:`docs/investmoz/simulations/irpc-l7-cessation-prior-qa-20261026.json`;provas:`outputs/irpc-l7-cessation-prior/`. Reprodução só do delta:`node --test tests/frontend/irpc-special-cessation-prior.test.mjs`;`php tools/irpc-special-cessation-prior-qa.php routes`;`php tools/irpc-special-cessation-prior-qa.php test`;`tsc --noEmit`;build com `INVESTMOZ_QA_BUILD=1`.
|
||||
|
||||
## 26/10/2026 — CBF16 início, cessação e quotas anteriores instalado pelo Git
|
||||
|
||||
**Instalado `632dc06930d6b4f1b012feb3b4daa3b1cfc53f39`,incluindo `ba83afe7`.** Entrega única do início de actividade,cessação e quotas anteriores no âmbitoQA demonstrado. `0bd5d495` permanece como release anterior;históricos e provas aceites conservados. O main `ae0d74bb` e a alteração visual de «Porquê investir» foram incorporados,preservando texto/cor/geometria e a linhaV2-01 da matriz. Sem instalação separada dos dois incrementos.
|
||||
|
||||
**Capacidade e recuperação:**a primeira medição confirmou 4.32GiB,abaixo do mínimo existente5GiB,e a falha anteriorae0d74bb por falta de espaço;versão activa preservada. Conferidas ausência de instalaçõesnpm e de ficheiros abertos,só a cache regenerável `/root/.npm/_cacache` foi limpa pelo comando npm próprio. Recuperados 2.82GiB;32logs npm anteriores e `_npx` preservados. Sem apagar releases,backups,dependências dos projectos,provas únicas ou ficheirosSGF. Nova medição:7.15GiB e21431150inodes;após backup:6.99GiB,acima do limiar5GiB,com capacidade de backup/compilação e escala de inodes conferidas. O limiar do instalador não foi reduzido.
|
||||
|
||||
Backup fresco `2026-10-26T13:29:24Z`:174tabelas e369ficheiros/configuração conferidos;restauro isolado sem rede/porta55441 com174checksums iguais. Schema,roles/grants e permissões mantidos. Só depois destas guardas,integraçãoGit por fast-forward sem forçar o histórico. A release anterior ficou activa até a nova estar pronta. Revisão/manifest servidos,marcadores12/13 e restantes leitores,assets e simuladorHTTP200 conferidos após instalação. Três ficheiros do delta fiscal,60ficheiros protegidos/enquadrados no main e31originais correspondem ao destino preparado. Dados de negócio comparados com o backup;cache/sessões reconciliadas com eventos operacionais/acessos públicos. Sem migrações,importações ou escrita privada sintética no activo.
|
||||
|
||||
**Resultado demonstrado preservado:**dedução normal50MZN→acelerada75MZN;**75−50=25MZN adicionais**. Os15MZN recuperados de quotas anteriores **já estão incluídos nos75**,não são somados novamente. Saldo anterior aritmético35MZN;valores declarados150/100/50 e históricos mantidos,sem consumo de saldos oficiais. Lucro/base3105MZN e**colecta simulada993,60MZN**;saldo final a pagar/recuperar permanece indeterminado emL8. Cessação da actividade não presume transmissão/inutilização dos activos;saída só quando documentada no mapa existente.
|
||||
|
||||
Reutilizadas as provas aceites:início12 (9testes/API97) e cessação/quotas13 (11testes/API123),UI real,gravação/recuperação/relatórios,tipos/build. Não se repetiram as respectivas suites por iniciativa desta entrega;apenas os controlos automáticos obrigatórios do procedimentoGit e a conferência do delta instalado. Os motoresL6 de amortizações,periodização e câmbio mantêm-se;L3,ISPC,L5 e demais provas aceites não foram reabertos. Recibo:`docs/investmoz/simulations/irpc-l7-grouped-delivery-20261026.json`;provas locais:`outputs/irpc-l7-grouped-delivery-20261026/`.
|
||||
|
||||
**SaldoL7 e próxima retoma:**continuam próprios as cumulações (por exemplo cooperativa+CBF16:identificar disposição,parcela elegível,ordem e limites antes de combinar),outras origens/segregações de despesas autónomas,cooperativas mistas/retidas e demais entidades,extensõesCBF16fora dos anos/períodos/métodos/categorias demonstrados,mais-valias61-A/operações54–56/41-A,CBF17–19/direito potencial15,regimes sectoriais/territoriais e transporteM20/M22. Mantém-se a separação entre código por implementar e documentos por caso:natureza/parcela/período,reconhecimento ou excepção exigida,saldos anteriores temporariamente tributados,norma/ordem/limites de cumulação e edição/campo/fracção. Uma falta limita só o caso/campo dependente;sem pesquisa transversal repetida ou aprovador genérico. **L6 operacional delimitado;L7 parcial;L8 conserva retenções,pagamentos,créditos anuais e saldo final.** Cada futura entrega volta a medir capacidade e executar backup/restauro fresco.
|
||||
|
||||
## 26/10/2026 — Cumulações L7 demonstradas em QA e saldo do simulador
|
||||
|
||||
**QA pronto,sem instalação.** `632dc069`,incluindo `ba83afe7`,está entregue e deixa de constituir pendência de instalação. A próxima candidata acrescenta apenas a qualificação e o cálculo das combinações abaixo;mantém resultados/entradas/históricos10–13. L6 continua operacional no âmbito demonstrado;L7 parcial;L8 conserva a liquidação final.
|
||||
|
||||
**Regra aplicada e fontes reutilizadas:**CBF4,APIEXp66,veda a cumulação dos benefícios específicos entre si ou com os genéricos,salvo previsão expressa. CBF13,APIEXp70,delimita os genéricos a investimentos não destinatários de específicos;CBF16,APIEXp72,é genérico. CIRPC12/14,PDF5/p768(59),reduz50% da taxa geral nas cooperativas abrangidas,excluindo rendimentos sujeitos a retenção. A correspondência agora implementada trata a reduçãoCIRPC12 e o efeitoCBF16 genérico em fases distintas,no mesmo sujeito/projecto/período,quando ambos estão qualificados e não há benefício específico nem outro benefício por corresponder. Não transforma o artigo4 numa proibição genérica de todos os tratamentosCIRPC, nem numa autorização de qualquer outra combinação. Não há novo parecer/aprovador genérico como condição;as condições dos artigos e documentos concretos continuam necessárias.
|
||||
|
||||
A opção «Preparar cumulações dos tratamentosL7 registados» reutiliza cooperativa,activos,períodos,despesas e suportes existentes. Discrimina presença/ausência de específicosCBF,excepção expressa invocada e outros benefícios,em lugar da antiga confirmação global de ausência de outros benefícios;esta entrada anterior permanece conservada,sem alteração automática das escolhas. Não selecciona benefício pela localização. Uma incompatibilidade não escolhe o tratamento a manter,não apaga registos e não aplica o benefício específico sem motor próprio. A nova preparação é opcional14;sem ela,as chaves/modelos anteriores permanecem exactos.
|
||||
|
||||
| Caso novo | Efeito demonstrado |
|
||||
| --- | --- |
|
||||
| Cooperativa agrária abrangida +CBF16 genérico,períodoJan–Jun2026 e activo2025/quotas anteriores já entregues | Lucro/baseL6 3130;CBF16 deduz só25adicionais e obtém3105;depois taxa16% sobre3105:colecta simulada496,80MZN. Os15recuperados já estão nos75deduzidos,sem outra dedução. Não se somam reduções monetárias calculadas sobre bases diferentes. |
|
||||
| Mesmo caso com despesa36g100 e incidência61(4) qualificada | Acréscimo100 já emL6:lucro3230→3205 após25CBF16;colecta ordinária512,80MZN à taxa16%;imposto autónomo35MZN separado,sem redução cooperativa;colecta combinada547,80MZN. Nenhum novo acréscimo da despesa. |
|
||||
| EspecíficoCBF22 declarado no mesmo projecto +genérico16,sem excepção expressa | Combinação incompatívelCBF4/13;totalL7indeterminado e entradas conservadas. ReferênciaL6 conhecida mantida. O artigo/taxa do benefício específico não é aplicado por presunção. |
|
||||
| Excepção invocada/outro benefício/presença de específico ou suporte em falta | Estado indeterminado até corresponder artigo,âmbito,período,ordem e limites. Não tratar desconhecido como ausência. |
|
||||
| Duplicação de activo ou dedução positiva não correspondida já registada na baseL6 | Impede reaplicar a mesma origem;registo e valor original conservados,sem preencher outro benefício por aproximação. |
|
||||
| Saldo fiscal20 /base tributável zero | Dedução respeita saldo e contabilização,sem saldo negativo. Numa base zero a colecta ordinária é zero,mas o imposto autónomo35 permanece,sem compensação pelo prejuízo. |
|
||||
| Condição cooperativa negativa /ausênciaCBF16 declarada | Apenas o tratamento efectivamente aplicável permanece;estados separados,sem forçar acumulação. |
|
||||
|
||||
**Ordem e limites:**diferença fiscalCBF16 uma vez→mesmas deduções/perdasL6→matéria colectável→taxa cooperativa16% na base integralmente elegível→imposto autónomo35% separado. Mantêm-se limites de contabilização,parcela anterior recuperável e saldo fiscal do activo,sem alterar os saldos declarados ou consumir saldo oficial. A redução não se estende a rendimentos mistos/retidos nem ao imposto autónomo. O relatório apresenta a origem documental/activo,a dedução normal,a acelerada,a recuperação já incluída e a única diferença adicional.
|
||||
|
||||
**Demonstração nova:**12testes dirigidos,API privada1teste/133asserções e sete casos cálculo→gravação→recuperação→HTML/dossier financeiro. BaseQA `simulator_fiscal_delta_20261021_test`,127.0.0.1:55441,guarda de identidade e transacção/rollback. Resultado13 aceite reproduzido exactamente e histórico integral,activos,saldos,plano e outros livros conservados;recalcular não acumula valores. Interface real demonstrou preparar/cancelar,preencher só as declarações novas,combinação permitida,incompatibilidade,excepção não correspondida,falta de informação,imposto autónomo separado,guardar/recuperar e exportar,sem erros. Wayfinder`--with-form`,TypeScript ebuildQA passaram. Sem repetir suites aceites,migração,importação ou escrita no activo;SGF TEMPO separado. MotoresL6 de amortizações/periodização/câmbio e31originais preservados.
|
||||
|
||||
**SaldoL7:**este recorte sai do grupo «cumulação ainda não implementada» apenas paraCIRPC12+CBF16 e a coexistência separada61(4),com as condições acima. Permanecem por implementar outras cumulações/excepções expressas,CBF17–19 e direito potencial15,regimes específicos,parcelas cooperativas mistas/retidas e demais entidades,outras origens de despesas,extensõesCBF16,mais-valias/operações especiais e transporteM20/M22. Retoma por disposição/artigo/ordem/limite e parcela identificados,implementando os tratamentos ainda ausentes;documento individual em falta limita só o caso/campo dependente. Não reabrir as provas aceites ou pesquisar outra vez dúvidas sem informação nova.
|
||||
|
||||
**Quanto falta no simulador:**a matriz conserva estimativas iniciais,sem uma reestimativa actual do esforço integral restante. SóL8–L14 somavam inicialmente240–416horas (30–52dias de8h);esta referência não é um saldo actualizado nem inclui resíduosL1–L7,L15–L16 ou espera documental. L8 contém liquidação/pagamentos/créditos/saldo final;L9–L14 contêm INSS,IRPS,Selo,direitos aduaneiros eICE;L15–L16,SISA/encargos imobiliários,ainda por dimensionar. L6 mantém5grupos de código e5documentais;L5 mantém as dez dúvidasAT só para os casos dependentes. Os lotes e grupos não são unidades iguais,não sustentam uma percentagem global de conclusão. A cobertura já entregue continua utilizável com limites explícitos;simulador fiscal integral permanece um trabalho de dezenas de dias na referência de planeamento,sem prazo fechado.
|
||||
|
||||
Entrega agrupada preparada com os sete casos novos compatíveis;incompatibilidade e informação insuficiente acompanham o mesmo candidato como estados demonstrados. Não houve instalação nesta passagem. A futura entrega requer main compatível,capacidade do servidor medida novamente ebackup/restauro fresco,mantendo a versão activa até a nova ficar pronta. Recibo:`docs/investmoz/simulations/irpc-l7-combinations-qa-20261026.json`;provas:`outputs/irpc-l7-combinations/`. Reprodução só do delta:`node --test tests/frontend/irpc-special-combinations.test.mjs`;`php tools/irpc-special-combinations-qa.php routes`;`php tools/irpc-special-combinations-qa.php test`;`tsc --noEmit`;build com `INVESTMOZ_QA_BUILD=1`. **L7 parcial;colecta simulada distinta do saldo finalL8.**
|
||||
|
||||
Conferência de compatibilidade:main `a7434cd2` incorporado na candidata,com apresentação/catálogo e linhas não fiscais da matriz preservados. Recuperada a adenda históricaQA13 que tinha desaparecido do manual no main;isto é perda documental,não perda do cálculo13. Só tipos/build de integração foram conferidos novamente;provas fiscais aceites conservadas. A revisão servida não foi consultada nesta passagemQA.
|
||||
|
||||
## 26/10/2026 — Cumulações L7 entregues pelo Git
|
||||
|
||||
**Instalado `f8d57bddf96b4610604a013fcc5bdd703c7dc6d5`.** A anteriora7434cd2,que já incluía632dc069,fica preservada. Main/candidata compatíveis;apresentação ecatálogo sectorial entregues entretanto mantidos. A notaQA anterior é histórica:não há pendência de instalação deste incremento.
|
||||
|
||||
Medição inicial:5.06GiB,com inodes suficientes,mas sem margem para o backup fresco mais o mínimo5GiB do instalador. Recuperados0.21GiB somente da cache versionada de compilaçãoNode em`/tmp/node-compile-cache`,sem gestores de pacotes ou ficheiros abertos. Fontes,node_modules,releases,backups,logs,originais eSGF mantidos;permissões/proprietário da pasta preservados. Nova capacidade:5.26GiB e21374782inodes. Backup fresco`2026-10-26T14:20:47Z`:174tabelas/369ficheiros econfiguração;restauro isolado sem rede/55441 com174checksums iguais. Após o backup restavam5.10GiB,acima do mínimo5GiB de compilação;a guarda de um segundo backup não é requisito para repetir o backup acabado de executar. Nenhum limiar foi reduzido.
|
||||
|
||||
Só depois destas guardas,integraçãoGit sem forçar histórico;release anterior activa até a nova estar pronta. Compilação,tipos econtrolos automáticos do procedimento passaram:1054testesfrontend,API59testes/317asserções,preservação1teste/3106asserções. Reutilizadas as provasQA12testes/API133/UI/relatórios,não repetidas por iniciativa desta entrega. Conferidos4ficheiros fiscais do delta,68protegidos,31originais,369persistentes/configuração e174tabelas;172tabelas de negócio mantidas,cache/sessões reconciliadas com eventos operacionais/acessos públicos. Schema,roles/grants epermissões iguais;sem migrações/importações/escrita privada sintética. Revisão/manifest servidos,15marcadores,4assets eHTTP200 do simulador conferidos.
|
||||
|
||||
O recorte mantém a diferençaCBF16 de25MZN aplicada uma vez,com15recuperados já incluídos nos75deduzidos;depois aplica16% à base cooperativa integralmente elegível. No caso combinado,colecta496,80MZN;com despesa autónoma qualificada,512,80+35=547,80MZN. Valores são colecta simulada,não saldo finalL8. IncompatibilidadeCBF4/13,excepções sem correspondência e informação em falta permanecem explícitas;nenhum benefício é escolhido ouapagado automaticamente.
|
||||
|
||||
Após a instalação ficaram4.14GiB livres. Antes de outra compilação,voltar a resolver capacidade contra o mínimo existente e o backup dessa execução;esta entrega foi concluída e não autoriza apagar releases,backups ou provas. SaldoL7 e primeiro incrementoL8 são discriminados na secção seguinte. Recibo:`docs/investmoz/simulations/irpc-l7-combinations-delivery-20261026.json`;provas:`outputs/irpc-l7-combinations-delivery-20261026/`. **L7 parcial;L8 conserva saldo final.**
|
||||
|
||||
## 26/10/2026 — Saldo consolidado de L7 e primeiro incremento delimitado de L8
|
||||
|
||||
**L7 parcial,com a entrega de cumulaçõesf8d57bdd registada acima.** Deixam de estar pendentes de instalação a combinaçãoCIRPC12+CBF16 no recorte qualificado,a separação do imposto autónomo61(4) e os estados de incompatibilidade/falta/excepção não correspondida demonstrados. Isso não implementa todas as cumulações nem os tratamentos abaixo. Fontes oficiais e provas aceites permanecem válidas;documento em falta limita só o caso/campo que dele dependa.
|
||||
|
||||
| CódigoL7 ainda por implementar | Exemplo e condição concreta de retoma |
|
||||
| --- | --- |
|
||||
| Outras origens/segregações de despesas autónomas | Despesa100 com apenas60 correspondidos em36g ou encargo fora do resultado:ligar origem/parcela e incidência61(4),sem segundo acréscimo. |
|
||||
| Cooperativas mistas/retidas e demais entidades9–14 | Base agrária com serviços não abrangidos ou rendimentos sujeitos a retenção:segregar proveitos/custos/base e aplicar o artigo específico;não reduzir tudo a16%. |
|
||||
| ExtensõesCBF16 e outras combinações | Activo anterior a2025,usado/reabilitado/reavaliado,método/período fora da cobertura,ou excepção expressa à não cumulação:ligar regra temporal/base/método e disposição,ordem e limites à parcela;reutilizar activos/quotas,sem reescrever o passado. |
|
||||
| Mais-valias61-A e operações54–56/41-A | Ganho já incluído no resultado ou transferência de activo/perda:implementar apuramento e reconciliação próprios,sem dupla incidência ou compensação presumida. |
|
||||
| CBF17–19 e direito potencial15 | Formação/investimento com activos e despesas elegíveis/excluídos:implementar base,limite,janela temporal e compatibilidade. Direito/origem do crédito emL7;utilização anual e saldo emL8. |
|
||||
| Regimes sectoriais/territoriais e benefícios específicos | EstatutoZEE ou projecto de infra-estruturas:aplicar disposição/período efectivos e excepção quando prevista;endereço/sector não concede benefício. |
|
||||
| TransporteL7M20/M22 | Efeito calculado sem campo/edição correspondente:identificar exemplar,instrução,campo e representação;conservar o cálculo exacto independente. |
|
||||
|
||||
**Documentos por caso,distintos de código:**natureza/parcela/período;estatuto/reconhecimento exigido ou norma de excepção;saldos anteriores e distinção de exclusão temporária/permanente;disposição/ordem/limites da combinação;exemplar/edição/campo/representação. Não pedir nova validação genérica da autenticidade de fontes aceites,nem repetir pesquisas anteriores sem informação nova. Não preencher campo,código,taxa ou saldo por presunção.
|
||||
|
||||
### L8 — primeiro percurso a implementar em QA:colecta→pagamentos comprovados→saldo simulado
|
||||
|
||||
**Delimitado,não implementado ou instalado nesta passagem.** Recorte inicial:IRPC de residente no regime geral,ano civil2026,MZN,com colecta corrente determinada e suportes que permitem reconciliar o fecho. Parte de uma execuçãoL6 válida ou deL7 válida quando os efeitos aplicáveis estejam qualificados;guarda chave/versão/NUIT/período e valores de origem. Não soma colectaL6 com colectaL7 nem a colecta ordinária com uma colecta combinada que já a inclua. Não usa uma versãoL6 para ignorar um efeitoL7 positivo ou pendente que afecte o mesmo fecho. Um caso ordinário independente não espera pela implementação de outro benefício ou por um campoM20/M22 desconhecido.
|
||||
|
||||
**Dados reutilizados e qualificações novas apenas onde necessárias:**
|
||||
|
||||
1. **Colecta:**reutilizar a execução e as condições existentes,distinguindo colecta ordinária,imposto autónomo e colecta combinada. O primeiro fecho completo limita-se aos casos com ausência documentada de tributação autónoma/mais-valias que exija liquidação própria. Se existir imposto autónomo positivo,a parcela ordinária pode ser apresentada,mas não como saldo total até corresponder a articulação;não o apagar ou compensar por pressuposto.
|
||||
2. **Retenções sofridas:**reutilizarL5 apenas quando `direction=received`,natureza `on_account`,origem efectiva,documento/prova e montante sofrido reconciliados,mesmo sujeito/NUIT/período e rendimento incluído na base apropriada. Retenção entregue pela empresa por pagamento a terceiros,retenção definitiva,mera projecção,guia sem pagamento ou montante ainda não comprovado não são crédito próprio. EmL7cooperativa,a declaração de ausência de rendimentos retidos não pode coexistir silenciosamente com retenção recebida positiva;esse caso exige a segregação própria,sem bloquear o regime normal independente.
|
||||
3. **Pagamentos por conta efectuados:**registar/reutilizar comprovativo,identificador,data,exercício,sujeito e montanteMZN;reconciliar parcelas e pagamentos sem dupla utilização. Neste primeiro incremento,não calcular automaticamente a obrigaçãoPPC a partir do exercício anterior,nem transformar tesouraria prevista em pagamento efectuado.
|
||||
4. **Outros créditos/PEC:**reutilizar a informação existente e distinguir valor conhecido,ausência declarada e falta de informação. O primeiro percurso completo exige ausência documentada dePEC e créditos por dupla tributação/investimento/outros créditos ainda sem limite/ordem correspondidos. Presença positiva mantém a parcela/fecho dependente indeterminado;não usar zero. CBF15 potencialL7 não é automaticamente crédito anual utilizável. PEC não se transforma em montante reembolsável nem recebe transporte de3/5anos por presunção.
|
||||
5. **Identidade/duplicação:**contrapartes e documentos existentes são reutilizados;qualificar beneficiário e NUIT do próprio sujeito. Deduplicar por origem/documento/comprovativo e controlar afectações parciais;um comprovativo não pode aparecer integralmente em retenções ePPC,ou em dois exercícios. Preservar valores declarados e histórico,sem consumo de saldo oficial.
|
||||
|
||||
**Resultado e sequência a demonstrar:**colecta válida→deduções admissíveis e respectivas ausências→retenções efectivamente sofridas por conta→PPC comprovados→saldo aritmético→aplicação das regras de cobrança/reembolso do recorte→montante simulado a pagar ou recuperar. Mostrar a decomposição e o sinal;zero só com entradas completas ou ausência documentada. Informação em falta não transforma a colecta em saldo final. Como a base nasce do plano,o resultado continua uma simulação identificada,não autoliquidação submetida,pagamento efectuado ou reembolso deferido/recebido.
|
||||
|
||||
**Fontes já disponíveis para o cotejo dirigido de implementação:**CIRPC63/67,natureza das retenções com as alteraçõesLei12/2025;RegulamentoDecreto9/2008 art21(2–5),ordem/limites das deduções,eart27(1–2/6),pagamentos e reembolso. O exemplar aceite prevê no27(6) um mínimo de100MZN;esse parâmetro e a fronteira devem ser ligados à versão/período aplicáveis antes de activar o consumidor,não inferidos de um rótulo de formulário. O cotejo de aplicabilidade/alterações desta regra é trabalho de implementação da fonte aceite,não pedido de certificação genérica nem reabertura dos cálculosL6/L7. Arts64–66/PEC e créditos específicos mantêm as suas regras próprias;juros/multas/calendário,geração de guias,submissão e processamento de reembolso seguem incrementos próprios.
|
||||
|
||||
| Critério de aceitação a executar,sem prova reivindicada agora | Exemplo sintético proposto |
|
||||
| --- | --- |
|
||||
| Saldo positivo com pagamentos/retencões válidos | Colecta1408−retenção sofrida300−PPC500=608MZN de saldo aritmético;qualificar valor a pagar segundo a regra aplicável. |
|
||||
| Saldo negativo | Colecta1408−retenção1000−PPC600=−192MZN;identificar192 a recuperar no recorte,se a regra permitir,sem afirmar reembolso recebido. |
|
||||
| Zero e fronteiras do mínimo | Colecta1408−408−1000=0;demonstrar os lados inferior/igual/superior do mínimo do parâmetro versionado,sem arredondamento novo. |
|
||||
| Ausência vs informação em falta | Ausência documentada de retenções/PPC/outros créditos permite saldo com parcelas zero justificadas;suporte ou natureza por determinar mantém só o fecho dependente indeterminado. |
|
||||
| Reutilização e dupla dedução | Seleccionar retenção recebida e comprovativo existentes,recusar pagamento a terceiros/retenção definitiva/duplicado e demonstrar conservação dos originais e cenários anteriores. |
|
||||
| Cálculo→gravação→recuperação→relatório | Novo livro/snapshotL8 ligado à chave da colecta e às provas seleccionadas;resultado13/14 eL5 anteriores imutáveis;mudança da fonte invalida a fotografia corrente sem recalcular históricos. Relatório/exportação apresenta colecta,abatimentos,saldo e lacunas concordantes. |
|
||||
|
||||
Só serão demonstradas estas novas regras/efeitos,emQA isolada e com as guardas existentes. Fracções continuam exactas;representação/campos oficiais sem correspondência ficam identificados e não bloqueiam cálculo independente. Pagamentos noutra moeda,períodos especiais,PEC/créditos positivos,liquidação autónoma e demais situações ficam no saldo concreto deL8,com condição de retoma por regra,origem,limite,período e prova. A documentação deste recorte não é novo cálculo executável.
|
||||
|
||||
### Esforço global:referência inicial não é previsão actual
|
||||
|
||||
As240–416horas deL8–L14 permanecem identificadas como referência inicial de planeamento,não saldo actual nem prazo assumido. Antes de estimar o conjunto:reconciliar por lote o que já está implementado/reutilizável e o que falta em código;descontar provas aceites sem as repetir;separar espera documental;incluir resíduosL1–L7,integrações/entregas eL15–L16,SISA/encargos imobiliários. Campos de entrada,fontes inventariadas ou percentagens isoladas não provam percurso executável completo. Contar apenas o delta necessário e não somar duas vezes componentes partilhados. Esta passagem entregaL7 e delimitaL8;gere uma estimativa reconciliada futura,sem converter os intervalos iniciais numa promessa global. **L7 parcial;saldo finalL8 ainda não implementado nesta entrega.**
|
||||
|
||||
## 26/10/2026 — L8: primeiro saldo anual simulado demonstrado em QA
|
||||
|
||||
**QA concluído em `11a6cee9`; ainda sem instalação.** `f8d57bdd` permanece a entrega comunicada no portal. Este incremento reutiliza a colecta corrente de L6 ou o total ordinário L7 aplicável, sem somar ambos nem contornar um tratamento pendente. Recorte: sujeito residente no regime geral, ano civil de 2026, MZN, sem PEC/créditos positivos ou imposto autónomo que exijam liquidação própria. L6 operacional no âmbito demonstrado; L7 mantém o saldo parcial já discriminado. Não há nova pesquisa ou reabertura das provas aceites.
|
||||
|
||||
**Percurso executável:** «Preparar saldo anual L8» reutiliza NUIT, exercício e chave/versão da colecta sem substituir edições deliberadas. Selecciona os comprovativos L5 recebidos, efectivos, por conta e reconciliados; confirma o próprio beneficiário e a inclusão do rendimento na base do exercício. Retenções entregues pela empresa por pagamentos a terceiros, definitivas ou projectadas não são abatimentos próprios. PPC exige recibo, emitente, data, titular, exercício, moeda, montante comprovado, parcela utilizada e confirmação do pagamento efectivo; não usa previsões do plano nem calcula a obrigação PPC. A reutilização não apaga provas ou consome saldos oficiais.
|
||||
|
||||
Conhecido, ausência declarada com suporte e informação em falta são estados distintos. Ausência contraditória, titular/exercício divergente, prova em falta ou origem desactualizada mantêm o saldo dependente indeterminado. A identidade normalizada do emitente/comprovativo detecta repetição mesmo com data alterada; a mesma prova não pode ser retenção e PPC. Controla limites do comprovativo e da afectação L5, incluindo parcelas em outros contextos do mesmo dossier. São simulações alternativas, sem reserva central ou consumo de crédito fiscal entre dossiers independentes.
|
||||
|
||||
| Caso demonstrado | Resultado L8 simulado |
|
||||
| --- | --- |
|
||||
| Colecta 1 408 − retenção sofrida 300 − PPC 500 | **608 MZN a pagar**. |
|
||||
| Colecta 1 408 − retenção sofrida 1 000 − PPC 600 | Saldo aritmético −192: **192 MZN a recuperar**, sem afirmar reembolso recebido. |
|
||||
| Colecta 1 408 − retenção 408 − PPC 1 000 | Saldo zero, com parcelas completas. |
|
||||
| Ausência declarada de retenções/PPC, PEC ausente e outros créditos conhecidos zero | 1 408 MZN a pagar; estados conhecidos/ausentes conservados. |
|
||||
| PPC por comprovar, prova repetida ou PEC positivo ainda sem regra própria | Saldo a pagar/recuperar indeterminado; entradas e subtotais conhecidos conservados. |
|
||||
| Fronteiras do mínimo: saldos ±99,99 e ±100 | Aritmética exacta; abaixo de 100 MZN sem cobrança/reembolso neste recorte; em 100 aplica pagar/recuperar. Sem arredondamento ou transporte de crédito inventado. |
|
||||
| Colecta anual L7 acelerada aceite de 1 996,80, sem abatimentos declarados | Reutilizada uma vez: saldo simulado 1 996,80, sem somar a referência L6 nem recalcular o benefício. |
|
||||
|
||||
**Fontes e limites:** CIRPC arts. 63/67, Lei 34/2007 e natureza da retenção na redacção aplicável da Lei 12/2025; Regulamento Decreto 9/2008 arts. 21(2–5) e 27(1–2/6). O mínimo de 100 MZN do art. 27(6) está ligado ao recorte ordinário de 2026; as alterações IRPC do acervo de 2025 não substituem essa regra. Exemplares, páginas e hashes constam do recibo, com aceitação oficial anterior preservada. Não generalizar este parâmetro a períodos/regimes não correspondidos. PEC positivo, crédito de investimento, dupla tributação e outros créditos não recebem abatimento, limite, transporte ou reembolso presumidos. Um crédito potencial L7 não passa automaticamente a crédito utilizável L8.
|
||||
|
||||
**Gravação e recuperação:** livro opcional `irpcAnnual` no snapshot existente, por contexto, sujeito e exercício; ligado à execução da colecta e às provas L5 seleccionadas. Guarda o input e o resultado simulado, acrescenta o resultado anterior ao histórico sem o recalcular, e invalida o resultado corrente quando mudam as fontes/entradas. HTML e dossier financeiro recuperam colecta, provas/parcelas, estados, saldo, lacunas e limites concordantes. Sem preparação L8, os relatórios anteriores não ganham linhas L8. Plano, originais, livros e históricos L5–L7 permanecem imutáveis. O saldo não é declaração submetida, pagamento efectuado ou reembolso recebido.
|
||||
|
||||
**Provas novas:** 19 testes frontend dirigidos; API privada QA, 1 teste/170 asserções, sete casos com cálculo → gravação → recuperação → HTML/dossier; base isolada `simulator_fiscal_delta_20261021_test`, loopback 55441, guarda de identidade e transacção com rollback. Interface real: preparar, preencher só dados em falta, seleccionar prova, impedir repetição, pagar/recuperar/zero/ausência/indeterminação, guardar/recarregar/recuperar/exportar, sem erros de página. Wayfinder `--with-form`, TypeScript e build QA passaram. Comparação de 2 832 ficheiros anteriores: só três pontos de integração alterados, mais os cinco ficheiros novos do incremento; motores L5/L6/L7, fontes, fixtures, schema, configuração e permissões preservados; 31 originais iguais. Não se repetiram suites aceites de L3, ISPC, câmbio ou L5–L7. SGF TEMPO separado.
|
||||
|
||||
### Saldo concreto L8 após este incremento
|
||||
|
||||
| Código ainda por implementar | Condição concreta de retoma |
|
||||
| --- | --- |
|
||||
| PEC e créditos positivos: investimento, dupla tributação e outros créditos próprios | Correspondência do crédito, titular/exercício, montante efectivamente disponível, ordem, limite e transporte aplicáveis; prova de cada saldo. Não presumir reembolsabilidade ou prazo de 3/5 anos. |
|
||||
| Liquidação de imposto autónomo/61-A e articulação com o saldo anual | Segregar a parcela autónoma e corresponder quais abatimentos podem incidir sobre ela; não a ignorar nem compensar automaticamente com prejuízo/PPC. |
|
||||
| Períodos especiais e comprovativos noutra moeda | Corresponder exercício/data de afectação e regra cambial fiscal do pagamento; reutilizar periodização/câmbio existentes sem confirmar pressupostos por omissão. |
|
||||
| Cálculo da obrigação PPC/PEC, calendários, juros/multas e guias | Regra, parâmetros, factos e vencimentos próprios por período. O registo de PPC efectuado já demonstrado não calcula a obrigação. |
|
||||
| Transporte oficial M20/M22, submissão e processamento de reembolso | Edição/campo, representação de fracções e fluxo de recepção correspondidos; sem preencher campos provisórios como oficiais. |
|
||||
|
||||
**Esclarecimentos documentais aguardados:** permanecem as dúvidas concretas L5/L6/L7 já registadas, sem nova pesquisa repetida. Exemplo: cooperativa com rendimentos mistos/retidos requer segregação antes de utilizar retenção positiva; excepção de cumulação exige disposição, período e limites correspondidos; campo M20/M22 divergente requer edição/campo exactos. Cada falta só bloqueia o seu caso. Ausência de documento num cenário não bloqueia o saldo normal independente acima.
|
||||
|
||||
**Próxima entrega:** compatibilidade conferida com `origin/main` em `f8d57bdd`, sem incorporar runtime do checkout raiz. Nenhum acesso ou operação no servidor nesta passagem. Os 4,14 GiB são o valor comunicado, não medição nova; antes de instalar, medir espaço/inodes, confirmar capacidade para backup/restauro fresco e compilação isolada, mantendo a versão activa até a nova estar pronta. Recibo: `docs/investmoz/simulations/irpc-l8-first-qa-20261026.json`; provas: `outputs/irpc-l8-settlement/`. Reprodução só do delta: `node --test tests/frontend/irpc-annual-settlement.test.mjs`; `php tools/irpc-annual-settlement-qa.php routes`; `php tools/irpc-annual-settlement-qa.php test`; `tsc --noEmit`; build com `INVESTMOZ_QA_BUILD=1`. **L8 parcial, QA pronto, sem instalação.** A referência inicial de 240–416 horas L8–L14 não é previsão actual; permanece necessária a reconciliação do trabalho reutilizado, resíduos e L15–L16 antes de assumir prazo global.
|
||||
|
||||
## 27/10/2026 — entrega L8 preparada; instalação adiada por capacidade
|
||||
|
||||
**Candidato `14360748` pronto; não instalado.** A conferência SSH autenticada de 27/10, 06:05 UTC (08:05 em Moçambique), confirmou `f8d57bdd` como revisão activa e `main` remoto. Compatibilidade por ancestralidade, pacote QA e 168 ficheiros do destino conferidos: 134 ficheiros protegidos, três integrações anteriores e 31 originais. O delta executável continua limitado a cinco ficheiros L8; os 19 testes, API/170 asserções, interface, recuperação/relatórios, tipos e build aceites foram reutilizados, sem nova ronda.
|
||||
|
||||
**Impedimento concreto:** partição `/dev/md2`, montada em `/`, com 4 402 343 936 bytes livres (**4,10 GiB**) e 21 340 182 inodes disponíveis. Inodes suficientes face à referência da release (31 259 entradas). O instalador existente exige **5 GiB livres após o backup**; com a referência observada do backup anterior de 175 917 490 bytes, faltam pelo menos **1,07 GiB adicionais antes do backup**. É uma estimativa mínima de capacidade, a medir novamente; não uma autorização para reduzir o limiar. Caches regeneráveis de Composer/Node somam cerca de 0,12 GiB e não cobrem a diferença. Diagnóstico apenas por leitura, sem limpeza de caches, releases, backups, provas, dependências ou ficheiros SGF TEMPO.
|
||||
|
||||
**Decisão expressa do utilizador: «Manter a entrega preparada por agora».** Não foram executados backup/restauro frescos, integração no `main` nem instalação. A versão activa foi preservada e a sessão SSH encerrada. Na retoma, seleccionar o ramo candidato `codex/irpc-l8-settlement-qa-20261026`, voltar a conferir `main` e revisão servida, medir capacidade/espaço/inodes, executar backup/restauro fresco e compilação isolada, mantendo o activo até a nova release estar pronta. Só depois conferir a revisão servida e o delta L8. As notas desta espera ficam no ramo documental `codex/irpc-l8-delivery-capacity-20261027`; não mudam o código candidato. L8 parcial, PEC/créditos próprios separados e saldo L7 preservado. Recibo: `docs/investmoz/simulations/irpc-l8-delivery-capacity-20261027.json`; provas e auxiliares preparados: `outputs/irpc-l8-first-delivery-20261027/` no checkout raiz.
|
||||
## 27/10/2026 — identidade proactiva: primeiro incremento demonstrado em QA
|
||||
|
||||
**QA concluído em `3439f350`; sem instalação, publicação real ou análise económica validada.** Partida no `main` remoto `f8d57bdd`, conferido novamente antes da entrega. Ramo separado `codex/proactive-investment-first-qa-20261027`, worktree `C:/laragon/www/portal-investidor-proactive-qa-20261027`. A referência local `fa02c70` e o ramo `codex/proactive-investment-scope-20261027` não foram encontrados no repositório consultado; o âmbito expresso da Tempo foi suficiente e não se criou dependência desse commit. **L8 `14360748` mantém-se preparado, sem instalação e sem integração nesta candidata.** A capacidade do servidor continua fora deste trabalho local. Sem SSH, instalação, limpeza do servidor ou intervenção no SGF TEMPO nesta passagem.
|
||||
|
||||
### Diagnóstico dirigido e decisões de implementação
|
||||
|
||||
| Componente existente | Reutilização e lacuna concreta tratada |
|
||||
| --- | --- |
|
||||
| `geo_locations`, `sectors`, `value_chains`, `projects`, `economic_clusters`, `development_corridors`, `investment_zones` | Mesmos identificadores, hierarquia, sectores e referências públicas já disponíveis; selectores e catálogo existentes. Não se criaram mestres territoriais, empresas, projectos ou estruturas para completar campos em falta. |
|
||||
| `investment_gaps` e `investment_specific_needs` | Mantidos nos seus âmbitos de lacuna de cluster/cadeia e necessidade de manifestação. O schema público exige contexto de cluster/cadeia/capacidade no primeiro e submissão/opções no segundo. Não se inventam esses valores para guardar uma hipótese territorial inicial. A análise editorial é uma parte versionada do rascunho existente, não outro catálogo ou cadastro de lacunas económicas validadas. |
|
||||
| `Opportunity`, `OpportunityManagement`, `management_draft`, `audit_events` | Acrescentado só o bloco opcional `proactive`: evidências, necessidade, ideia e relações. Reutilizados identidade, chave de criação, etag, rascunho, auditoria cifrada e versões. Criação repetida não duplica a ficha; versão antiga não sobrescreve edição concorrente. |
|
||||
| Editor de oportunidades e designação interna da equipa | Lacuna confirmada: a preparação inicial exigia organização promotora até quando desconhecida. Permitida a preparação/edição de análise proactiva sem promotor real apenas no âmbito da designação interna existente. Organização real fica nula; operador e responsável continuam identificados. Sem novo papel, aprovador, grant activo ou permissão universal. Os restantes percursos mantêm as condições anteriores; actores não designados e operadores de outro âmbito são recusados. |
|
||||
| `portal_resources`, `documents`, `opportunity_documents` e gestor documental existente | Referência ao documento já associado, fonte, exemplar, localizador, período, abrangência, cobertura e verificação. Não copia o binário nem altera direitos, classificação ou scan. Documento interno/restrito ou fora do âmbito não passa a público pelo formulário da análise. Listas de empresas, hotéis e restaurantes continuam inicialmente internas. |
|
||||
| `OpportunityPromotion` e catálogo/ficha existentes | Síntese expressamente pública, prévia e confirmação no fluxo já autorizado, com MFA normal. Nenhum texto interno é preenchido automaticamente. Estado da necessidade e estado da publicação são independentes. Consulta anónima só da versão publicada. |
|
||||
| `InvestorContext`, escolhas por oportunidade, `desk_cases`, `InvestorPath` e simulador | A origem, versão, território, sector, cadeia/etapa, relações públicas seleccionadas, pressupostos e limites seguem no contexto cifrado do dossier existente. Selecções múltiplas conservam uma fotografia por ideia; o consumidor/simulador recebe só a escolha em tratamento. Título e outras edições deliberadas são preservados. Sem regra fiscal nova ou benefício inferido da localização. |
|
||||
|
||||
### Implementado e demonstrado
|
||||
|
||||
- **Evidência:** actividades, recursos, infra-estruturas, oferta e procura; facto separado da interpretação. Finalidade local ou metodológica, acesso interno ou público autorizado e documento associado opcionais. Duplicação de evidência ou da mesma referência na análise é recusada. Informação em falta permanece em falta.
|
||||
- **Necessidade:** problema, oferta/procura observadas, quantidade/qualidade/logística/transformação/coordenação/apoio, clientes/beneficiários, fontes, limites e pendências. Pode guardar como hipótese. Confirmação exige os campos/fundamento e evidências locais seleccionadas com proveniência/cobertura/período/verificação; referência internacional, por si só, não confirma procura local. Histórico mostra hipótese e confirmação anteriores sem recalcular nem apagar os originais.
|
||||
- **Ideia:** solução, actividade, cadeia existente/etapa, abrangência, recursos, criar/expandir/associar, pressupostos, condições, pendências e próxima acção. Relações com estruturas existentes mantêm a qualificação documentada, hipotética ou proximidade. Nenhuma relação cria contrato, energia acessível, terra disponível, participação ou benefício fiscal.
|
||||
- **Aplicabilidade:** “O que existe” mostra evidências e contexto; “Necessidade” acrescenta a lacuna; “Ideia” acrescenta a solução. Campos anteriores ficam conservados quando ocultos. Não se exigem montante, promotor, coordenadas ou uma oportunidade previamente publicada para iniciar a preparação da equipa.
|
||||
- **Divulgação:** grupos “O que existe”, “Necessidades identificadas” e “Ideias de investimento” no catálogo existente; a consulta de oportunidades cadastradas conserva a verificação de disponibilidade na respectiva ficha. Uma ideia não é convertida em oportunidade com participação disponível. Textos públicos são redigidos separadamente, com revisão expressa da exposição directa/indirecta. Evidências internas e cópias literais detectadas são bloqueadas; uma confirmação pública depende do fundamento público seleccionado. Relações divulgadas transportam apenas referência pública, qualificação e base pública, sem copiar a referência privada.
|
||||
- **Continuidade:** criar → guardar → recuperar → editar → prévia/publicação em QA → consulta anónima → autenticação → dossier → recarregar/retomar sessão. Login e MFA Fortify normais demonstrados com contas sintéticas QA. O mesmo contexto chega ao dossier, sem substituir o título deliberado do investidor. Relatório existente mostra origem, estado, fundamento, evidências, relações, pressupostos, limites e próximo passo por ideia; sem preparação proactiva não acrescenta linhas.
|
||||
|
||||
### Referências metodológicas do Ruanda — dependência resolvida
|
||||
|
||||
O responsável forneceu os dois caminhos após a procura dirigida inicial. Exemplares acessíveis, originais preservados e hashes conferidos antes/depois. **Não foram importados ou publicados no portal.** Texto integral extraído e imagens de leitura ficam apenas nas provas privadas/ignoradas; o pacote entrega rastreabilidade e paráfrases metodológicas, sem os originais ou a reprodução integral dos diapositivos.
|
||||
|
||||
| Exemplar e passagem utilizada | Aplicação delimitada |
|
||||
| --- | --- |
|
||||
| `20070627_Rwanda_5d0cc43d-c990-4cf1-8ee9-ada71094918f.pdf`, 31 páginas, capa “Creating a Competitive Rwanda”, Michael E. Porter/HBS, Kigali, Junho2007. SHA256 `18b07a9379a1ad0baa33697d57d6237f15a6fec346db44bfee7506bf1fa27dee`. P14, “Improving the Business Environment: The Diamond”; P27, “Role of the Private Sector in Economic Development”, conferidas visualmente. | Perguntar por factores de produção, procura, fornecedores, actividades e serviços de apoio; distinguir relação documentada de acesso/compromisso. Cada afirmação sobre Moçambique precisa de evidência local própria. |
|
||||
| `Rwanda Competitiveness Briefing_Prof Porter_OTF.ppt`, 50 diapositivos na leitura nativa PowerPoint, capa “How Rwanda Competes Today”, RNIC, briefing para Prof. Porter, 20Julho2008. SHA256 `4a9325ad64278cb0ef3c60367a05ee2ed9262e2cd49a48d579061349914aa830`. Slide17, procura turística, fonte/amostra/período visíveis; slide20, constrangimentos por etapa da cadeia do chá; slide24, diagnóstico mineiro, texto em ordem nativa. | Conservar fonte, período, abrangência e cobertura/amostra das observações; estruturar etapas e limitações em vez de presumir uma lacuna. Dados, valores, projecções e instituições estrangeiras não são transferidos para os pilotos nem para regras fiscais. Slide17 conferido visualmente;20/24 lidos em texto nativo, sem alegar conferência visual desses dois. |
|
||||
|
||||
Os caminhos completos e os trechos/limites estão no recibo. O PDF2007 e o briefing2008 são exemplares distintos. Os 91 grupos de texto históricos encontrados numa exploração OLE não foram usados como número de diapositivos; a ordem nativa de 50 é a referência do PPT. A metodologia internacional orienta perguntas e organização; não demonstra procura em Cahora Bassa, Montepuez ou Gurué.
|
||||
|
||||
### Guia curto de utilização em QA
|
||||
|
||||
1. Entre na conta da equipa com a designação existente e abra **Minhas oportunidades → Nova oportunidade → Preparar análise e ideia**. Escolha título, sector e nível territorial conhecidos. O promotor real pode ficar por identificar; não são necessários montante ou coordenadas.
|
||||
2. Acrescente evidências. Separe o facto da interpretação e preencha fonte/exemplar, localizador, período, abrangência, cobertura e data de verificação. Marque referências internacionais como **metodológicas** e listas internas como **internas**. Use o documento já associado quando disponível.
|
||||
3. Mantenha a necessidade como **hipótese** enquanto faltar fundamento local. Para confirmar, explicite problema, observações, tipo, beneficiários, fundamentação e evidências locais. “Confirmada” não significa viabilidade comercial demonstrada. Guarde com motivo e recupere o rascunho; o histórico conserva o fundamento anterior.
|
||||
4. Quando aplicável, escolha **Ideia de investimento** e prepare solução/actividade, cadeia/etapa, recursos, relações e próxima acção. A proximidade fica identificada como proximidade. Escolhas existentes e campos ocultos continuam conservados.
|
||||
5. Abra **Divulgação promocional — Em preparação**. Redija os campos públicos separadamente, seleccione só evidências públicas e relações autorizadas, reveja a exposição directa/indirecta, prepare a prévia e confirme **apenas em QA**. A referência privada da relação e os documentos internos não são copiados. A revisão editorial continua humana no fluxo existente; o controlo literal não é validação semântica de todas as inferências possíveis.
|
||||
6. Consulte sem sessão em `/oportunidades?perspective=ideas` (ou `exists`/`needs`). **Iniciar ou continuar o roteiro deste investimento** utiliza a autenticação e o dossier existentes. Confirme o contexto na prévia antes de guardar; pode continuar um dossier ou criar um novo. Para várias ideias, escolha a que está em tratamento nos consumidores. O simulador recebe o contexto e conserva os seus dados/regras próprios; não calcula sem dados ou pressupostos explícitos.
|
||||
|
||||
**Reprodução técnica só do delta:** `php tools/proactive-investment-qa.php routes` (`--with-form`); `php tools/proactive-investment-qa.php test`; `node --test tests/frontend/proactive-investment.test.mjs`; `tsc --noEmit`; build com `INVESTMOZ_QA_BUILD=1`. Base isolada `proactive_investment_20261027_test`,127.0.0.1:55441, clonada do QA anterior com o mesmo schema/identificadores; guarda de identidade e rollback nos testes. Flags existentes de perfis/contratos especializados/percurso foram configuradas só no bootstrap QA; `.env`, configuração activa e grants activos não mudaram. O servidor HTTP de prova usou127.0.0.1:18760, não a homologação.
|
||||
|
||||
### Provas, preservação e saldo concreto
|
||||
|
||||
**Passaram:**14 testes da API/139asserções;7testes frontend de relatório/isolamento por ideia;Wayfinder,TypeScript ebuildQA;interface real com login/MFA,criação/edição/recuperação,histórico,perguntas aplicáveis,prévia/publicação QA,consulta anónima,contexto após autenticação,recarregar/retomar sessão,relações/pressupostos e ausência de erros de página. Casos Cahora Bassa/energia,Montepuez/mineração eGurué/chá são **inequivocamente sintéticos**,reutilizando distritos e sectores existentes. Não se publicou uma análise económica real nem se validou um mercado.14testes não são nova ronda de L3/ISPC/câmbio/L5–L8.
|
||||
|
||||
**Preservado:**15pontos de integração anteriores e7ficheiros novos de código/testes/guarda;89ficheiros de motores fiscais e31originais fiscais iguais,mais os2originais Ruanda intactos. Sem migrações ou novo catálogo/base territorial/sistema de permissões. Sem escrita na base origem ou activa;fixtures/grants sintéticos apenas no clone QA. A candidataL8 `14360748` conserva exactamente a mesma referência. O checkout raiz recebe somente este registo documental,sem integrar o runtime do ramoQA.
|
||||
|
||||
| Estado | Saldo e condição concreta de retoma |
|
||||
| --- | --- |
|
||||
| Implementado e demonstrado neste incremento | Percurso editorial técnico completo acima, no recorte QA e com os estados/limites visíveis. Pode preparar novos investimentos sem depender de oportunidades publicadas. |
|
||||
| Parcial — conteúdo económico real dos três pilotos | Recolher oferta/procura locais,exemplares,períodos,cobertura e informação de clientes/beneficiários;relacionar recursos/serviços com evidência. Só os casos apoiados por esses dados podem mudar de hipótese. Nenhuma falta bloqueia outra análise independente. |
|
||||
| Dependência documental/comercial | Contrato/encomenda,energia acessível,terra,participação disponível e condições comerciais precisam de prova específica por caso. A qualificação formal da oportunidade continua nos campos/fluxos existentes;este incremento não a presume a partir da localização,lista de empresas ou necessidade. Listas e contactos privados exigem síntese autorizada e revisão editorial no fluxo actual antes de qualquer divulgação. |
|
||||
| Dependência resolvida | Os dois exemplares Ruanda foram localizados/lidos nos trechos identificados;deixam de constar como ficheiros indisponíveis. A sua existência não substitui a evidência local. |
|
||||
| Trabalho futuro,fora do primeiro incremento | Automatizar inventário,indicadores,comparação/priorização e eventual IA;quantificar mercado/custos/rentabilidade só com dados/pressupostos explícitos;eventual correspondência a lacunas mestre de cluster quando os seus campos e fundamento forem conhecidos. Não há novo prazo global ou implantação activa reivindicados. |
|
||||
| Entrega futura no destino | CandidataQA peloGit apenas. Conferir o main vigente e compatibilidade com outros incrementos antes de integrar;capacidade,backup/restauro e instalação são uma execução separada autorizada. A espera de capacidade deL8 não foi contornada. |
|
||||
|
||||
Recibo:`docs/investmoz/unification/proactive-investment-first-qa-20261027.json`;provas:`outputs/proactive-investment-20261027/`. Não há novos cálculos fiscais,submissão AT,publicação na homologação ou alteração do SGF TEMPO.
|
||||
|
||||
## 27/10/2026 — primeiro caso proactivo com fontes reais: Cahora Bassa / apoio metrológico
|
||||
|
||||
**Análise preliminar privada demonstrada em QA, sobre o runtime aceite `3439f350` / candidata `1afab4a2`, sem nova alteração funcional ou instalação.** Caso `CB-METROLOGIA-20261027`, ficha QA `401`, dossier privado QA `894343c7-c33d-452e-a6a5-b6675f77ee23`. O operador é uma conta sintética QA já existente; os factos e referências desta análise são reais e identificados, distintos dos cenários fictícios anteriores. Não se publicou a análise, não se contactou comprador ou prestador e não se transportaram contactos, documentos pessoais ou NUIT das listas. L8 `14360748` conserva a mesma referência e continua separado. Main remoto conferido: `f8d57bdd`; sem SSH, limpeza, instalação ou intervenção no SGF TEMPO.
|
||||
|
||||
### Escolha do piloto e fontes reutilizadas
|
||||
|
||||
| Piloto | Resultado da triagem dirigida |
|
||||
| --- | --- |
|
||||
| **Cahora Bassa — seleccionado** | A lista empresarial fornecida contém referências históricas locais de reparação/manutenção mecânica e eléctrica. O acervo inclui a reprodução histórica da concessão HCB. Foram acrescentados o relatório primário HCB2024, a página institucional de engenharia e, decisivamente, o Plano de Compras HCB2026 publicado pelo IGEPE, que delimita um serviço concreto de calibração. É uma decisão por disponibilidade de fundamento nesta ronda, sem ranking de rentabilidade ou potencial económico. |
|
||||
| Montepuez | Há referências empresariais internas e fontes mineiras localizadas. Não foi escolhido nesta ronda um âmbito primário de aquisição tão directamente utilizável para esta aplicação. Não se conclui que falte actividade ou procura; continua elegível para outro caso documentado. |
|
||||
| Gurué | Há referências históricas internas ligadas ao chá e perfis/fontes públicos localizados. Os constrangimentos antigos encontrados não bastam para atribuir automaticamente uma lacuna actual à cadeia do chá. Não foram transpostos para a proposta de Cahora Bassa. |
|
||||
|
||||
Inventário anterior de606 fontes preservado e consultado; listagem dirigida dos documentos acessíveis no acervo e triagem dos dois workbooks empresariais/cadastro turístico ficam nas provas privadas. Os workbooks têm grãos/períodos/versões distintos e registos repetidos: não se somaram os totais entre eles nem se contou uma denominação repetida como várias empresas. O cadastro de alojamento de3–5estrelas não demonstrou cobertura distrital comparável neste recorte; não demonstra ausência de hotéis ou serviços e não foi usado para inferir procura metrológica.
|
||||
|
||||
| Evidência / exemplar | Âmbito usado e limite |
|
||||
| --- | --- |
|
||||
| HCB, **Relatório e Contas2024**, edição bilingue,63páginas PDF; PDFp9/página impressa14. URL `https://hcbadm.mzbusiness.com/wp-content/uploads/2025/08/Relatorio-e-Contas-2024-Bilingue-VF-1.pdf`. SHA256 `d0fed6af0e40fffd6f7f385152fdbfff2a10cae0b66c9d7a59a0a99658758080`. | Actividade e infra-estruturas existentes da HCB. Página conferida visualmente; não é carteira de contratos disponíveis. Matambo não é atribuída ao distrito de Cahora Bassa. |
|
||||
| HCB, **Plano Anual de Compras2026**,8páginas; PDFp1,2.ª/3.ªlinhas de dados. URL `https://igepe.org.mz/wp-content/uploads/2026/06/HCB-Plano-Anual-de-Aquisicoes-2026.pdf`. SHA256 `cbc93102fea61a712c193d1c1815e7ec19e7d570ee2703c1b1390d4c05e5bd8e`. | Duas entradas de calibração de equipamento de medida e monitorização, concurso limitado, previsões19/02–30/06 e05/05–14/09/2026. Em27/10/2026 os prazos previstos já passaram. Plano não confirma procedimento aberto, adjudicação ou procura ainda insatisfeita. “1” em “Qtde de Itens” não é número de instrumentos; linhas de igual designação não provam dois contratos independentes. Conferência visual da tabela. |
|
||||
| Lista fornecida **Empresas Licenciadas.xlsx**, `Servicos Tempo/Relatorios/novos/docs`, folha`EMPRESAS`; SHA256 `1b5087b464e39e88c42def39655c2391aaaf684b4c832d6a77ff274b98889f00`. | Pistas internas: L19376,D19376,O19376:P19376,U19376:V19376 e L55640,D55640,O55640:P55640,U55640:V55640. Licenças2018/2021, não capacidade actual. Linhas12243/19376/65567 repetem denominação e não são contadas como três empresas. Nenhuma lista/contacto foi copiada para publicação. |
|
||||
| **CAE eBAU.xlsx** fornecido, folha`CAE`, B857/F857 e B859/F859. | Etiquetas de33120 — reparação/manutenção de máquinas/equipamentos e33140 — equipamento eléctrico, lidas no exemplar fornecido. Não comprovam calibração, qualificação, acreditação ou vigência actual de licença; não se declarou uma versão oficial actual do catálogo sem identificação. Hash/caminho no recibo. |
|
||||
| **HCB-TERMOS-DO-CONTRATO-DE-CONCESSAO.pdf** fornecido, página única; BR I Série47,21/11/2007,Decreto57/2007,artigo2. SHA256 `f4afc62f140d197cae3bf395674adce2eba37f0436261d52d7eb554f6230a073`. | Contexto documental histórico da actividade, conferido visualmente. Sem análise da vigência actual ou aplicação de regra ao novo investimento. Direitos de concessão não se tornam direitos do promotor. Original preservado, não importado/publicado. |
|
||||
| Página institucional HCB`https://www.hcb.co.mz/hidroelectricidade`, consultada27/10/2026. | Contexto do complexo e CAPEX Vital; sem data editorial precisa ou progresso actualizado de cada obra. Não comprova contratação adicional. Captura/hash privados; sem copiar projecções para o orçamento da ideia. |
|
||||
|
||||
Os exemplares Ruanda já aceites continuam apenas metodológicos; não se repetiu a sua prova nem se usaram como evidência de procura local. Os cinco originais locais usados permanecem com hashes iguais. Fontes públicas adicionais foram guardadas como cópias privadas de consulta, sem importação, publicação ou alteração de direitos no portal.
|
||||
|
||||
### Actividade, necessidade e ideia estruturada
|
||||
|
||||
**O que existe:** actividade hidroeléctrica e infra-estruturas HCB documentadas; registos históricos locais de actividades de reparação/manutenção. **Necessidade documental:** o comprador planeou serviços de calibração em2026. **Hipótese por verificar:** existe procura residual/recorrente e uma vantagem concreta de apoio local no Songo. Não há evidência de falta de fornecedores, atrasos, preços elevados ou adjudicação disponível; a necessidade comercial mantém o estado **hipótese**, com esse fundamento guardado.
|
||||
|
||||
**Ideia:** estudar associação entre prestador local e laboratório qualificado para apoio metrológico à HCB no Songo: inventário/gestão de instrumentos, preparação, recolha/entrega controlada e acompanhamento documental. Calibração/ensaios só por quem demonstrar competência no âmbito contratado. A associação é uma proposta, não acordo. **Cliente potencial:** HCB, apenas nas unidades e procedimentos em que o serviço se justifique; outros clientes não foram presumidos. Etapa: apoio à manutenção na produção/transporte de electricidade. Sem criar cadeia mestre ou relação canónica para preencher uma correspondência não disponível no clone. Abrangência distrital/proposta no Songo, sem parcela, instalações, energia ou acesso assegurados.
|
||||
|
||||
**Condições:** confirmar requisitos efectivos do comprador e do âmbito metrológico, capacidade, rastreabilidade, segurança/acesso, responsabilidades, regras de associação/transporte e eventual acreditação exigida. Não se impôs certificação específica por interpretação do plano. Recursos de operação, equipa, instrumentos, veículo, instalações e laboratório ainda não estão assegurados. Montante, promotor empresarial, coordenadas exactas, preços, volume, mercado, receitas e rentabilidade permanecem por determinar; sem usar zero ou totais do plano como substitutos.
|
||||
|
||||
### Demonstração deste caso e continuidade
|
||||
|
||||
Criada pela interface existente,guardada,recuperada e conferida na mesma ficha privada. Cinco evidências preservadas;necessidade comercial como hipótese;campos de clientes,oferta,procura,condições e próxima acção recuperados sem alteração. A mesma contaQA preparou um dossier privado pelo percurso existente,confirmou o contexto e recuperou a fotografia da ideia pela API autenticada. O relatório existente produziu as cinco linhas de evidência e os mesmos limites;uma leitura privada de prova reúne essas linhas e as observações do caso. Nenhuma publicação promocional foi preparada ou confirmada. Ficha permanece`draft`,fora da consulta publicada;consulta anónima do dossier recusada.
|
||||
|
||||
Reutilizadas as14provas API/139asserções,7provas frontend,tipos ebuild de`1afab4a2`;não se repetiu a ronda técnica ou fiscal. Feita apenas aplicação e conferência do novo caso real. A primeira leitura da página do dossier antecedeu o fim da gravação do contexto;após recuperação concluída,interface eAPI concordaram. Corrigida a espera no script local de prova,sem mudar código da aplicação ou regravar históricos. Preservação por hash das linhas anteriores no mesmo clone:52fichas,17dossiers,19projectos,1921territórios,12sectores,63documentos;uma ficha e um dossier novos. Sem migrações,importação de empresas,novos grants ou alteração do destino activo.
|
||||
|
||||
**Para consultar ao retomar QA:**usar a contaQA já designada e abrir`/minhas-oportunidades/401/edit`;comparar os campos/fundamentos;abrir o dossier`/investimentos/894343c7-c33d-452e-a6a5-b6675f77ee23`. É um percurso privado,não um link público nem uma nova instalação. Recibo:`docs/investmoz/unification/proactive-real-pilot-qa-20261027.json`;provas privadas:`outputs/proactive-real-pilot-20261027/`. Cookies,credenciais,extractos integrais de listas,originais e ficheiros de diagnóstico não integram o pacote de entrega.
|
||||
|
||||
### Saldo e perguntas concretas de retoma
|
||||
|
||||
| Ponto | Exemplo/pergunta e condição de retoma |
|
||||
| --- | --- |
|
||||
| Procura actual e estado das compras | As entradas terminavam em30/06 e14/09/2026:foram executadas,adjudicadas,canceladas ou reprogramadas? Existe novo ciclo em2027? Retoma da qualificação comercial apenas com estado e necessidade residual/recorrente identificados pelo comprador. |
|
||||
| Âmbito técnico e operacional | Que famílias/instrumentos,quantidades,periodicidade,local de execução e prazo de devolução se aplicam? Que qualificação/rastreabilidade/acreditação é exigida neste âmbito? Obter a especificação antes de dimensionar meios ou afirmar elegibilidade. |
|
||||
| Oferta e associação | Os dois registos internos seleccionados continuam activos,interessados e tecnicamente aptos? Que laboratório pode assumir o âmbito? Verificar capacidade/competência,consentimento e oferta concorrente;cadastro/CAE não basta. Não enviar contactos ou listas automaticamente. |
|
||||
| Vantagem e viabilidade | O apoio no Songo reduz um problema mensurável do cliente face à solução actual? Comparar transporte,prazos,risco,custos e condições;quantificar só quando houver dados. Não comprar equipamento ou criar orçamento com base apenas no plano. |
|
||||
| Divulgação ou uso no activo | Preparar eventual síntese pública separada só quando autorizada/revista;instalação do código não publica nem transporta automaticamente a ficha e o dossierQA. Capacidade,compatibilidade e backup/restauro serão tratados na execução futura aplicável. Nenhuma dependência de capacidade impede esta análise privada. |
|
||||
|
||||
**Estado:**primeira aplicação real demonstrada,análise económica/comercial preliminar. Preparadas perguntas para reunião exploratória com a HCB,sem as enviar. L8eSGF preservados;limites e pendências anteriores não foram eliminados.
|
||||
|
||||
## 27/10/2026 — orientação confirmada: oportunidades geradas pela procura
|
||||
|
||||
**Decisão expressa do responsável:** “a ideia não é gerir concursos mas sim as oportunidades que geram”. O anúncio é uma fonte de procura para preparar oportunidades complementares; não se cria um circuito de concursos, candidaturas ou adjudicações. O percurso técnico aceite em`1afab4a2` continua preparado para entrega independentemente da confirmação comercial do caso. Instalação e capacidade do servidor seguem separadas;sem nova intervenção no destino ou no SGF TEMPO. L8`14360748`preservado.
|
||||
|
||||
**Caso privado QA — evolução da mesma ficha e dossier:**ficha401,versão1→2;dossier`894343c7-c33d-452e-a6a5-b6675f77ee23`,contexto1→2. Sete evidências recuperadas. Modelo centrado em serviço recorrente de apoio metrológico no Songo,associando apoio local e laboratório competente:inventário/calendário,preparação,recolha/entrega controlada e documentação. Cliente potencial inicial:HCB. Outros clientes dependem de identificação própria. Sem contrato,parceria,procura recorrente ou vantagem económica declarados como confirmados. Título e campos deliberados do dossier conservados;fotografia anterior e388eventos de auditoria existentes intactos. Não se criou outra ficha,dossier,empresa,grant ou regra fiscal.
|
||||
|
||||
### O que a nova fonte esclarece
|
||||
|
||||
- **Procura e âmbito:**o anúncio da HCB,de17/08/2026,referência051/2026,identifica quinze famílias de instrumentos e outros a especificar nos TdR;por exemplo,manómetros,balanças,paquímetros/micrómetros,multímetros e instrumentos de análise eléctrica. O PDF tem2páginas,ambas lidas visualmente;SHA256`bb4c33064e5d49504d8a85ac88ad1b847cfa6c69e1016e3ab588ff785b205c1f`;exemplar`https://www.diarioeconomico.co.mz/wp-content/uploads/2026/08/concurso-hcb-tender-document-docu-mo-ambique-2026-1.pdf`. Não contém volumes,gamas,incertezas,periodicidade ou execução. O prazo04/09/2026é histórico,não oportunidade aberta presumida. Não se mapeou automaticamente este procedimento a uma das duas linhas do plano.
|
||||
- **Qualificação:**o anúncio específico pede licença para o serviço,acreditação/credenciação para calibração,três anos de experiência,três referências e equipa qualificada. Isso esclarece aquela contratação;não se converte em condição para preparar a nova oportunidade nem em requisito universal para todo apoio logístico/metrológico futuro. A execução técnica de calibração deve corresponder à competência/âmbito e aos requisitos efectivos do serviço a prestar.
|
||||
- **Possível prestação laboratorial:**a ficha pública IPAC`M0100`,INNOQ–Laboratório de Metrologia,Maputo,anexo17/02/2026,publica capacidades por âmbito:inclui electricidade,pesagem e pressão com gamas,incertezas e condições de local. Fonte`https://www.ipac.pt/pesquisa/ficha_lac.asp?ID=M0100`,consultada27/10/2026. É uma entidade a consultar sobre serviços,sem acordo ou capacidade disponível confirmados. Não se estende a cobertura a todas as famílias da HCB ou a uma instalação no Songo. Os prestadores históricos locais continuam por verificar.
|
||||
|
||||
A consulta pública dirigida não localizou prova identificável de adjudicação/execução ou compromisso para2027. Isso não prova que não houve contrato,que a compra continua aberta ou que existe procura por satisfazer. Rótulos“Em Curso” e campos0,00dos agregadores não são preço,volume ou estado confirmado. Não prolongar a mesma pesquisa sem novo documento ou resposta do cliente. O estado da compra passada é contexto para a procura futura,não o produto a gerir.
|
||||
|
||||
### Preparação da oportunidade e condição de retoma
|
||||
|
||||
| Questão de negócio | Informação concreta a obter e uso |
|
||||
| --- | --- |
|
||||
| Problema do cliente e recorrência | Que problema operacional existe no ciclo dos instrumentos,como é resolvido hoje e que necessidade futura permanece? Identificar instrumentos,quantidades,frequências e horizonte. Compra satisfeita pode cobrir só um ciclo;não autoriza presumir recorrência. |
|
||||
| Âmbito da prestação | Por família/modelo/gama,pontos e incerteza:que trabalho é exigido,onde pode ocorrer e com que prazo? Separar inventário/logística/documentação local da execução técnica da calibração. |
|
||||
| Parceiros e recursos | Confirmar capacidade real,disponibilidade e interesse dos prestadores locais e de laboratório(s). Corresponder âmbito a instrumentos concretos,com responsabilidades,custódia,segurança e condições comerciais;nenhum parceiro é designado automaticamente. |
|
||||
| Valor e receitas | Testar menor custo total,menos tempo fora de serviço ou melhor organização/rastreabilidade,sem os declarar como benefícios já medidos. Serviço por lote ou avença são hipóteses de receita,sem preço ou vontade de pagar conhecidos. |
|
||||
| Vantagem económica | Comparar solução actual e proposta para o mesmo âmbito,volume,qualidade,local e período:serviço laboratorial,transporte/retorno,embalagem/seguro,apoio local e custos incrementais sem duplicação. Medir prazos separadamente;monetizar impacto operacional só com base fornecida. Valores e vantagem permanecem indeterminados. |
|
||||
|
||||
**Resultados úteis previstos pelo responsável:**(1)procura recorrente/problema/interesse demonstrados→corresponder parceiros e dimensionar o serviço;(2)ciclo actual satisfeito,necessidade futura documentada→reformular horizonte;(3)cliente confirma necessidade satisfeita e sem necessidade futura para a solução→arquivar a hipótese com essa conclusão e conservar o dossier;(4)informação insuficiente→manter hipótese privada,sem declarar ausência de procura. Nenhum desses estados impede a entrega técnica do percurso proactivo.
|
||||
|
||||
Perguntas de descoberta e comparação foram preparadas,sem envio a terceiros. A ficha mantém`hypothesis`/`draft`,sem publicação. O contexto foi actualizado pelo mecanismo existente de prévia/confirmação e recuperado com os sete fundamentos;relatório existente reproduz as novas linhas. Sem alteração de código da aplicação,migração,novas entidades ou repetição das provas técnicas/fiscais aceites. Apenas a própria ficha e o seu dossier mudaram;52outrasfichas,17outrosdossiers,19projectos,1921territórios,12sectores,63documentos e históricos anteriores preservados.
|
||||
|
||||
Recibo:`docs/investmoz/unification/proactive-opportunity-model-qa-20261027.json`;análise privada actual:`outputs/proactive-commercial-followup-20261027/opportunity-private-brief.html`. A versão anterior da prova continua conservada. Esta passagem consolida o modelo da oportunidade e o saldo de validação comercial;não instala ou publica uma oportunidade real.
|
||||
|
||||
## 27/10/2026 — hipótese regional: outros clientes e sustentabilidade do apoio metrológico
|
||||
|
||||
**Pedido do responsável:** estudar outros clientes regionais,frequência,custos e capacidade dos parceiros,sem transformar sinais de procura em gestão de concursos. **Dado comercial expresso:** “Ainda não há dados comerciais”. A ficha permanece privada e a entrega técnica do percurso continua independente desta validação. Mantém-se`1afab4a2`como candidata técnica aceite,runtime`3439f350`,sem instalação nesta passagem. L8`14360748`eSGF TEMPO preservados.
|
||||
|
||||
**Resultado delimitado:** há base documental para prospectar três entidades adicionais — Vulcan/Moatize,EDM/Tete–Moatize e Nacala Logistics/segmentoMoatize — mas não há procura,recorrência,preço ou capacidade disponível confirmados para este serviço. Não se afirmou sustentabilidade,mercado dimensionado ou clientes contratados. A mesma ficha401e o dossier`894343c7-c33d-452e-a6a5-b6675f77ee23`foram actualizados da versão/contexto2para3,com11evidências. Origem Cahora Bassa/Energia,localização canónica,título e campos deliberados do dossier conservados;abrangência comercial regional identificada separadamente.
|
||||
|
||||
| Prospecto | Facto e fonte usados | Hipótese comercial e limite |
|
||||
| --- | --- | --- |
|
||||
| Vulcan Mozambique/Moatize | A própria empresa descreve mina,processamento de carvão e equipamentos produtivos em`https://www.vulcaninternational.com/products-services/`,consultado27/10/2026,página sem data editorial identificada. | Verificar instrumentos de processo/manutenção e necessidade de apoio metrológico. Não foi recebido pedido nem inventário;capacidade de produção da mina não é volume de calibração. |
|
||||
| EDM/Tete–Moatize | **Plano de Actividades e Orçamento2025**,PDFp68/página impressa68,Direcção de Transporte:linha3,calibração/reparação de equipamentos de teste;linha7,activos deMoatize/móvelTete;linha17,automaçãoSETete. Fonte`https://cdn.edm.co.mz/website/imprensa/Plano_Actividades_Orcamento_2025.pdf`,86páginas;conferidos visualmente apenas a página68e o detalhe relevante. Hash/cópia privada no recibo. | Serviço de calibração planeado a nível empresarial em2025 e referências regionais não demonstram parcela de procura actual emTete. Identificar unidade compradora,inventário e solução actual. O orçamento não é preço unitário,receita ou mercado regional. Não atribuir activosHCBàEDM ou contá-los duas vezes. |
|
||||
| Nacala Logistics/Moatize | A empresa descreve operação ferroviária atéMoatize e manutenção preventiva em`https://www.nacalalogistics.com/quem-somos/`e`https://www.nacalalogistics.com/faq/`,consultados27/10/2026. Na secção Accionistas,as concessionárias identificam Vulcan Mozambique como accionista. | Verificar instrumentos de manutenção e entidade/centro de compra. A marca agrega concessionárias;não equivale a uma contraparte contratual única. A ligação comVulcan impede assumir diversificação independente;não se somaram volumes ou clientes confirmados. |
|
||||
| Mphanda Nkuwa/GMNK — futuro separado | Descrição institucional em`https://www.gmnk.co.mz/en/about-us/project-description/`,consultada27/10/2026,qualifica o projecto em desenvolvimento. | Sem entrada na procura recorrente de base,receita ou carga de trabalho actual. Retomar apenas com necessidade e horizonte concretos;não inferir encomenda da capacidade projectada ou localização. |
|
||||
|
||||
As páginas institucionais confirmam apenas os factos no seu âmbito;relevância metrológica de mineração/ferrovia e interesse em apoio associado são inferências a testar,identificadas como tal. Fontes,exemplar,data e hashes foram guardados em provas privadas;nenhuma empresa,lista,documento ou relação canónica foi importado/publicado. As referências históricas de parceiros locais e o âmbitoIPAC/INNOQjá demonstrado foram reutilizados,sem repetir a pesquisa nem alargar automaticamente a cobertura técnica.
|
||||
|
||||
### Dados mínimos por cliente e parceiro
|
||||
|
||||
Por **cliente/centro de compra**:instrumentos,famílias/modelos/gamas,pontos e critério de aceitação;quantidade por janela e programa efectivo;prazo fora de serviço;prestador,processo e custo actuais;necessidade ainda não satisfeita;interesse e condições de pagar por lote/missão ou avença. Frequência permanece indeterminada e deve vir do programa do proprietário;sem regra anual por defeito,sem converter prazo de anúncio ou quinze famílias em quantidade/recorrência.
|
||||
|
||||
Por **parceiro**:âmbito de competência e local permitido por instrumento;capacidade efectivamente disponível em cada janela,equipa,meios,prazo e preço. Verificar capacidade actual dos prestadores locais históricos,sem confundir reparação/CAEcom acreditação de calibração. O âmbito publicado doINNOQ–LMemMaputo é pista parcial,não reserva de capacidade nem cobertura de todas as famílias. Famílias não correspondidas continuam separadas das compatíveis.
|
||||
|
||||
### Comparação económica delimitada
|
||||
|
||||
A unidade de comparação é a **missão/lote**:mesmo âmbito,quantidade,qualidade,local e período que a solução actual. A contribuição da missão é a receita acordada menos laboratório,apoio directo,transporte de ida/retorno,embalagem/seguro e outros custos incrementais dessa missão. Custos de transporte partilhado entram uma vez;custos fixos incrementais são deduzidos uma vez no período,sem os duplicar também na contribuição. Para sustentabilidade,avaliar ainda investimento,reposição de meios,fundo de maneio e prazos de recebimento;resultado operacional isolado não basta.
|
||||
|
||||
Comparar atendimento individual noSongo,missões agrupadas Songo–Tete/Moatize com janelas compatíveis e uma organização de apoio emTete/Moatize com deslocação aoSongo. Essas alternativas são hipóteses de funcionamento,não mudança de localização,cotação de rota ou recomendação de investimento já aprovada. Nenhum quilómetro,custo de deslocação,preço,volume,receita,margem,poupança ou ponto de equilíbrio foi inventado. A agregação pode partilhar logística e também criar custos,prazos ou restrições de custódia;isso tem de ser medido.
|
||||
|
||||
**Condição de retoma:** obter inventários/programas e interesse dos prospectos;identificar entidade compradora e concentraçãoVulcan/Nacala;com o mesmo âmbito pedir propostas de laboratório,apoio local e transporte;comparar as alternativas e a solução actual. Sem esses dados,o resultado útil é “carteira regional prospectável,sustentabilidade por demonstrar”. Se os dados posteriores mostrarem procura insuficiente ou serviço já satisfatório,conservar essa conclusão e reformular/arquivar a hipótese. Não repetir pesquisa pública para substituir dados comerciais que o responsável confirmou ainda não existirem. Nenhuma mensagem foi enviada a terceiros.
|
||||
|
||||
**Preservação e prova desta evolução:**guardar→prévia/confirmação do contexto→recuperação no mesmo dossier→linhas do relatório existente,com11evidências e valores comerciais em falta. Apenas ficha401e o seu dossier foram actualizados;52outrasfichas,17outrosdossiers,19projectos,1921territórios,12sectores,63documentos e391eventos anteriores de auditoria intactos. Sem nova entidade,grant,migração,código da aplicação ou ronda das provas técnicas/fiscais aceites. Fonte e contexto anteriores conservados,sem publicar a ficha.
|
||||
|
||||
Recibo:`docs/investmoz/unification/proactive-regional-clients-qa-20261027.json`;estudo privado:`outputs/proactive-regional-clients-20261027/regional-private-brief.html`. A entrega técnica e a eventual instalação continuam separadas do estado comercial desta oportunidade.
|
||||
|
||||
|
||||
## 27/10/2026 — passagem à prospecção e segundo piloto territorial privado
|
||||
|
||||
**Decisão do responsável:** o caso de apoio metrológico está suficientemente estruturado para prospecção. Fica privado e pendente de informação externa; não continuar a aprofundá-lo para concluir a funcionalidade. Nenhum contacto ou proposta comercial foi recebido ou enviado nesta passagem. A ficha401 e o dossier `894343c7-c33d-452e-a6a5-b6675f77ee23` mantêm fonte/contexto3, sem alterações.
|
||||
|
||||
**Ficha curta para a equipa:** `docs/investmoz/unification/prospeccao-apoio-metrologico-20261027.pdf`, PDF preenchível de duas páginas e42campos, com uma página por cliente e outra por parceiro. Cliente: instrumentos/gamas/quantidades, programa efectivo e janelas, requisitos, solução actual, contratação e próxima acção. Parceiro: âmbito, equipa/meios e capacidade disponível, prazo, preços discriminados, impostos/moeda, deslocações/custódia e validade da proposta. Sem resposta, os dados ficam por determinar. Guardar uma cópia por entidade/centro de compra ou parceiro, com evidência/data e responsável.
|
||||
|
||||
**Retoma da viabilidade do Songo:** quando chegarem inventários, programas, interesse e cotações comparáveis, actualizar a comparação já preparada para o mesmo âmbito, volume, qualidade, local e período. Distinguir entidade, utilizador e centro que decide/paga; a ligação Vulcan/Nacala impede presumir compradores independentes. Somar cada missão/transporte partilhado uma vez. Não usar ausência de resposta como ausência de procura ou zero. Necessidade satisfeita pode conduzir a reformulação futura ou arquivo fundamentado, preservando o dossier.
|
||||
|
||||
**Próximo piloto — Gurué:** foi criado, por serviços existentes e apenas na base QA isolada, o caso `GUR-CHA-20261027`, ficha402/fonte1 e dossier `883c8ec3-59a3-4074-b91c-b7d4a5d88ff0`/contexto1. Ideia privada: estudar apoio associado à colheita, qualidade da folha verde e organização das entregas na cadeia do chá. Reutilizados o distrito canónico de Gurué e o sector Agronegócio; nenhum novo mestre, promotor empresarial, montante ou coordenada presumidos.
|
||||
|
||||
Cinco referências distinguem actividade de procura: INE2020–2024, edição2025, PDFp9/Quadro1.1; página do próprio Asian Tea Group sobre Chá de Magoma; IGC2014, PDFp75,78–79/impressas60,63–64; e referências privadas da lista já fornecida, com datas2021–2023 e códigos declarados. INE e produtor documentam actividades; o estudo2014 é histórico e orienta perguntas, sem transportar volumes, preços, capacidades ou intenções para2026. Cadastros antigos não comprovam competência ou disponibilidade actual. Não se presume compra de folha externa, oferta em falta, nova fábrica ou interesse em contratar.
|
||||
|
||||
**Acção delimitada do Gurué:** compreender como se colhe, avalia e entrega hoje; identificar problema mensurável, intervenientes, critérios do processador, quantidades/janelas, solução/custo actuais e quem contrataria/pagaria pelo apoio. Magoma é unidade potencial a consultar; Chazeiras é referência histórica cuja situação actual deve ser confirmada. Beneficiário não equivale a pagador. Necessidade, parceiros, custos e viabilidade permanecem em hipótese, sem bloquear a funcionalidade técnica ou exigir prolongamento de pesquisa pública.
|
||||
|
||||
**Demonstração apenas do delta:** criação→gravação→prévia/confirmação→recuperação→linhas do relatório existente, com5evidências e pressupostos visíveis. Conservados todos os53registos anteriores de oportunidades,18dossiers,19projectos,1921territórios,12sectores,63documentos,394eventos de auditoria,40utilizadores e3organizações. Novos apenas a ficha/dossier/percurso QA e respectivos registos de histórico. Sem alteração de código, schema, permissões ou provas técnicas/fiscais aceites. O formulário foi reaberto e ensaiado com valores sintéticos numa cópia; a versão para a equipa está em branco, com campos interactivos verificados e as duas páginas revistas visualmente.
|
||||
|
||||
**Entrega técnica independente:** `1afab4a2` continua candidata técnica aceite, runtime `3439f350`, sem instalação ou publicação nesta passagem. A capacidade do servidor deve ser novamente medida no procedimento da futura entrega; não se declarou resolvida nem se apagou conteúdo. L8 `14360748`, SGF TEMPO e demais provas preservados. Esta passagem não envia a ficha a terceiros nem publica oportunidades reais.
|
||||
|
||||
Recibo: `docs/investmoz/unification/proactive-handoff-gurue-qa-20261027.json`. Prova privada e nota do piloto: `outputs/proactive-handoff-gurue-20261027/gurue-proof.json` e `gurue-private-brief.html`. Saldo do Songo: recolha externa; saldo do Gurué: descoberta dirigida da necessidade; saldo da instalação: capacidade e procedimento de entrega. Estes três estados permanecem independentes.
|
||||
|
||||
|
||||
## 27/10/2026 — autonomia pela interface e candidata técnica consolidada
|
||||
|
||||
**Âmbito pedido:** reutilizar as provas aceites; demonstrar apenas anexar respostas, rever a ideia privada e encaminhar/actualizar o mesmo dossier pela interface, sem intervenção de código ou SQL na operação da equipa. Songo aguarda respostas externas e Gurué mantém a hipótese agrícola privada; ambos ficaram intactos. Não foram recolhidas respostas comerciais reais nem observada uma sessão de formação com funcionários.
|
||||
|
||||
### Guia curto da equipa
|
||||
|
||||
1. Entrar com o perfil operacional já autorizado e o MFA normal. Em **Minhas oportunidades → Nova oportunidade → Preparar análise e ideia**, indicar título, sector e apenas o território conhecido. Não substituir o promotor real por quem prepara a análise; a preparação interna permite que ainda seja desconhecido.
|
||||
2. Em **Evidências e proveniência**, separar facto e interpretação, identificar fonte/exemplar, trecho, período, abrangência e limitações. Manter **Interna — análise privada**. Guardar o rascunho e aguardar a confirmação do servidor.
|
||||
3. Para uma resposta recebida, abrir **Imagens, documentos e localizações → Documentos**, escolher o original, identificar emissor/versão/data quando conhecidos, página e afirmação fundamentada. Escolher classificação e consulta internas e **Guardar recurso**. O ficheiro fica privado e o seu estado de scan é visível; o download só fica disponível após scan limpo dos mesmos bytes.
|
||||
4. Regressar ao rascunho e escolher esse ficheiro em **Documento existente associado** na evidência correspondente. Rever a oferta/procura observadas, solução, pressupostos, pendências e próxima acção. Uma resposta parcial não confirma procura, preços ou sustentabilidade. Guardar e recuperar a ficha para conferir os dados.
|
||||
5. Usar **Preparar ou continuar investimento com esta ficha**. Se já existir, escolher o dossier e **Preparar neste dossier**; não criar outro para uma nova edição. Criar um dossier apenas para um investimento novo, com o título escolhido e consentimento de reutilização do próprio perfil.
|
||||
6. Confirmar a localização, usar **Rever dados antes de guardar**, conferir divergências e impactos e **Guardar dados do investimento**. O título e as edições deliberadas conservam-se. A referência à resposta acompanha a análise; o original permanece no gestor documental da ficha, acessível pelo link da ficha de origem e seus recursos, sem cópia ou divulgação automática dos bytes.
|
||||
7. Para novas respostas/edições, voltar à mesma ficha, guardar a revisão e continuar o mesmo dossier com nova prévia/confirmação. O dossier recebe a versão actual após confirmação; o estado anterior conserva-se no histórico. Informação em falta continua por determinar, sem zero presumido.
|
||||
8. **Divulgação promocional** é uma acção separada. Nada neste percurso publica o piloto, os anexos ou o dossier. A eventual decisão de publicação real continua independente da demonstração sintética e da instalação técnica.
|
||||
|
||||
### Delta demonstrado e correcção delimitada
|
||||
|
||||
Ensaio com o operador QA existente, login/MFA normais e apenas controlos da interface: nova ficha sintética403, resposta PDF de ensaio anexada e recuperada, ClamAV real limpo, hash do download igual ao original; documento associado à evidência; ideia revista; dossier `5bc28554-a2d1-4e60-9181-93ba0ecede59` criado e depois continuado sem duplicação. Fonte4/contexto2, hipótese e título deliberado preservados. O anexo e os dados são sintéticos; não constituem resposta de clientes ou parceiros reais.
|
||||
|
||||
Foi reproduzido e corrigido um aviso enganador: o pedido de complementos públicos tratava uma análise privada autorizada como referência pública desaparecida. **InvestmentComplements** consulta primeiro a autorização existente e devolve uma lista vazia para essa preparação privada; não a transforma em oferta pública. Origens públicas continuam a produzir os seus complementos; pedidos sem acesso continuam sem obter a fonte privada. Dois testes novos dirigidos,18asserções, passaram em transacção QA. A demonstração privada foi retomada sem o aviso. Não se alteraram permissões, tabelas, frontend ou motores fiscais.
|
||||
|
||||
Todos os54registos anteriores de oportunidades,19dossiers,63documentos,19projectos,1921territórios,12sectores,3organizações e399eventos de auditoria preservados por comparação de hashes. Novos apenas a amostra QA e seus registos. As provas anteriores de criação/edição, publicação expressa, anonimato, histórico, relatório, Wayfinder, TypeScript e build foram reutilizadas; não se repetiram suites fiscais ou a análise económica dos pilotos. Foi conferida a recuperação da referência documental e das novas linhas pelo relatório existente.
|
||||
|
||||
### Candidata para instalação futura
|
||||
|
||||
Runtime desta correcção: `51d536b7`; inclui o percurso técnico `3439f350`/candidata aceite `1afab4a2`, documentação e ficha de prospecção `403c444a`. A comparação com main remoto `f8d57bdd` confirmou ancestralidade, sem alterações entretanto integradas a perder. O delta de runtime face à candidata anterior limita-se à consulta de complementos; frontend, schema e configuração mantêm-se.
|
||||
|
||||
**Não instalado.** Antes da entrega activa, medir novamente espaço/inodes na partição do instalador e dos backups, confrontar com a necessidade efectiva de compilação isolada/backup, conferir o main então actual, executar backup/restauro fresco e manter a versão activa até a nova estar pronta. Depois conferir revisão servida e apenas o delta. A preparação dos pilotos QA não integra dados na base activa nem publica oportunidades. L8 `14360748` permanece separado; SGF TEMPO intocado. Não se fizeram SSH, limpeza, backup ou instalação nesta passagem.
|
||||
|
||||
Recibo: `docs/investmoz/unification/proactive-team-autonomy-qa-20261027.json`. Provas e pacote local: `outputs/proactive-team-autonomy-20261027/`. A verificação comprova que o percurso está disponível aos perfis autorizados através da interface; não declara formação da equipa, viabilidade dos pilotos ou conclusão integral dos requisitos nacionais.
|
||||
|
||||
|
||||
## 27/10/2026 — duas entregas autorizadas: L8 primeiro, percurso proactivo depois
|
||||
|
||||
O responsável autorizou expressamente a execução das duas entregas pelo procedimento existente, sem nova ronda de autorização. A indicação histórica de manter preparado em `c85e772d` foi reconciliada: o commit acrescenta documentação de capacidade, sem mudar o código de L8 `14360748`/runtime `11a6cee9`. A autorização actual permite retomar; não substitui a medição de capacidade nem o backup/restauro frescos.
|
||||
|
||||
**Etapa1:** L8 em `c85e772d`, com a colecta válida, retenções efectivamente sofridas e PPC comprovados no recorte aceite; PEC e créditos próprios continuam separados. **Etapa2:** ramo `codex/sequential-delivery-20261027`, merge de L8 e do percurso proactivo `0ff402a1`, runtime reconciliado `74f7f93a`. A etapa2 só segue após confirmar a revisão efectivamente servida na etapa1.
|
||||
|
||||
O relatório comum tinha um conflito de imports. Foram conservados ambos e as chamadas de linhas anuais e proactivas. Os restantes ficheiros de runtime de cada candidata ficaram idênticos à origem. Verificação apenas da integração partilhada:6linhas anuais e10linhas proactivas recuperadas, entradas intactas e sem inferência cruzada. TypeScript e compilação QA isolada passaram; suites económicas/fiscais aceites não repetidas. Documentação de ambas as linhas conservada, sem importação de fixtures ou escrita em bases.
|
||||
|
||||
**Estado efectivo desta passagem: preparado, sem instalação.** O main remoto permanece `f8d57bdd` e a revisão pública servida foi conferida por HTTP em27/10/2026,10:14UTC, também `f8d57bdd`. A ponte SSH local estava `closed`; a autenticação por chave foi recusada com a chave do servidor registada e conferida. Não havia aqui uma sessão autenticada utilizável. Não foram executados backup/restauro frescos, alteração de main ou instalação. A capacidade antiga de4,10GiB é histórica e não foi apresentada como medição actual.
|
||||
|
||||
Retomar na sessão local com SSH autenticado, usando a autorização já registada: medir espaço/inodes na partição efectiva, comparar com compilação e backup, conferir main e revisão activa, criar e ensaiar backup fresco, instalar L8 e conferir apenas o seu delta. Depois repetir as guardas necessárias para a candidata conjunta e conferir o delta proactivo preservando L8. Manter a versão activa até a nova estar pronta. Excluir fixtures QA dos inputs de instalação; não executar seeders/importações de amostras, não publicar pilotos privados nem usar o pacote QA como cópia da base activa. SGF TEMPO separado.
|
||||
|
||||
Recibo de preparação: `docs/investmoz/unification/sequential-delivery-preparation-20261027.json`. Provas e instrução de passagem: `outputs/sequential-delivery-20261027/`. Os recibos de execução e as duas revisões servidas serão registados apenas depois de execução real na sessão autenticada; este recibo não os substitui.
|
||||
|
||||
@@ -0,0 +1,695 @@
|
||||
{
|
||||
"status": "installed_L6_cost_limits_provisions_timing",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "043dd35d8ee247123b3a32f1fc10fd2ede81e9f4",
|
||||
"release": "/var/www/investmoz-homologacao/releases/043dd35d8ee247123b3a32f1fc10fd2ede81e9f4-917b3c47",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_baseline": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l6-costs-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T06:35:29Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "bf7f4e6ad9e18ef479ae46a08ec9c072047240655331e437da14ae8c39e8bd0b",
|
||||
"files_sha256": "4046d8eff093201371a9e5fbdd14a6d5fe805d7f72cf30e9d6132e5804da1788",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l5_restore_20261025",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "bf7f4e6ad9e18ef479ae46a08ec9c072047240655331e437da14ae8c39e8bd0b",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "043dd35d8ee247123b3a32f1fc10fd2ede81e9f4",
|
||||
"release": "/var/www/investmoz-homologacao/releases/043dd35d8ee247123b3a32f1fc10fd2ede81e9f4-917b3c47",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 6,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 42,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "5226f818ead8e964983de752574a1647"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "82f4ca900546cfbd7c046c9e2a681522"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 35,
|
||||
"checksum": "077762df7046fb9e6ce60a7470f3b61f"
|
||||
},
|
||||
"after": {
|
||||
"rows": 38,
|
||||
"checksum": "b90979f4d72922226d368ab21ffe162a"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart value/expiry and request-throttle counter/timer pair;no deleted cache rows",
|
||||
"sessions": "anonymous sessions created by exact delivery verification user-agent",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dbb99b7e17f5b4b9bb7a8bdf9350d9b2ae368aaa4bc44593a2522d87617d8461",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "c1c7bc86ef3255c103a0be6aeb651b824eb07259e993cc5daf3665c1a6afff2d",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 35,
|
||||
"after_rows": 38,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "29cd831ee5192663271b023bde8978c87f54e6779a76887fbdbb7d8b52898085",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "5818b9263233545023da019e37aa9c88c4f02128d540df592d1eb4cb075b406d",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "e30d5aad1397f2c086ee5dcd82a279b9a307415336c02059ff9513ef5251f262",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public_verification": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "043dd35d8ee247123b3a32f1fc10fd2ede81e9f4",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T06:40:10.666340+00:00",
|
||||
"manifest_sha256": "d91dd39d49e9e0251c76c811ca6a0798b7cf544e3e807735574ba51691afac9e"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"Iniciar custos com limites, provisões e periodização": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Acrescentar custo, provisão ou periodização": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Publicidade — limite único anual": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Créditos — limites anual e acumulado": [
|
||||
"assets/services-DkQ7aTGY.js",
|
||||
"assets/project-dossier-EB1GFWid.js"
|
||||
],
|
||||
"Conferir correspondência dos temas com os mapas": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Aplicar correspondências conferidas dos mapas": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Iniciar mapas complementares L6": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Saldo final — âmbito L8": [
|
||||
"assets/project-dossier-EB1GFWid.js"
|
||||
],
|
||||
"Calcular e guardar apuramento trimestral ISPC": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Calcular e guardar restituição E": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
],
|
||||
"Reutilizar selecção cambial": [
|
||||
"assets/services-DkQ7aTGY.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/project-dossier-document-DDnA8FXy.js",
|
||||
"status": 200,
|
||||
"sha256": "47280845a07c33b1d2dd3c8f770a9f0f213476e99ad8f927f812c75a66a855df"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
},
|
||||
{
|
||||
"file": "assets/services-DkQ7aTGY.js",
|
||||
"status": 200,
|
||||
"sha256": "8782f7a7758e8f25803737ec5e072ba4888ad946d54611ce501364608c24a633"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-EB1GFWid.js",
|
||||
"status": 200,
|
||||
"sha256": "8328b2676e8da123e8126ed718895a0ddaaabed30a80a7cef902be911ef8bffd"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-Dz8nCVw7.js",
|
||||
"existing_fiscal_availability": {
|
||||
"data": {
|
||||
"enabled": true,
|
||||
"coverage_start": "2026-01-01",
|
||||
"coverage_end": "2026-12-31",
|
||||
"message": "IVA geral sobre base líquida disponível; enquadramento declarado."
|
||||
}
|
||||
},
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256_LF": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "8001d2e71b58fa07c77f74da2c2b51566659a5d784d9e044133192c66518cb15"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "fef34966db603633eb03c9830ad3c09e7cd0ffaed49720dbab60f9dc0fd8a8fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256_LF": "29aeb16bf8fe60bb322b5449fb3efd84b5108b06112b91be5fc76d8e897d8860"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256_LF": "26810caea4e7d177b385e36452147d84602a7b23cb5f8f23a88488d1bfaf619f"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "98adf3e1c84938d27535f65afa24edc0650bfb12a1f9b32352b0d4d71c2c2035"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256": "eebd6d9e4100920a5ebf91b800537ffe301fd6a994b86a3b080d673f4a9c9a42"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256": "1dc6adc0835af033ef296d12cdc1e9ef354b2f54cd36e2349b2df66e369c1ee3"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256": "b0045fd2c072998ebb290c2a8332c26d05a1f5f746b3beb1805508147497cac8"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"pipeline_checks": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 31.63s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 942",
|
||||
"# pass 942",
|
||||
"# fail 0"
|
||||
],
|
||||
"accepted_QA_proofs": {
|
||||
"new_frontend_tests": 22,
|
||||
"private_API_tests": 1,
|
||||
"private_API_assertions": 83,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "generated by existing guarded procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component;fieldediting;missingconditions;reviewed topic reconciliation;sharedcaps;local roundtrip;download;mandatory work method",
|
||||
"dossier": "generated from5 API recovered cases",
|
||||
"accepted_functional_suites": "reused,not manually repeated"
|
||||
},
|
||||
"accepted_proofs_reused": true,
|
||||
"manually_repeated_accepted_suites": false,
|
||||
"sequence": {
|
||||
"taxable_profit": "6730MZN simulated",
|
||||
"taxable_base": "4430MZN simulated",
|
||||
"normal_colecta": "1417.60MZN simulated,32%",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"remaining_L6": [
|
||||
{
|
||||
"pending_case_or_mapping": "Combinação36h/i com36(4)",
|
||||
"resolution_condition": "Corresponder a regra de articulação dos trechos aplicáveis ou esclarecer comAT o exemplo combustível100/comprovado80/passageiro sem excepção;sem somar ou repartir correcções por presunção.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Quota36h automática e amortizações restantes",
|
||||
"resolution_condition": "Reconciliar tabela/método/entrada emuso/quotas contabilísticas e fiscais anteriores;prioridade seguinte deL6. A parcela36h documentada continua reutilizável nos casos independentes.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Campanhas plurianuais36-A e limite1%",
|
||||
"resolution_condition": "Implementar a periodização por três exercícios e a sua articulação com36n; não tratar a campanha como publicidade ordinária.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Provisões reguladas28d e reforços financeiros28(3)",
|
||||
"resolution_condition": "Corresponder a regra sectorial/supervisão ou o reforço financeiro e os saldos documentados; não usar os limites ordinários29 por aproximação.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Receita antecipada19(5) positiva e mudança autorizada19(6)",
|
||||
"resolution_condition": "Corresponder os custos futuros/receita antecipada e o transporte entre exercícios ou a autorização da mudança de método;os casos zero conhecido/método mantido permanecem executáveis.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Outras periodizações,âmbitos eM20/M22",
|
||||
"resolution_condition": "Tratar apenas os casos específicos18(6–10),períodos curtos/conversão anual,representação fiscal e campos ainda sem correspondência,com os parâmetros da edição/caso;divergência201/Q8 versus200/Q10 só afecta o transporte indicado.",
|
||||
"blocking_scope": "Apenas o caso/campo dependente."
|
||||
}
|
||||
],
|
||||
"matrix_row": "AUD-SIM-INT02",
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"documentary_divergence": "Only result transfer M20A.1 field201/Q8 versus PDFM22 field200/Q10;independent calculations and mapped fields remain available",
|
||||
"L5_ten_questions": "unchanged;only dependent cases blocked;no new research",
|
||||
"documentation_runtime_changed": false,
|
||||
"proof_files": {
|
||||
"backup.txt": "a40060e515e6f9a23962654ceca1384a8c4f3a9c0b5cb84a2510a892172023f5",
|
||||
"compact-dependencies.txt": "52b6b2b5abe937c37c975efa4c595eb0c38b5f23ea9d342786d859c63eb30ebf",
|
||||
"installed-protected.txt": "d10547839935cf162a2f335aafc6d0e274b1623338fbb3c51031c27ac7fde19c",
|
||||
"installed-public-delta.json": "00db424cb414c133adb85ae8bd1b3bfa7dc01b89b3bc055db71ab7b921651981",
|
||||
"installed-public.txt": "ab32725cb73e82888851b46ffc2111e23a839567ccfafca945e6ee2d72f967f0",
|
||||
"integration.txt": "cb09cb7139c730d7e178de518c4158347725009d4ccee9fc0252e8da7cd6bbc3",
|
||||
"manifest-served.json": "d91dd39d49e9e0251c76c811ca6a0798b7cf544e3e807735574ba51691afac9e",
|
||||
"operational-delta.txt": "8739d8f2cc58dd500e8fa393eb65ed15d24ba840e30f429e135d0ed8b49cd60f",
|
||||
"preflight.txt": "289577c3c3a959ec01405e5bc3d929a0b7be1654579b4bfd32f82ab20c3f22c2",
|
||||
"preparation.json": "603d3e4f9a40b91a717945160a11723ca3ddeb0e329af69179dba8276f0d4331",
|
||||
"remaining-section.md": "253d4d1de16bbfe6253971507c3a2e3976ea9ce017930d9ba80eef8c1191955e",
|
||||
"restore.txt": "bbdee061e3947b1e606c04ad17f83d5951cca0be0d33027a9e20be76121f38b7",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-final.txt": "04413dcbffc95e88abd7f5201b5709ee7a3b9856ccf0c5824d9a4d036ea6d3b4",
|
||||
"status1.txt": "177d1c66d844074ffb3db7b1392804f4de92ab804076671750362b9987a748e5",
|
||||
"status2.txt": "04413dcbffc95e88abd7f5201b5709ee7a3b9856ccf0c5824d9a4d036ea6d3b4"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,869 @@
|
||||
{
|
||||
"status": "compatible_cost_limits_provisions_timing_QA_prepared_not_installed",
|
||||
"installed_baseline": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"branch": "codex/irpc-l6-costs-provisions-timing-qa-20261026",
|
||||
"QA_workspace": "C:\\laragon\\www\\portal-investidor-irpc-l6-costs-qa-20261026",
|
||||
"version": "IRPC-normal-adjustments/6",
|
||||
"scope": "AnnualMZN periods ending2026,ordinary documented cost/provision categories and prior-year/work timing;normal profit/base/colecta only;L7/L8 remain own scopes.",
|
||||
"demonstrated_sequence": {
|
||||
"accounting_profit": "6240MZN unchanged",
|
||||
"previous_addbacks": "220MZN",
|
||||
"previous_schedule_effect": "520MZN",
|
||||
"new_cost_provision_prior_timing_adjustments": "350MZN",
|
||||
"new_work_adjustment": "-600MZN",
|
||||
"taxable_profit": "6730MZN",
|
||||
"previous_loss_deduction": "2300MZN explicit,unchanged",
|
||||
"taxable_base": "4430MZN",
|
||||
"rate": "32%",
|
||||
"colecta": "1417.60MZN",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"cases_recovered_by_private_API": {
|
||||
"calculated": {
|
||||
"profit": {
|
||||
"numerator": "6730",
|
||||
"denominator": "1"
|
||||
},
|
||||
"base": {
|
||||
"numerator": "4430",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "7088",
|
||||
"denominator": "5"
|
||||
},
|
||||
"cost_effect": {
|
||||
"numerator": "-250",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
},
|
||||
"missing": {
|
||||
"profit": null,
|
||||
"base": null,
|
||||
"colecta": null,
|
||||
"cost_effect": {
|
||||
"numerator": "-400",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [
|
||||
"QA-credit: Provisão fiscal anterior dos créditos em falta; não presumir zero."
|
||||
],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
},
|
||||
"additional": {
|
||||
"profit": {
|
||||
"numerator": "7050",
|
||||
"denominator": "1"
|
||||
},
|
||||
"base": {
|
||||
"numerator": "4750",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "1520",
|
||||
"denominator": "1"
|
||||
},
|
||||
"cost_effect": {
|
||||
"numerator": "70",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
},
|
||||
"limits": {
|
||||
"profit": {
|
||||
"numerator": "7210",
|
||||
"denominator": "1"
|
||||
},
|
||||
"base": {
|
||||
"numerator": "4910",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "7856",
|
||||
"denominator": "5"
|
||||
},
|
||||
"cost_effect": {
|
||||
"numerator": "230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
},
|
||||
"closing": {
|
||||
"profit": {
|
||||
"numerator": "6530",
|
||||
"denominator": "1"
|
||||
},
|
||||
"base": {
|
||||
"numerator": "4230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "6768",
|
||||
"denominator": "5"
|
||||
},
|
||||
"cost_effect": {
|
||||
"numerator": "-450",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": [],
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"categories_demonstrated": {
|
||||
"allowance": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "70",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "30",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "30",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC36(1)e",
|
||||
"reason": "50% só da parcela não facturada a clientes nem tributada emIRPS; parcelas mutuamente exclusivas."
|
||||
},
|
||||
"representation": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "40",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(1)f/36(3)",
|
||||
"reason": "20% aceite;80% acrescido. Eventual tributação autónoma não calculada, âmbitoL7."
|
||||
},
|
||||
"advertising": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC36(1)n,Lei20/2009",
|
||||
"reason": "Limite único anual1% das vendas normais; repartição aritmética proporcional entre parcelas para a simulação, sem ordem fiscal obrigatória."
|
||||
},
|
||||
"credit": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "200",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "150",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC28(1)a/29",
|
||||
"reason": "29:1,5% anual,6% acumulado sobre créditos da actividade normal existentes no fim; saldo fiscal anterior conhecido. Repartição proporcional do limite único, sem consumir saldo oficial."
|
||||
},
|
||||
"stock": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "60",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "30",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "30",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "40",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC28(1)b",
|
||||
"reason": "28b:limite das perdas efectivamente observadas, incluindo saldo anterior."
|
||||
},
|
||||
"litigation": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "90",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC28(1)c",
|
||||
"reason": "28c:obrigações de processo judicial em curso que seriam custos dedutíveis, com saldo anterior reconciliado."
|
||||
},
|
||||
"fuel": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "40",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(1)i/36(4)",
|
||||
"reason": "36i: parcela ligada a activo próprio/locado e consumo normal comprovados."
|
||||
},
|
||||
"prior_cost": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC18(2)",
|
||||
"reason": "18(2):conhecido/previsível no encerramento anterior; excluído do actual, sem alterar declarações/históricos anteriores."
|
||||
},
|
||||
"work": {
|
||||
"case": "calculated",
|
||||
"source_amount": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "200",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "-600",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": {
|
||||
"numerator": "400",
|
||||
"denominator": "1"
|
||||
},
|
||||
"rule_source": "CIRPC19(1–6)",
|
||||
"reason": "19:grau=incorrido/custo total;valores fiscais do exercício obtidos dos acumulados menos o já reconhecido. Proveito fiscal corrente:400.00 MZN;custo fiscal corrente:200.00 MZN;sem imposto/pagamento ou perda estimada presumidos."
|
||||
},
|
||||
"vehicle": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(4)",
|
||||
"reason": "50% dos outros encargos de passageiros, excepto serviço público de transportes/locação na actividade normal; não inclui quotas, aluguer sem condutor ou combustível já discriminados."
|
||||
},
|
||||
"rental": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "80",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "20",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(1)h/36(4)",
|
||||
"reason": "36h: reutiliza parcela de quota não aceite documentada; o portal não apura automaticamente essa quota de viatura."
|
||||
},
|
||||
"estimated_work_loss": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC36(1)m,Lei20/2009",
|
||||
"reason": "36m:perda meramente estimada em obra em curso não dedutível; custo efectivo não confundido com estimativa."
|
||||
},
|
||||
"provision_reversal": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC28(2)",
|
||||
"reason": "28(2):proveito da provisão antes deduzida; só acresce quando ainda não incluído no resultado."
|
||||
},
|
||||
"taxed_reversal": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "-50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC17/28;sem dupla tributação da parcela comprovada",
|
||||
"reason": "Parcela antes tributada comprovada; exclui a reversão contabilística sem duplicar dedução."
|
||||
},
|
||||
"prior_income": {
|
||||
"case": "additional",
|
||||
"source_amount": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"accepted": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"adjustment": {
|
||||
"numerator": "-50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"limit": null,
|
||||
"rule_source": "CIRPC18(2)",
|
||||
"reason": "18(2):conhecido/previsível no encerramento anterior; excluído do actual, sem alterar declarações/históricos anteriores."
|
||||
}
|
||||
},
|
||||
"verification": {
|
||||
"new_frontend_tests": 22,
|
||||
"private_API_tests": 1,
|
||||
"private_API_assertions": 83,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "generated by existing guarded procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component;fieldediting;missingconditions;reviewed topic reconciliation;sharedcaps;local roundtrip;download;mandatory work method",
|
||||
"dossier": "generated from5 API recovered cases",
|
||||
"accepted_functional_suites": "reused,not manually repeated"
|
||||
},
|
||||
"preservation": {
|
||||
"installed5_fixture_sha256": "109426b86ae7c14463699b1d197064617f124ecec0c55085d9e81aeddc505a5a",
|
||||
"matches_accepted5_fixture": true,
|
||||
"versions1_to5_current_keys": "unchanged without optional costs input",
|
||||
"history": "old record preserved unchanged on new calculation;no rewriting prior returns",
|
||||
"other_books": "preserved in snapshot roundtrip",
|
||||
"source_plan": "reused,no re-entry of financial result/base/colecta",
|
||||
"schema_API_config_permissions_dependencies_changed": false,
|
||||
"active_data_changed": false,
|
||||
"official_fiscal_balances_consumed": false,
|
||||
"fractional_precision_delta": "Exact numerator comparison for current loss and loss-deduction cap;negative subcent result cannot be truncated to zero"
|
||||
},
|
||||
"runtime_delta_joint_from_a2de7259": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256_LF": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "8001d2e71b58fa07c77f74da2c2b51566659a5d784d9e044133192c66518cb15"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "fef34966db603633eb03c9830ad3c09e7cd0ffaed49720dbab60f9dc0fd8a8fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256_LF": "29aeb16bf8fe60bb322b5449fb3efd84b5108b06112b91be5fc76d8e897d8860"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256_LF": "26810caea4e7d177b385e36452147d84602a7b23cb5f8f23a88488d1bfaf619f"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "98adf3e1c84938d27535f65afa24edc0650bfb12a1f9b32352b0d4d71c2c2035"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256_LF": "eebd6d9e4100920a5ebf91b800537ffe301fd6a994b86a3b080d673f4a9c9a42"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256_LF": "1dc6adc0835af033ef296d12cdc1e9ef354b2f54cd36e2349b2df66e369c1ee3"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256_LF": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256_LF": "b0045fd2c072998ebb290c2a8332c26d05a1f5f746b3beb1805508147497cac8"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256_LF": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256_LF": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256_LF": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256_LF": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256_LF": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256_LF": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256_LF": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256_LF": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256_LF": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256_LF": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256_LF": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256_LF": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256_LF": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256_LF": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256_LF": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256_LF": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256_LF": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256_LF": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256_LF": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256_LF": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256_LF": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256_LF": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256_LF": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256_LF": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256_LF": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256_LF": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256_LF": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256_LF": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256_LF": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256_LF": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256_LF": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256_LF": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256_LF": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256_LF": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256_LF": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256_LF": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256_LF": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256_LF": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals_preserved": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"source_evidence": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"new_clauses": "18(2)/19 PDF6–7;28/29 PDF8–9;36e/f/h/i/4 PDF10–11",
|
||||
"use": "ordinaryconditions/rates/caps/timing,visual excerpts retained inQA"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"new_clauses": "PDF2 retains18(1–6),adds7–10;PDF3 updates28 wording;PDF4 adds36m/n and36-A",
|
||||
"use": "provisions/estimatedworkloss/ordinary advertising1percent;campaign36-A explicitlypending"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"new_clauses": "PDF2 retains36a–n;adds36o",
|
||||
"use": "scope cross-check of supplied amended source"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"new_clauses": "PDF2 retains36a–o;adds p/q",
|
||||
"use": "scope cross-check;no new related-party interest rule introduced"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"use": "Existing supplied scope ofLei12/2025,source acceptance and rateproof reused;no unrelated revalidation or L5 research"
|
||||
}
|
||||
],
|
||||
"case_specific_remaining": [
|
||||
{
|
||||
"case": "Overlapping36h/i exclusion and36(4)50percent",
|
||||
"example": "Fuel100,supported80,ordinary passenger vehicle",
|
||||
"condition": "Correspond explicit combination rule for the cited clauses or obtain a targeted AT clarification;no additive/proportional tax rule presumed"
|
||||
},
|
||||
{
|
||||
"case": "Rental36h quota",
|
||||
"condition": "Supply documented nonaccepted quota for supported matching;automatic vehicle-quota determination remains in asset scope"
|
||||
},
|
||||
{
|
||||
"case": "Multi-year launch campaign36-A and1percent limit",
|
||||
"condition": "Implement3exercise timing and its interaction with36n;do not treat as ordinary advertising"
|
||||
},
|
||||
{
|
||||
"case": "Regulated provisions28d,financial unwind28(3),other sector provisions",
|
||||
"condition": "Map applicable supervision/sector rule and documented balances;do not reuse ordinary29 caps"
|
||||
},
|
||||
{
|
||||
"case": "Positive deferred receipts19(5),authorised method change19(6)",
|
||||
"condition": "Map remainingcost/deferredreceipt rollforward and applicable authorisation;only knownzero deferral/unchanged method demonstrated"
|
||||
},
|
||||
{
|
||||
"case": "Specific timing18(6–10),other asset/method/shortperiod/annualFX/fiscalrepresentation/form mappings",
|
||||
"condition": "Remaining concrete L6 cases preserved in existing matrix,not closed by this ordinary increment"
|
||||
}
|
||||
],
|
||||
"m20_m22_divergence": "Unchanged and limited to result transfer201/Q8 versus200/Q10;no dependency gate in cost calculation;no new official field correspondence presumed",
|
||||
"L5_ten_questions": "unchanged,not researched;only actual dependent cases blocked",
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"installation_performed": false,
|
||||
"proof_sha256": {
|
||||
"additional.json": "b76790cb34736281fd181cbf0c871135cb42e75e1acc34ab3c42ed7e696ad5b1",
|
||||
"api.txt": "dff9be0d1338e833adf5c7f10dc4c4e5d5cefde97f284db927608f3c3c334be2",
|
||||
"build-exit.txt": "13bf7b3039c63bf5a50491fa3cfd8eb4e699d1ba1436315aef9cbe5711530354",
|
||||
"build.txt": "21ce0d3af4edc5c74d5cbeebd817b4716b233b0eb54ad03b1f22ebe80edd844a",
|
||||
"calculated.json": "23119339a0337c755f2a045078903858b7da6b95196a91de51170ca115d468a7",
|
||||
"closing.json": "9f87eec9710aeec4819a7b10b64986ad9e4afbb458cd95a49a8f6f035c235ad8",
|
||||
"Decreto-9-2008-BR16.txt": "c680dfb73eeb638cf85d06fb0fe19550487de2994ce76f60077ef4baa88e3238",
|
||||
"dossier-additional.json": "19ad04483c38306982cd182e08445952ec1e5ad5ce821cc345df5ccf75ac4a7a",
|
||||
"dossier-calculated.json": "99c4bff798b7338138216a405aa5de228e88429af3c12290bf1b7071bd40e01a",
|
||||
"dossier-closing.json": "d054eb3da44363d3861037c7bb59074572f630078f6d3aa3d2e4de89983928b0",
|
||||
"dossier-limits.json": "52aaea2415159cacdbc44d56a98918a8438e3bacde06199e0545a265b7d6982d",
|
||||
"dossier-missing.json": "50eff5af4b909ef08f4619ac768d5e8f8d4de01d003c81ef3748bd74a9bccfe2",
|
||||
"dossier.mjs": "0824a3b05fa4bf758bbb165c0fce74fe9cd6ab817ceda5437ef7c73b28794a46",
|
||||
"download.html": "ebf40a955530b10753da0cfd7769c0ad879b079bdade64f4e06ec901912456df",
|
||||
"frontend.txt": "c6aa5222a8b5c867e50a2aca4ab5edd6ab9812f9fb2f6bce8482092951e022bd",
|
||||
"index.html": "09941968500d2910121bdcb0029e326fc6d44bb025b01766654289a28caa62fa",
|
||||
"Lei-19-2013-BR76-page2.png": "952cb5d68fa162043964c282b1ac32faf8bcbb92f2bb83fef2084ae691afae12",
|
||||
"Lei-19-2013-BR76.txt": "7060584c3e59f0b2f12f34aa0b40faadf4aa5790a0459f3319852bcd63262cbb",
|
||||
"Lei-20-2009-BR36-AT-exemplar19-page2.png": "e39eadef731b6c3ae8cb4820238c4db3184111557d982a20dadee139ea2952a2",
|
||||
"Lei-20-2009-BR36-AT-exemplar19-page3.png": "a4a39a81849f32e4c596ef7c0726d2054e74bf45531dd8e920d3927cafdb70bd",
|
||||
"Lei-20-2009-BR36-AT-exemplar19-page4.png": "cafa0e22b0f29296bd28772609fa87708811704c25ae7bf676dba53783e25168",
|
||||
"Lei-20-2009-BR36-AT-exemplar19.txt": "2e04eb1c5be52619e21eb1c376f71603d998672f4c220e0bfc1648df80d5e6fe",
|
||||
"Lei-34-2007-BR52-page10.png": "74937b18d2863c1199e88380e25d39c7ada80c37621196e5402bffa61f6b49be",
|
||||
"Lei-34-2007-BR52-page6.png": "de2c1cc9c8bf5b0cefa9671cc8ad776e21a8492b791648be492d1540d78f748f",
|
||||
"Lei-34-2007-BR52-page8.png": "f69bbe8484e315a5bf5818277c1bb3d67e4e86724544b34565731d5c3f4408df",
|
||||
"Lei-34-2007-BR52-page9.png": "e449f13d39c9f23e408c185e00bafd621706d9cccd037d399e602eece33b6ba5",
|
||||
"Lei-4-2012-BR3-page2.png": "99c5a820ad1e1201af25f60b51c86b3c7bced25acc12343366eadb3133185128",
|
||||
"Lei-4-2012-BR3.txt": "9478ac3ef61ae9df286d951edbfce4c24049f65e860f053ed9eb2c3fbd78d051",
|
||||
"limits.json": "c73905029246c1bbdf91b24869582b6057d62d01dd853e76d2e603786d8810ea",
|
||||
"missing.json": "159c4d3f21d87ff3ea43ad5cfa8a42faea05105feab0a4b5529d37e72d9aea73",
|
||||
"originals-inventory.json": "f91baf686619187dac23bce2c3bde71cc7ddf201fef10a24479548c44abc7d94",
|
||||
"preparation.html": "e9951a85471c44fd9ff5211e59a8eb740e5b8823a4bb6b63c12237feb3d997fd",
|
||||
"qa.tsx": "58e66698e44d68d169117a70d0d15aa07ce77b88bed1234d922d0844a9aac9b0",
|
||||
"recovered-additional.html": "3f562a91fcc2ba6f47c1661f13a39a6c7d939c4730bd4ba9178b60fb05d5b6a6",
|
||||
"recovered-additional.json": "a7adf543887479edf259d2501fe061a14c8aa03e206848726fae0f567b594419",
|
||||
"recovered-calculated.html": "e9951a85471c44fd9ff5211e59a8eb740e5b8823a4bb6b63c12237feb3d997fd",
|
||||
"recovered-calculated.json": "e000b426aefbfad520fe2a03707ca756a87fe04ab39536d509008e03c6288c2b",
|
||||
"recovered-closing.html": "d17bd5944b2f37d752883b22955bcd3c57695f72b464580087403dfa448d785e",
|
||||
"recovered-closing.json": "5f1b2cbe830154e35e60512882aa023fdc443125cf37253e10b85af7f47dddb2",
|
||||
"recovered-limits.html": "4b24bebe5b4d93bc6b06233d795197bb28ca4116eb29832981bafb33804d1a2d",
|
||||
"recovered-limits.json": "28611229e027a0d51593ecf71bae32b6f35f7f2767c26680fa2dceb0e7d9ad11",
|
||||
"recovered-missing.html": "6fa22cb9757a5812d23a1615a43337f20ba1812097d8b4d79c1a3db1a356d8dd",
|
||||
"recovered-missing.json": "b5aa2c3045d79193518621b4764540775470db97bdbc84ac19804c70baa05324",
|
||||
"types.txt": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"ui-calculated.png": "3c1070fbb0b9ca66d1b128935ab23e737a11ee2918fc566259a5d70bbae4aa26",
|
||||
"ui-missing.png": "d0c1c138e9b2404ae8a17c0732d8ab1b7bfbcf89ff431aa4d80e3dfaf7f8d5db",
|
||||
"ui-proof.json": "108af6bd1557c6a920842102b1a9b54711fc3ab96e32296e1c2c3f77abda177a",
|
||||
"ui.cjs": "2de9dd0e333edca1a3fd23a6e409cd41271f619cfb2186bbfdf6444855dd35d0",
|
||||
"ui.txt": "8799b836baa3cf8efefce8a5b0b6951c7963e50fb3e08b0be3d2de3434ff4795",
|
||||
"vite.config.ts": "2ad3c19a485d8175b33550b017f2a67934f9fbebda5f6f16e69b9fb89809c398"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,682 @@
|
||||
{
|
||||
"status": "installed_L6_short_periods_and_foreign_currency_plans",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "56475acb2f39e58cb51664913f7fb499f58eb7ab",
|
||||
"release": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e9fe102259c183a9d9bf7e39f246a8c3860839c6-0e29d858",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_baseline": "e9fe102259c183a9d9bf7e39f246a8c3860839c6",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l6-periods-fx-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T08:17:39Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "9ecd9f379351437f88009aa6da072e09ec8616fd782b929919ade05be1493bdc",
|
||||
"files_sha256": "6da03ab176387b105da1345764f3b292794d8867d0ed4add47197e0a1e5854fa",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l5_restore_20261025",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "9ecd9f379351437f88009aa6da072e09ec8616fd782b929919ade05be1493bdc",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/e9fe102259c183a9d9bf7e39f246a8c3860839c6-0e29d858",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "56475acb2f39e58cb51664913f7fb499f58eb7ab",
|
||||
"release": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e9fe102259c183a9d9bf7e39f246a8c3860839c6-0e29d858",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 9,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 43,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "1b8bf615a2fdea986761abc88bfb4419"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "a845f75cfcf49b86ebb8a3816f886a63"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 9,
|
||||
"checksum": "635e8bece48c8f7780635c0c79cd6010"
|
||||
},
|
||||
"after": {
|
||||
"rows": 12,
|
||||
"checksum": "703dbf39af0534461019da7c73354454"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
|
||||
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dbb99b7e17f5b4b9bb7a8bdf9350d9b2ae368aaa4bc44593a2522d87617d8461",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "c1c7bc86ef3255c103a0be6aeb651b824eb07259e993cc5daf3665c1a6afff2d",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 9,
|
||||
"after_rows": 12,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "6e12944bc8f670195d0c6d2638337e2bf922261a158d130ba09f640a5722f0df",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "11bbe5f81c536cf605ed71f402fbaa6e9ef551d97c0a76e098078521d9f37f71",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "d0a4dbafaf19e2eee3af4ea41ce9aabf52cb42d5a61a598c54b37d8863b533d7",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"dependency_archiving": {
|
||||
"status": "dependencies_archived_and_verified",
|
||||
"versions": 5,
|
||||
"free_before": 5329760256,
|
||||
"free_after": 6645653504,
|
||||
"receipt": "/var/backups/investmoz-build-dependencies-irpc-l6-periods-fx-20261026/receipt.json",
|
||||
"protected": [
|
||||
"/var/www/investmoz-homologacao/releases/043dd35d8ee247123b3a32f1fc10fd2ede81e9f4-917b3c47",
|
||||
"/var/www/investmoz-homologacao/releases/e9fe102259c183a9d9bf7e39f246a8c3860839c6-0e29d858"
|
||||
],
|
||||
"active_or_previous_release_modified": false,
|
||||
"source_data_backups_deleted": 0
|
||||
},
|
||||
"public_verification": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "56475acb2f39e58cb51664913f7fb499f58eb7ab",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T08:23:47.654431+00:00",
|
||||
"manifest_sha256": "f6121cade74d12c6de25630b23a1bd73f244a089c2649bf2c3aa76c68491431c"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"IRPC-normal-adjustments/8": [
|
||||
"assets/project-dossier-BGxws1O_.js"
|
||||
],
|
||||
"Preparar período curto ou plano noutra moeda": [
|
||||
"assets/services-08vnaMl1.js"
|
||||
],
|
||||
"Primeiro mês civil do plano": [
|
||||
"assets/services-08vnaMl1.js"
|
||||
],
|
||||
"Pressuposto documentado da conversão mensal para simulação": [
|
||||
"assets/services-08vnaMl1.js"
|
||||
],
|
||||
"Saldo final — âmbito L8": [
|
||||
"assets/project-dossier-BGxws1O_.js"
|
||||
],
|
||||
"Reutilizar selecção cambial": [
|
||||
"assets/services-08vnaMl1.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/services-08vnaMl1.js",
|
||||
"status": 200,
|
||||
"sha256": "6cc2b1bfb11744376ae71d1f0429ee776ef6f004edca72a4f22c5a9ef4937688"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-BGxws1O_.js",
|
||||
"status": 200,
|
||||
"sha256": "f2dc461eca8219602099ac2cf17f52f5adedc4553f4b0e48bbeba273041d9bca"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-document-BYlep2jg.js",
|
||||
"status": 200,
|
||||
"sha256": "0ece3300111d8e5c0e094c2c1688604349de11cde057583bd83d8ae3742c8a99"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-DoIk7pr3.js",
|
||||
"existing_fiscal_availability": {
|
||||
"data": {
|
||||
"enabled": true,
|
||||
"coverage_start": "2026-01-01",
|
||||
"coverage_end": "2026-12-31",
|
||||
"message": "IVA geral sobre base líquida disponível; enquadramento declarado."
|
||||
}
|
||||
},
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "557714bb3af75080e443ae67b11a66d9feb49d9a4b269065769b128a6d712837"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-period-fx.tsx",
|
||||
"sha256_LF": "4b5f718b5ef415ecf5f96dabb0e3806254558c20905de6478e10dacf67569c49"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256_LF": "3768c316d5887d337eb3647671863c9464f961d1df4703403e7d57e5641273ed"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256_LF": "a9b3ced852e37e3e087ce5dab1add4ec0737145ce19f61857a54d5d3d24a6f8c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "22019d678f6eb16fead2207dc3d3fa9fd63413c6254633c1ffd4f1c0320344ac"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256_LF": "471457692a2a2f70a1bd1c7abb38d3ce42f07b62a63e5a4ab985ad1bbd068b46"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-depreciation.ts",
|
||||
"sha256_LF": "1dad3053157aeac44f6d3bd58885cfc47a73c19d2808284c16931679dfe4291b"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-period-fx.ts",
|
||||
"sha256_LF": "a2e7b066623eae17f0d8185d065d0adf5d3a485f780f8b09118a664dc4ba0531"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "e4de2fe0421e489bf555885b9cbb459c00ee77803ea9b6e5af45179bd6bb4f21"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-depreciation.tsx",
|
||||
"sha256": "1f9918bfb435bb5b7c0ddd2fafd7bace2a02514c6ece04b93f15975e494a5f53"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256": "909e129a0245e6bf098317485b886a2d19e02c64bbfd9c6f718e98ec6b935b8d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256": "edfb6fd338411fa8f87a6bdf9a9d4fd5c6dc2fad9d2eb3d32f2640e2951cbbe9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"pipeline_checks": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 31.08s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 973",
|
||||
"# pass 973",
|
||||
"# fail 0"
|
||||
],
|
||||
"accepted_QA_proofs": {
|
||||
"frontend_tests": 13,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 58,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "generated by guarded existing procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component;dates/FX edit+confirmation;originals/assumptions;save/recovery/export;missingdata",
|
||||
"accepted_proofs": "reused"
|
||||
},
|
||||
"accepted_proofs_reused": true,
|
||||
"manually_repeated_accepted_suites": false,
|
||||
"sequence": {
|
||||
"short_period": "3130→3130→colecta1001.60MZN",
|
||||
"USD_simulation64": "200320→200320→colecta64102.40MZN;synthetic QA assumption,not real bulletin or fiscal annual confirmation",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"remaining_L6": "Representation/fiscal precision and remaining M20/M22 fields nextQA;partial dates/loss period sequence/short annualcaps/remaining depreciation and costs/annualFX and foreignbalances;conditions preserved in same matrix.",
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"proof_files": {
|
||||
"backup.txt": "b1b580ee73bdf6f2a2d3daaecf1b983e2084fea0a5e69e7fa3486d938cf7a87f",
|
||||
"compact-dependencies.txt": "18375c30afc5fac24e8111779d455808fa363e02c5e38c8a92af6268dcbae7b4",
|
||||
"installed-protected.txt": "39cd2444e61f5aca2ce41f2eba245defa246aacb908e066d43019e44c2e07e4e",
|
||||
"installed-public-delta.json": "f35d40c06ff3a428c37e88b63dfa09ab745376c4c15747176382e9b364f80d5b",
|
||||
"installed-public.txt": "7cd1a559a1c7d327a2d71846abdbe33cda63fdb99c0fdcf1584a75a5ff7c138a",
|
||||
"integration.txt": "2526b168e5c6ef2515a9351dcdd56f1bbe9a119c073522376715cc815f7e673b",
|
||||
"manifest-served.json": "f6121cade74d12c6de25630b23a1bd73f244a089c2649bf2c3aa76c68491431c",
|
||||
"operational-delta.txt": "cadac629ef03871c14e3dd7186ce95379c526927bfefcae4466d6cb88897c1a4",
|
||||
"preflight.txt": "dbdc76e4c45a45c127ce733def4260601074cee2bcf4cd6182dae06b3e7652a8",
|
||||
"preparation.json": "dd755c3cad122e3730f57f8a94ee82dda74bfe49925cea95a518199437706e1a",
|
||||
"progress.txt": "8ea7368149372f43ee10075198a3cc840394f866158a242353bdd7a3fd8e27a2",
|
||||
"restore.txt": "5a7358ce267845262582c50261f85ab5d035bc16dc9573dd0554083f4457b324",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-final.txt": "3b882f9da83f52e66876e3a2456d50e0454d44668e168e9967c290411af9b0e1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,869 @@
|
||||
{
|
||||
"status": "short_period_and_foreign_currency_plan_QA_prepared_not_installed",
|
||||
"installed_baseline": "e9fe102259c183a9d9bf7e39f246a8c3860839c6",
|
||||
"branch": "codex/irpc-l6-periods-fx-qa-20261026",
|
||||
"version": "IRPC-normal-adjustments/8",
|
||||
"cases_recovered": {
|
||||
"short": {
|
||||
"accountingProfit": {
|
||||
"numerator": "3120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableProfit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"period": {
|
||||
"version": 1,
|
||||
"kind": "start",
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"planStart": "2026-01-01",
|
||||
"reference": "QA início documentado1Julho;correspondência completa dos meses7–12 ao período do sujeito",
|
||||
"conversionReference": "",
|
||||
"mznMapsReference": "QA activo/quotas/juros e demais mapas reconciliados explicitamente emMZN no período",
|
||||
"months": []
|
||||
},
|
||||
"pending": []
|
||||
},
|
||||
"fx": {
|
||||
"accountingProfit": {
|
||||
"numerator": "199680",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableProfit": {
|
||||
"numerator": "200320",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "200320",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "320512",
|
||||
"denominator": "5"
|
||||
},
|
||||
"period": {
|
||||
"version": 1,
|
||||
"kind": "start",
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"planStart": "2026-01-01",
|
||||
"reference": "QA início documentado1Julho;correspondência completa dos meses7–12 ao período do sujeito",
|
||||
"conversionReference": "QA pressuposto de simulação64MZN/USD aplicado aos meses seleccionados;sem regra fiscal anual confirmada",
|
||||
"mznMapsReference": "QA activo/quotas/juros e demais mapas reconciliados explicitamente emMZN no período",
|
||||
"months": [
|
||||
{
|
||||
"period": 7,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 8,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 9,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 10,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 11,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 12,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.920Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"pending": []
|
||||
},
|
||||
"missing": {
|
||||
"accountingProfit": null,
|
||||
"taxableProfit": null,
|
||||
"taxableBase": null,
|
||||
"colecta": null,
|
||||
"period": {
|
||||
"version": 1,
|
||||
"kind": "start",
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"planStart": "2026-01-01",
|
||||
"reference": "QA início documentado1Julho;correspondência completa dos meses7–12 ao período do sujeito",
|
||||
"conversionReference": "QA pressuposto de simulação64MZN/USD aplicado aos meses seleccionados;sem regra fiscal anual confirmada",
|
||||
"mznMapsReference": "QA activo/quotas/juros e demais mapas reconciliados explicitamente emMZN no período",
|
||||
"months": [
|
||||
{
|
||||
"period": 7,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 8,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 9,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 10,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"period": 11,
|
||||
"currency": "USD",
|
||||
"fxSelection": {
|
||||
"nature": "commercial",
|
||||
"submissionDate": "2026-10-26",
|
||||
"bulletinDate": "2026-10-26",
|
||||
"bulletinRef": "QA pressuposto sintético64; não boletim real",
|
||||
"source": "https://www.bancomoc.mz/",
|
||||
"sourceCurrency": "USD",
|
||||
"direction": "mzn_per_unit",
|
||||
"bulletinPerspective": "",
|
||||
"relation": "",
|
||||
"buy": "",
|
||||
"sell": "",
|
||||
"mean": "64",
|
||||
"mode": "general",
|
||||
"exceptionRef": "",
|
||||
"exceptionScope": "",
|
||||
"exceptionDate": "",
|
||||
"exceptionRate": "",
|
||||
"applied": {
|
||||
"column": "mean",
|
||||
"rate": "64",
|
||||
"date": "2026-10-26",
|
||||
"source": "QA pressuposto sintético64; não boletim real;https://www.bancomoc.mz/;perspectiva:média de referênciaBM;natureza:commercial;relação:não aplicável à média;Orientação operacional expressa da Tempo,25/10/2026:compra de moeda→taxa de compra;venda→taxa de venda;operações comerciais→taxa média de referência do Banco de Moçambique na data de submissão indicada. Interpretar compra/venda pela perspectiva do boletim. Excepções fiscais específicas conservam disposição,data,taxa e âmbito;sem recálculo automático dos históricos.",
|
||||
"selectedAt": "2026-10-26T07:51:24.924Z",
|
||||
"selectionKey": "{\"nature\":\"commercial\",\"submissionDate\":\"2026-10-26\",\"bulletinDate\":\"2026-10-26\",\"bulletinRef\":\"QA pressuposto sintético64; não boletim real\",\"source\":\"https://www.bancomoc.mz/\",\"sourceCurrency\":\"USD\",\"direction\":\"mzn_per_unit\",\"bulletinPerspective\":\"\",\"relation\":\"\",\"buy\":\"\",\"sell\":\"\",\"mean\":\"64\",\"mode\":\"general\",\"exceptionRef\":\"\",\"exceptionScope\":\"\",\"exceptionDate\":\"\",\"exceptionRate\":\"\"}"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"pending": [
|
||||
"revenue/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"cost_of_sales/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"operating_expenses/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"personnel/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"depreciation/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.",
|
||||
"interest_expense/mês12: Error: Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito."
|
||||
]
|
||||
},
|
||||
"loss": {
|
||||
"accountingProfit": {
|
||||
"numerator": "3120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableProfit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": null,
|
||||
"colecta": null,
|
||||
"period": {
|
||||
"version": 1,
|
||||
"kind": "start",
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"planStart": "2026-01-01",
|
||||
"reference": "QA início documentado1Julho;correspondência completa dos meses7–12 ao período do sujeito",
|
||||
"conversionReference": "",
|
||||
"mznMapsReference": "QA activo/quotas/juros e demais mapas reconciliados explicitamente emMZN no período",
|
||||
"months": []
|
||||
},
|
||||
"pending": []
|
||||
}
|
||||
},
|
||||
"verification": {
|
||||
"frontend_tests": 13,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 58,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "generated by guarded existing procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component;dates/FX edit+confirmation;originals/assumptions;save/recovery/export;missingdata",
|
||||
"accepted_proofs": "reused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "557714bb3af75080e443ae67b11a66d9feb49d9a4b269065769b128a6d712837"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-period-fx.tsx",
|
||||
"sha256_LF": "4b5f718b5ef415ecf5f96dabb0e3806254558c20905de6478e10dacf67569c49"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256_LF": "3768c316d5887d337eb3647671863c9464f961d1df4703403e7d57e5641273ed"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256_LF": "a9b3ced852e37e3e087ce5dab1add4ec0737145ce19f61857a54d5d3d24a6f8c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "22019d678f6eb16fead2207dc3d3fa9fd63413c6254633c1ffd4f1c0320344ac"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256_LF": "471457692a2a2f70a1bd1c7abb38d3ce42f07b62a63e5a4ab985ad1bbd068b46"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-depreciation.ts",
|
||||
"sha256_LF": "1dad3053157aeac44f6d3bd58885cfc47a73c19d2808284c16931679dfe4291b"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-period-fx.ts",
|
||||
"sha256_LF": "a2e7b066623eae17f0d8185d065d0adf5d3a485f780f8b09118a664dc4ba0531"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "e4de2fe0421e489bf555885b9cbb459c00ee77803ea9b6e5af45179bd6bb4f21"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-depreciation.tsx",
|
||||
"sha256_LF": "1f9918bfb435bb5b7c0ddd2fafd7bace2a02514c6ece04b93f15975e494a5f53"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256_LF": "909e129a0245e6bf098317485b886a2d19e02c64bbfd9c6f718e98ec6b935b8d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256_LF": "edfb6fd338411fa8f87a6bdf9a9d4fd5c6dc2fad9d2eb3d32f2640e2951cbbe9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256_LF": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256_LF": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256_LF": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256_LF": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256_LF": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256_LF": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256_LF": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256_LF": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256_LF": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256_LF": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256_LF": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256_LF": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256_LF": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256_LF": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256_LF": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256_LF": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256_LF": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256_LF": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256_LF": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256_LF": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256_LF": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256_LF": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256_LF": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256_LF": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256_LF": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256_LF": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256_LF": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256_LF": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256_LF": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256_LF": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256_LF": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256_LF": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256_LF": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256_LF": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256_LF": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256_LF": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256_LF": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256_LF": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256_LF": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256_LF": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals_preserved": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"source_evidence": {
|
||||
"CIRPC": "Lei34/2007 PDF4 art7(4)/(7),PDF12 art41(5);original preserved",
|
||||
"decree72_reused_sha256": "922ef67cb0c1111405c3c0a092d8c302a74fba8a34d627b6e9e13223612e0659",
|
||||
"visual_pages": [
|
||||
"cirpc-page4.png",
|
||||
"cirpc-page12.png",
|
||||
"decreto72-page3.png"
|
||||
]
|
||||
},
|
||||
"installed7_fixture_sha256": "d58beac3cf7db665a632f516a736f754a5874f82585291dfbc5fa6bcda654d0d",
|
||||
"history_versions1_to7": "unchanged;optional8;source plan not rewritten",
|
||||
"FX_engine": "Existing selectFx/convertIrpcAmount/convertCents/direction/evidence/link unchanged;monthly assumptions explicit;no fiscal annual rule asserted",
|
||||
"FX_rate64": "synthetic QA assumption,not real BM bulletin",
|
||||
"schema_API_config_permissions_dependencies_changed": false,
|
||||
"active_data_changed": false,
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"remaining_reference": "Same matrix section26/10 períodos curtos e planos noutra moeda;concrete conditions per case",
|
||||
"proof_sha256": {
|
||||
"api.txt": "e2c50de5a45a76cdd596d4093974b88c449d23ba8011edf5f8a6325d2cf01d07",
|
||||
"build-exit.txt": "13bf7b3039c63bf5a50491fa3cfd8eb4e699d1ba1436315aef9cbe5711530354",
|
||||
"build.txt": "9b167ca7bcd724a65f6a4030a46ce9e81accaad5a2e80160b623ca3807400bc7",
|
||||
"cirpc-page12.png": "12bb97ef4964b69816c30894bca201cedf2dcbadb29b3be9e867f2325e575abd",
|
||||
"cirpc-page4.png": "3f6fdfd75d4fef4d07f461969675118f5f000c33ab593fcb6e0ee0fc93f56737",
|
||||
"cirpc.txt": "c3ba3b845fcb12c25bc28b08485f3e5d70034895ece4ff60cf640fd0be796f9a",
|
||||
"decreto-72-2013.pdf": "922ef67cb0c1111405c3c0a092d8c302a74fba8a34d627b6e9e13223612e0659",
|
||||
"decreto72-page3.png": "4a150dd00dc7c7d4602c231bb42ebea5d7505917f1e21781c2d967cf5da8e327",
|
||||
"dossier-fx.json": "5d1e429a48e8fd6c53a9116b3176641146e2aa6b68c888558ac6c4ff0950138c",
|
||||
"dossier-loss.json": "862ee41f5b38546255335ab569039e52388d64f7bf30f38c3033f6f583e04d7c",
|
||||
"dossier-missing.json": "514c2386e8e1cd687545c880fd5e66a0099c851433c0c8f337439a69e56db5b1",
|
||||
"dossier-short.json": "cdab2ed8019f46f132f600c6b301d99ad44e8027926117abf3e57eb6c6000071",
|
||||
"dossier.mjs": "cd967cfdba196bf0b7c691fe418f38dd39232030c6e601c22f8e25bd27e93d46",
|
||||
"download.html": "95f59ff469af21bc2a41225358769bf99f25cf056479ff9a9c3d1dad4cb5f521",
|
||||
"frontend.txt": "d9c7e51b63e020bf35d2a4a3aa22f29ca71d003e4bcf22b111e90173e442745b",
|
||||
"fx.html": "5bae85164ca7cec78d76fc4c72c3c33cdaca70c63c42929c8e037ab7e91ba93f",
|
||||
"fx.json": "e92ed4b718eef390aef573728a459679fdd3130bdf923db4cfd8f7a560958fbf",
|
||||
"index.html": "09941968500d2910121bdcb0029e326fc6d44bb025b01766654289a28caa62fa",
|
||||
"loss.html": "b672fd43361efcc81c4da4f83b7eba12dd9bd7799de0b463f248928065a4de97",
|
||||
"loss.json": "07e56fb88034d377ca9bc2b098b9a4a266058a46aeb7b127a99b3c539bceec1b",
|
||||
"missing.html": "ed41bf1b5ffab532a59b8e07d8a3700bd62576bc15c9256750c84a371a2cbc8a",
|
||||
"missing.json": "5022f8eddd7f09b9a10a837f0e407e7db3619e27302e19f367923a956ebe47a6",
|
||||
"qa.tsx": "c7c06f793e4a5aa3df70f36ec6681a6399b6016f27168d18917be2f22dffdbaf",
|
||||
"recovered-fx.html": "5bae85164ca7cec78d76fc4c72c3c33cdaca70c63c42929c8e037ab7e91ba93f",
|
||||
"recovered-fx.json": "2c7d1e8858af254930bff8a420f3369475ebd335ca4251b4ddc691558ed1c9aa",
|
||||
"recovered-loss.html": "b672fd43361efcc81c4da4f83b7eba12dd9bd7799de0b463f248928065a4de97",
|
||||
"recovered-loss.json": "2618a36d92005ebf791c938687662789086d351606f95f62f4eb1133f4b029e2",
|
||||
"recovered-missing.html": "ed41bf1b5ffab532a59b8e07d8a3700bd62576bc15c9256750c84a371a2cbc8a",
|
||||
"recovered-missing.json": "094b1ee4822bdcee6ac8ce5dc9ea5cfc178bf555b15f31a6cd2a1c6becd759ae",
|
||||
"recovered-short.html": "955f182b29c160774bacc8997477c2da44cd1fcc401d1ed1955fa62f9f94d743",
|
||||
"recovered-short.json": "e4399308561d5f412c9bb803c83fd6e045d89d24986a4d6a8279c2977044bb96",
|
||||
"short.html": "955f182b29c160774bacc8997477c2da44cd1fcc401d1ed1955fa62f9f94d743",
|
||||
"short.json": "a6b0e4ea322353f84c0ba6ff09d6cf89ee270dbefb850f225c4f8fe4485f68fb",
|
||||
"types.txt": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"ui-fx.png": "deaede13c0c4eb6cc74ce0a55fc9b7bc2948f52fe7863ffc53ab83ca42456587",
|
||||
"ui-proof.json": "56b6005ea84dfd370ac55167a5f47d19bffcee8408982c2046cb1ad27ecc9f20",
|
||||
"ui-short.png": "b716d583fc3ca286c2e19cbeefca018ec08e8b75e0e95499ff7d27ab06a843d6",
|
||||
"ui.cjs": "1f5506f7865cdbfcfa8aea853be241bab849807e6d641f3c5596534727cb5938",
|
||||
"ui.txt": "85e77d9f361edf72d68990272040cc9b6edab3cc0873f921b1d5e561dc0553af",
|
||||
"vite.config.ts": "0351ec239d5a6ba429ee17b9aa68757e31f59902f8f88a522afdd56bd3b44879"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,687 @@
|
||||
{
|
||||
"status": "installed_L6_compatible_sets",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"release": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/2f684e59846187f3fb8a338d9d6f6a08cadb4d0d-b46cd351",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_baseline": "2f684e59846187f3fb8a338d9d6f6a08cadb4d0d",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l6-sets-delivery-20261025/backup",
|
||||
"created_at": "2026-10-25T20:34:03Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "c30f1bb3558988a3e761d04465d0ed594280f10e36b866101b790cdeae60eacd",
|
||||
"files_sha256": "e2a26a462dc115233aa8d1dd12aacc1511db0035de475f703074f28dc7da948a",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l5_restore_20261025",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "c30f1bb3558988a3e761d04465d0ed594280f10e36b866101b790cdeae60eacd",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/2f684e59846187f3fb8a338d9d6f6a08cadb4d0d-b46cd351",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"release": "/var/www/investmoz-homologacao/releases/a2de725901c308fb2ac2bc3d72181ab50ef46b7a-145e8f25",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/2f684e59846187f3fb8a338d9d6f6a08cadb4d0d-b46cd351",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 8,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 38,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "edf84d90ae30f0a6a080a6c4929a4601"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "5226f818ead8e964983de752574a1647"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 31,
|
||||
"checksum": "4bf9b80b2351e8896afacca734410295"
|
||||
},
|
||||
"after": {
|
||||
"rows": 34,
|
||||
"checksum": "79156a787aed15907ef066919ae90801"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart value/expiry and request-throttle counter/timer pair;no deleted cache rows",
|
||||
"sessions": "anonymous sessions created by exact delivery verification user-agent",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dbb99b7e17f5b4b9bb7a8bdf9350d9b2ae368aaa4bc44593a2522d87617d8461",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "c1c7bc86ef3255c103a0be6aeb651b824eb07259e993cc5daf3665c1a6afff2d",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 31,
|
||||
"after_rows": 34,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "8692330c25efe0f42e8cb66da1379be3235a7e91d340a89d49ace9679b19050d",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "5b2c1cf1904c5f25c8058da6406ffb0fcc80f0976903d312f0a1c76206073c73",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "cb0d56ccd4c384f2996530ddd041efda5890973ea90b6946fc383e2a72fcc4cd",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public_verification": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "a2de725901c308fb2ac2bc3d72181ab50ef46b7a",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-25T20:38:12.482895+00:00",
|
||||
"manifest_sha256": "a450ea3ad0d3d13aa3942c90475c6a97eb081079e4de91d1a46cfee8cf28fa32"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"Iniciar mapas complementares L6": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Acrescentar regra complementar": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Juros financeiros ordinários — artigo22c": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Amortizações fiscais — quotas constantes anuais": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Período anual e correspondência dos meses": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"M20 — correspondência": [
|
||||
"assets/project-dossier-CDrS2OdS.js"
|
||||
],
|
||||
"Saldo final — âmbito L8": [
|
||||
"assets/project-dossier-CDrS2OdS.js"
|
||||
],
|
||||
"Calcular e guardar apuramento trimestral ISPC": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Calcular e guardar restituição E": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
],
|
||||
"Reutilizar selecção cambial": [
|
||||
"assets/services-Bav6HNRP.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/project-dossier-CDrS2OdS.js",
|
||||
"status": 200,
|
||||
"sha256": "995b6b17abf7a068faaf05f2eccb3a7ef882dff5758520b029251070165e167f"
|
||||
},
|
||||
{
|
||||
"file": "assets/services-Bav6HNRP.js",
|
||||
"status": 200,
|
||||
"sha256": "9371a96868c7b2ef0af2332a3774dadb5ff45ad55ca2feb6833f9552605c2f01"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-document-B3HEGNVE.js",
|
||||
"status": 200,
|
||||
"sha256": "3331347876436578071dbb87033c060c0c8fe7eeeac9a0661240c6e6d2f87e71"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-BNz3HFDA.js",
|
||||
"existing_fiscal_availability": {
|
||||
"data": {
|
||||
"enabled": true,
|
||||
"coverage_start": "2026-01-01",
|
||||
"coverage_end": "2026-12-31",
|
||||
"message": "IVA geral sobre base líquida disponível; enquadramento declarado."
|
||||
}
|
||||
},
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "e33b3839aac53a1b7ca2a76eda0ec4c54015a6d1c75e386aaeb5d342943f5965"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256_LF": "eebd6d9e4100920a5ebf91b800537ffe301fd6a994b86a3b080d673f4a9c9a42"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256_LF": "1dc6adc0835af033ef296d12cdc1e9ef354b2f54cd36e2349b2df66e369c1ee3"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256_LF": "85fa1eb78ce2b8a144a9f0dcda93b542083a7ff119cbc43f4334c87284bfd312"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256_LF": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256_LF": "d5a2b52f7deb4cf35651188e04f103fcba950a007e3aa4de5ba7017e686614df"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256_LF": "b0045fd2c072998ebb290c2a8332c26d05a1f5f746b3beb1805508147497cac8"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "62d20bbcebb523f77fde950f623933a13f03283238665cf22fec9390f7ba9333"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"pipeline_checks": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 31.41s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 920",
|
||||
"# pass 920",
|
||||
"# fail 0"
|
||||
],
|
||||
"accepted_QA_proofs": {
|
||||
"frontend_tests": 14,
|
||||
"private_API_tests": 1,
|
||||
"private_API_assertions": 78,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions_generated": true,
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"actual_UI": "field editing;unsupported asset rate;missing interest;save/recovery;download;current loss",
|
||||
"dossier": "from API-recovered calculated/missing/loss/EP JSON"
|
||||
},
|
||||
"accepted_proofs_reused": true,
|
||||
"manually_repeated_accepted_suites": false,
|
||||
"sequence": {
|
||||
"taxable_profit": "6980MZN simulated",
|
||||
"taxable_base": "4680MZN simulated",
|
||||
"normal_colecta": "1497.60MZN simulated,32%",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"remaining_L6": [
|
||||
{
|
||||
"pending_case_or_mapping": "Custos com limites36(1)e/f/h/i/n, provisões28/29, obras plurianuais19 e componentes de exercícios anteriores18(2).",
|
||||
"resolution_condition": "Implementar a regra de cada categoria a partir do diploma aplicável: parcela contabilizada, limite/base próprios, documentação e exercício de imputação; demonstrar o efeito com sinal nos totais. Nos exercícios anteriores, distinguir o que era imprevisível/manifestamente desconhecido no encerramento.",
|
||||
"blocking_scope": "Só a categoria ou parcela ainda sem regra; os acréscimos36a/b/c/g, juros ordinários e periodização corrente/seguinte demonstrados permanecem utilizáveis. Eventual tributação autónoma pertence aL7."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Amortizações além dos itensII/3/9 e9.1: restantes tabelas, quotas inferiores, duodécimos, quotas decrescentes, bens usados/reavaliados/intangíveis e recuperação de quotas anteriormente tributadas.",
|
||||
"resolution_condition": "Corresponder categoria/tabela prevalecente, método, entrada em uso, vida útil, base depreciável e quotas contabilizadas/fiscais acumuladas; implementar o cálculo e a reconciliação que impeçam dupla dedução.",
|
||||
"blocking_scope": "Só os activos/métodos afectados. Computadores25% e servidores20% no recorte anual constante e a perda corrente já demonstrada não são reabertos."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Períodos curtos, transição/liquidação e reconciliação fiscal anual de plano noutra moeda.",
|
||||
"resolution_condition": "Ligar os meses e factos de início/cessação/transição ao período fiscal; implementar os efeitos sobre quotas e contagem das perdas. Para outra moeda, identificar os eventos/datas e a regra de conversão anual aplicável, reutilizando o motor cambial aceite.",
|
||||
"blocking_scope": "Só o período ou origem cambial sem reconciliação. Os períodos anuais emMZN e oEP com imputação documentada conservam o cálculo demonstrado."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Representação fiscal de fracções de unidade/cêntimo.",
|
||||
"resolution_condition": "Identificar a instrução de representação/arredondamento da edição/campo aplicável ou obter esclarecimento específico daAT; então implementar essa regra conservando o valor racional original. O exemplarM20A.1 pede meticais sem centavos, mas isso não determina sozinho como arredondar uma fracção.",
|
||||
"blocking_scope": "Só a transcrição do valor não exactamente representável. Os cálculos racionais e os valores exactamente representáveis permanecem disponíveis; não é necessária nova validação genérica das fontes."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "M20A.1: discriminação de vendas/serviços, fornecimentos/outros gastos, imposto sobre o rendimento e resultado líquido; M22: campo200 e detalhe dos restantes ajustamentos.",
|
||||
"resolution_condition": "Reutilizar a origem financeira, recolhendo apenas a classificação em falta e o imposto contabilizado; reconciliar resultado antes/depois de imposto e cada ajustamento com a edição aplicável. Não usar a colecta simulada como imposto contabilizado. Completar as correspondências por campo e demonstrar a recuperação/exportação.",
|
||||
"blocking_scope": "Só os campos sem correspondência. M20A.1/Q4 contas6.1.1/6.2/6.5/6.9 e M22 campos259/260,269/270,276/277/278 e300 conservam a preparação parcial demonstrada."
|
||||
},
|
||||
{
|
||||
"pending_case_or_mapping": "Transporte de resultado entre ediçõesM20/M22: XLSXM20A.1 remete para201/quadro8; PDFM22 inventariado usa200/quadro10.",
|
||||
"resolution_condition": "Identificar a edição do formulário de destino e corresponder explicitamente o resultado líquido a essa edição; registar a remissão corrigida sem substituir os exemplares ou reutilizar fórmulas antigas por aproximação.",
|
||||
"blocking_scope": "Só esse transporte entre edições; não bloqueia os cálculos independentes nem os outros campos já correspondidos."
|
||||
}
|
||||
],
|
||||
"matrix_row": "AUD-SIM-INT02",
|
||||
"L6_complete": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"documentary_divergence": "Only result transfer M20A.1 field201/Q8 versus PDFM22 field200/Q10;independent calculations and mapped fields remain available",
|
||||
"L5_ten_questions": "unchanged;only dependent cases blocked;no new research",
|
||||
"documentation_runtime_changed": false,
|
||||
"proof_files": {
|
||||
"backup.txt": "a591b64eafc2bfbf4c2581cbf7e622645434cd329ef76350cb93db7cab9a4924",
|
||||
"compact-dependencies.txt": "d1c1681ce26172f3d54d4f800f928b0bca4fee69b436ed230208f03334194283",
|
||||
"installed-protected.txt": "9fda494d5f02097704a534a9fad88246d3c2b9d1b195984b622a09fa0b18015c",
|
||||
"installed-public-delta.json": "060517951fa315913d5848da634b5dd9c9cf4ea41e02c46f6d79cb5226c5e834",
|
||||
"installed-public.txt": "b165c03e6f5745be112de5ed6e3f09de9bbdd66eee1b110ee6e0271e5a250a8d",
|
||||
"integration.txt": "1f3bb46c6b39cc527fea30b81a80d815b81e73a776a512516add1c19be01276a",
|
||||
"manifest-served.json": "a450ea3ad0d3d13aa3942c90475c6a97eb081079e4de91d1a46cfee8cf28fa32",
|
||||
"operational-delta.txt": "02c8a942e58e243cfc131e08e8237c6e0495c0151330977f6aa738f903b60cc3",
|
||||
"preflight.txt": "ffb60ef455b33ca6a2167b2c5f792fea591a6d22b37f46b7964c3fe0e20c371b",
|
||||
"preparation.json": "61facd82de423031b21808a507fb1904fb8dc5f512314a02ea3563f864285d6d",
|
||||
"progress.txt": "9347cbbd7a9373c97f6f1a53b8228ba4b7fdd6d270de35745ff7faf0861e5c7e",
|
||||
"progress2.txt": "c3360e6f080fcf40778d997b7382e29f8b5f24013e89ba34c7b5a55fa821e315",
|
||||
"remaining-section.md": "aceaf87dc9f82c0dbf6792d6d6918c188129369d29e8e9a52c729ce75534c74a",
|
||||
"restore.txt": "e5cc45d4d6fd35d0424f3febe8c74ef089e88256fa6eb49de224a8e6a167b2fe",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-final.txt": "7af3227a73d3d8eac0a8a5f116c48ca91c90d986f21ec96ecd192c7430667f9f",
|
||||
"status1.txt": "4bd015e1aacfc764253af72a1cfa8e3f3f31614a92daac2c3d94779eb51dddf8",
|
||||
"status2.txt": "52f274c01858b8570237f434ff86727720cfc7db0baf3a7d0c792abc19f853bd",
|
||||
"status3.txt": "0c71c139c20da160dd49929a237e38887481a6ce6c24ea921df78023566cc85e",
|
||||
"status4.txt": "0c71c139c20da160dd49929a237e38887481a6ce6c24ea921df78023566cc85e",
|
||||
"status5.txt": "7af3227a73d3d8eac0a8a5f116c48ca91c90d986f21ec96ecd192c7430667f9f"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,774 @@
|
||||
{
|
||||
"status": "installed_L6_exact_values_and_M20_M22_fields",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_baseline": "56475acb2f39e58cb51664913f7fb499f58eb7ab",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l6-values-forms-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T08:57:09Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "97c1594250800531776ee204043a947b2522b3b63f6eb99d0ce8a74fd5af9213",
|
||||
"files_sha256": "12fd138ae415dbf2361d94987848db49a49580ef8c75cd6f8e4f5cb19d911e6a",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l5_restore_20261025",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "97c1594250800531776ee204043a947b2522b3b63f6eb99d0ce8a74fd5af9213",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 4,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 50,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "a845f75cfcf49b86ebb8a3816f886a63"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "feb9a49bc8109928e6bfd6a7e1964d46"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 13,
|
||||
"checksum": "5e210898e0b9fdf0049492cba9fe097b"
|
||||
},
|
||||
"after": {
|
||||
"rows": 14,
|
||||
"checksum": "19b40c4ac924c81749e7170841401696"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
|
||||
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "8d6ea77eb4b34d86d207362d583cfa8bf2880b907becd9b00398964482c6b4bd",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "2f251473865d14b953236ab95b1521764754d76abd79b58ca7d38c96dfe2fab1",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 13,
|
||||
"after_rows": 16,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dd5c5235e9b48e28573884145b201d1f92cdabfea21a1602307c2569efe5d56c",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "3da37b843afdc870f2c0b1336344e97218a264ab5a7b44825a194c89a48fab32",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "f8e1fa11cf234c2c9f498402557b4c4aed3b89c83dace57af783ae840e4dc821",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public_verification": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T09:02:46.728717+00:00",
|
||||
"manifest_sha256": "e145286fdcb31ffe687568637861f7a630f9b943586d765f8d2e09957780ba14"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"IRPC-normal-adjustments/9": [
|
||||
"assets/project-dossier-BwFhiBwz.js"
|
||||
],
|
||||
"Preparar representação dos valores e campos M20/M22": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
],
|
||||
"Imposto contabilizado e resultado líquido": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
],
|
||||
"Parcela de taxa reduzida para a colecta total302": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
],
|
||||
"Saldo final — âmbito L8": [
|
||||
"assets/project-dossier-BwFhiBwz.js"
|
||||
],
|
||||
"Pressuposto documentado da conversão mensal para simulação": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
],
|
||||
"Reutilizar selecção cambial": [
|
||||
"assets/services-DF985_Sf.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/services-DF985_Sf.js",
|
||||
"status": 200,
|
||||
"sha256": "0b96484962fa553514d85d8a13319a46b0aa6ca7e53135100cc2955ec559a713"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-BwFhiBwz.js",
|
||||
"status": 200,
|
||||
"sha256": "0aa305851e99b8825bca18b21d69cf58d335f7499f09c1e4508084653325e88b"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-document-HOU8u9Tk.js",
|
||||
"status": 200,
|
||||
"sha256": "03219fd42f932e0f8cc39e2be721a3a2b7cbb519d7d5378e8fb18567951b686d"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-C9PCQDSl.js",
|
||||
"existing_fiscal_availability": {
|
||||
"data": {
|
||||
"enabled": true,
|
||||
"coverage_start": "2026-01-01",
|
||||
"coverage_end": "2026-12-31",
|
||||
"message": "IVA geral sobre base líquida disponível; enquadramento declarado."
|
||||
}
|
||||
},
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-form-preparation.tsx",
|
||||
"sha256_LF": "9080304461bc55e3add4cfc68d756ab969b0648e6419cfb5f7175eea6861a4ff"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-normal.tsx",
|
||||
"sha256_LF": "87178faabee3a6092ff14f74fb120841ca6d88ccc611006e549f49115596ca1f"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-form-preparation.ts",
|
||||
"sha256_LF": "61db2e8f6303f82194ff45782e8baf405bded489645cf1b90eae4945a454d649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "aa3e7305edd0957f52163ecd0f67f3d513c65d3f3c5d64fc1af1ff843bc9d729"
|
||||
}
|
||||
],
|
||||
"protected_runtime": [
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-period-fx.tsx",
|
||||
"sha256": "4b5f718b5ef415ecf5f96dabb0e3806254558c20905de6478e10dacf67569c49"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-schedules.tsx",
|
||||
"sha256": "3768c316d5887d337eb3647671863c9464f961d1df4703403e7d57e5641273ed"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-assessment.ts",
|
||||
"sha256": "a9b3ced852e37e3e087ce5dab1add4ec0737145ce19f61857a54d5d3d24a6f8c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-base.ts",
|
||||
"sha256": "22019d678f6eb16fead2207dc3d3fa9fd63413c6254633c1ffd4f1c0320344ac"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-costs.ts",
|
||||
"sha256": "471457692a2a2f70a1bd1c7abb38d3ce42f07b62a63e5a4ab985ad1bbd068b46"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-depreciation.ts",
|
||||
"sha256": "1dad3053157aeac44f6d3bd58885cfc47a73c19d2808284c16931679dfe4291b"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-period-fx.ts",
|
||||
"sha256": "a2e7b066623eae17f0d8185d065d0adf5d3a485f780f8b09118a664dc4ba0531"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-depreciation.tsx",
|
||||
"sha256": "1f9918bfb435bb5b7c0ddd2fafd7bace2a02514c6ece04b93f15975e494a5f53"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-profit.ts",
|
||||
"sha256": "909e129a0245e6bf098317485b886a2d19e02c64bbfd9c6f718e98ec6b935b8d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-schedules.ts",
|
||||
"sha256": "edfb6fd338411fa8f87a6bdf9a9d4fd5c6dc2fad9d2eb3d32f2640e2951cbbe9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-costs.tsx",
|
||||
"sha256": "c4156916835daf0f33addf89dfedd40c31b8dc3297112cd98beac33422af274d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal-forms.ts",
|
||||
"sha256": "4e986addb9f2d74e7a80345f8f1e4d8e0b2f562c867fa6eee84880d9f72a3649"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-taxable-base.tsx",
|
||||
"sha256": "e4fe9f66d35d24aa68fd87de6a5a6a0e901706b270c18962fd0c7ab00f9abd93"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-assessment.tsx",
|
||||
"sha256": "7174cc0160005a0c332ea40f02ba8a6d57985081b5ab45177ccd6e721bceea54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/acquisition-beverage-restitution.tsx",
|
||||
"sha256": "6f44897b8b12569314551df0022c26da57a165634087942a724293e66837558d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-calculation-gaps.tsx",
|
||||
"sha256": "1dab6ceb73756d4e023096b3b2ba767aaa843ff6cc69046ea630ab449a00b0dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/fiscal-l3-preparation.tsx",
|
||||
"sha256": "e84a7b1ccadaa1b5bd78d778a3287f96ccaf530855eef404786cd7aa3d321b73"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-acquisitions.tsx",
|
||||
"sha256": "c206d4cfe575d6ba007aa2b425b5f898efa97e4162b8710e358b6ecfd9458542"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-operations.tsx",
|
||||
"sha256": "a7e55972fa790063dcf11945055de2af46a77db9e509900af22ede7ec47bb4cf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisition-bc.ts",
|
||||
"sha256": "b0ef55e0917bdb79f14b53ba9e95d73c08153befeb7d4ce73f81e6fb13992225"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-allocation.ts",
|
||||
"sha256": "32968d198c7fe0c53ca89641c22d5749be6636be2c79127b867e4e3afd0dd40d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-beverage-restitution.ts",
|
||||
"sha256": "5c650cbd9469d5f99001f56fc4ff99ac973eb368036d4e96c6d171f1b220bd9e"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-calculation-gaps.ts",
|
||||
"sha256": "2e7d84a0c196bd5b56fd67cc1a389d43d5041894184e675680a4de3cd10b31a2"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-operations.ts",
|
||||
"sha256": "ec37b949f1233c5f5c14a87450c421ed29fabf1ed5b73fb32564564a2bc31f54"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/l3-form-preparation.ts",
|
||||
"sha256": "fc47f5fa5ec1420fbd847d0d081f00d99ebbb524164eef785b20877e0562f704"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-residuals.ts",
|
||||
"sha256": "40d5751c06c7c155ab4b7a17ee2d1653da2fbbf075807fbb8561cdbe19820955"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-residuals.tsx",
|
||||
"sha256": "a9219d6f41ccbd0ce45659d4f6aa0fa1c169a685840f5cb1e18daeca377d5e18"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-eligibility.ts",
|
||||
"sha256": "44675c5efacdc1ae19505667611ba3b522d3043cebacc8754597c3a68ca89d25"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-quarter.tsx",
|
||||
"sha256": "2c2555309b32d4261f14e7164f39314c9188129c2990357fc54090a2468dd2b4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-withholding.tsx",
|
||||
"sha256": "e0445d015b72859e48726959aa52686f79b1cf5c2ade29751efa83257068b878"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-quarter.ts",
|
||||
"sha256": "f66bd52e9cdfe1ddaa6b00a931465862b3d890b9be216b7a056740f027f24129"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/ispc-withholding.ts",
|
||||
"sha256": "6c31b240299edd3262efa28f7f3d5aee21123f94e30ef4ab90e26c35777cb6e4"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-ispc-eligibility.tsx",
|
||||
"sha256": "f48dd4a8f87a994eda0447f81a463589905e5873b2e1044debac9d10825a880c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-acquisitions.ts",
|
||||
"sha256": "cce283b1d0a07fb383fcb527225f4dd5bec829010a662cbaae1d60e595221977"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-modelo-a.ts",
|
||||
"sha256": "c641619a05613c1620385baad0e9ffbf810dd970aafb30e12b3a7f9a3bf11846"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-fx-selection.ts",
|
||||
"sha256": "9aa07ad443bc777b80510a3b5bd6aff9ddb9814d2450f3c690e531e74d71d998"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-fx-selection.tsx",
|
||||
"sha256": "39bb6d87d404745b0b66349bc11626545a3672ae27321ce9b4658416592059bf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/business-financial-plan.ts",
|
||||
"sha256": "c20274722d1ffcd0360f041a6cacb5d868fe0621cb27a1aca6e06826612c3ebb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/iva-currency-events.ts",
|
||||
"sha256": "cc9f2045d302d7987310da4006cc250fc5c99a27397918d166d649bfc32fab08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-fx.ts",
|
||||
"sha256": "5c4a7a477429f8d775acf6db3e117008468f5554e5731dec81f60fbb75e948fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-withholdings.ts",
|
||||
"sha256": "8e5f3c035ce5e4d6c3fc82f933439ab580fa5519492f9c4d32cfb71b77b54803"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-withholdings.tsx",
|
||||
"sha256": "751af4fab346659bc5ccb08b8a2169769af7521ea0035050af32b41ea7f5aa76"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-interest.ts",
|
||||
"sha256": "f8e6390b3b2c58c296f7e3fd14576e06ae248bc0cabce1a666b7094611f2a7dd"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta.ts",
|
||||
"sha256": "76dcce8954f68b081d500be61de9c5b146a452a3eb578a0b78776ba9e1f8051c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-mrfta-cases.ts",
|
||||
"sha256": "4266746076ab3f70312fd042351e24dd2f136c4f3e8a277b57dd97849a9f1862"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-mrfta.tsx",
|
||||
"sha256": "913d1bb4ac0fc59763cf5d27bc637f6a713b2050c4463748db554af4be451538"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/financial-fiscal-bridge.ts",
|
||||
"sha256": "5a30c501653b16b5fedcb12631ce81fcce4fe473aa542e94374986b3c50f2d33"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"sha256": "85b024a7f45ceb52efd6ff1f21d0eab1fd8fcf1ab59e4b5302c08685235c472a"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier.ts",
|
||||
"sha256": "a0909bbfcdf7e8542b010faa104fcb918e86ae38ddf096082d4d5be98d31b2b9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/project-dossier-report.ts",
|
||||
"sha256": "5207a2ffeb208cd5ace6713038cee85208020ee618194dca7114e94fc3200b6c"
|
||||
}
|
||||
],
|
||||
"originals": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf",
|
||||
"sha256": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf",
|
||||
"sha256": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf",
|
||||
"sha256": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf",
|
||||
"sha256": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"sha256": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf",
|
||||
"sha256": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf",
|
||||
"sha256": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf",
|
||||
"sha256": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf",
|
||||
"sha256": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf",
|
||||
"sha256": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf",
|
||||
"sha256": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf",
|
||||
"sha256": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf",
|
||||
"sha256": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf",
|
||||
"sha256": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf",
|
||||
"sha256": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf",
|
||||
"sha256": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf",
|
||||
"sha256": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf",
|
||||
"sha256": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf",
|
||||
"sha256": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf",
|
||||
"sha256": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf",
|
||||
"sha256": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf",
|
||||
"sha256": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf",
|
||||
"sha256": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf",
|
||||
"sha256": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf",
|
||||
"sha256": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"sha256": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf",
|
||||
"sha256": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
}
|
||||
],
|
||||
"pipeline_checks": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 31.73s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 988",
|
||||
"# pass 988",
|
||||
"# fail 0"
|
||||
],
|
||||
"accepted_QA_proofs": {
|
||||
"frontend_tests": 15,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 97,
|
||||
"database": "127.0.0.1:55441/simulator_fiscal_delta_20261021_test;DatabaseTransactions rollback",
|
||||
"routes_actions": "existing guarded procedure",
|
||||
"typescript": "passed",
|
||||
"build": "passed",
|
||||
"UI": "actual component/classification/taxstate/fractions/recover/export/independentcolecta",
|
||||
"accepted_proofs": "reused"
|
||||
},
|
||||
"accepted_proofs_reused": true,
|
||||
"manually_repeated_accepted_suites": false,
|
||||
"sequence": {
|
||||
"mapped": "net3120+depreciation10→profit/base3130→colecta1001.60MZN unchanged",
|
||||
"fraction": "M20 amount300.50=601/2 kept exact;no fiscal rounding presumed",
|
||||
"own_booktax": "net2800 known with booktax320;ownM22code pending,not213 ofothers",
|
||||
"FX_assumptions": "preserved and explicit;no fiscal annual conversion confirmation",
|
||||
"final_payable": null,
|
||||
"final_recoverable": null,
|
||||
"final_balance_scope": "L8"
|
||||
},
|
||||
"remaining_L6": {
|
||||
"installed_scope_reference": "5aaf1a56",
|
||||
"implementation_remaining": [
|
||||
{
|
||||
"case": "Amortizações e quota de aluguer36h restantes",
|
||||
"example": "Ar condicionadoII/3/3,12,5%,fora dos10códigos implementados;bem usado com vida esperada e quotas anteriores documentadas.",
|
||||
"resume": "Acrescentar catálogo e variantes previstas nas fontes aceites:usados/abertura/reparações/reavaliação,uso intensivo/concessões/peças/intangíveis,transição e excepções de método/vida útil,art17 em período curto e quota36h automática. Implementar só o caso escolhido e provar o delta;sem aguardar validação genérica daAT.",
|
||||
"affected": "Só activo,método ou quota ainda não suportados;amortizações demonstradas preservadas."
|
||||
},
|
||||
{
|
||||
"case": "Custos e periodizações específicos",
|
||||
"example": "Campanha de lançamento300 com imputação por3exercícios;obra com receita antecipada positiva em vez do zero demonstrado.",
|
||||
"resume": "Implementar36-A e articulação com36n,reforços financeiros28(3),19(5)/19(6) e18(6–10),com saldos/condições do caso. Autorização de mudança de método apenas quando a disposição aplicável a exigir. Provisões sectoriais dependem primeiro da norma específica indicada abaixo.",
|
||||
"affected": "Só campanha,obra ou periodização específica;limites/provisões ordinários e casos já demonstrados mantidos."
|
||||
},
|
||||
{
|
||||
"case": "Períodos e sequência de perdas",
|
||||
"example": "Transição de4meses seguida dos períodos posteriores:aplicar a exclusão de contagem de41(5) ao período7(4)d,sem contar apenas anos civis.",
|
||||
"resume": "Representar a sequência efectiva de períodos/perdas e acrescentar datas parciais,liquidação/períodos superiores a12meses e outros exercícios com regra/taxa aplicável. Não há nova pesquisa necessária para repetir o recorte de meses completos2026 já entregue.",
|
||||
"affected": "Só período ou utilização de perda dependente;lucro independente e semestres demonstrados preservados."
|
||||
},
|
||||
{
|
||||
"case": "Desdobramentos contabilísticos e quadros/anexos M20/M22 restantes",
|
||||
"example": "Imposto próprio200 já incluído no plano e320 exterior:discriminar as duas componentes sem duplicar gasto;contas fora das6linhas financeiras ainda não transportadas.",
|
||||
"resume": "Acrescentar o desdobramento e as correspondências dos quadros/anexos escolhidos,reutilizando dados existentes. Campos sem correspondência aguardam a referência concreta abaixo;os outros componentes podem ser implementados/provados separadamente.",
|
||||
"affected": "Só componente/conta/campo ainda não suportado;valores e campos correspondidos preservados."
|
||||
},
|
||||
{
|
||||
"case": "Saldos em moeda estrangeira",
|
||||
"example": "Crédito final100USD não é soma das receitas convertidas por mês.",
|
||||
"resume": "Implementar reconciliação de saldo e conversão pela data/regra que vier identificada,usando o motor cambial já entregue. A selecção mensal para simulação continua disponível;esta tarefa não cria outro mecanismo cambial.",
|
||||
"affected": "Só saldo/conversão fiscal dependente da regra;plano e pressupostos mensais permanecem disponíveis."
|
||||
}
|
||||
],
|
||||
"documentary_clarifications": [
|
||||
{
|
||||
"case": "Edição e campos M20/M22",
|
||||
"example": "M20A.1/D35 remete201/quadro8;PDF M22 usa200/quadro10. Imposto próprio320 não pertence ao213 de outrem;quota recuperada−26 não tem campo de dedução confirmado.",
|
||||
"resume": "Obter exemplar compatível ou instrução que identifique edição/período,campo e sentido do transporte. Para periodização/obras/reversões ainda sem campo,identificar a correspondência específica. Até informação nova,manter valores/efeitos sem código presumido e não repetir pesquisa.",
|
||||
"affected": "Só transporte,campo e somas dependentes;resultado líquido próprio,260/278/300 e demais campos conhecidos mantidos."
|
||||
},
|
||||
{
|
||||
"case": "Representação fiscal de fracções",
|
||||
"example": "M20:300,50=601/2MZN,num exemplar que pede meticais sem centavos;M22:1/300MZN não é um número exacto de cêntimos.",
|
||||
"resume": "Identificar instrução de representação/arredondamento da edição/campo ou esclarecimento específico. Conservar a fracção até lá;não deduzir regra de arredondamento apenas do rótulo «sem centavos».",
|
||||
"affected": "Só transcrição não exactamente representável;inteirosM20,cêntimos exactosM22 e cálculo racional preservados."
|
||||
},
|
||||
{
|
||||
"case": "Articulação de limites em combinações não demonstradas",
|
||||
"example": "Combustível100,comprovado80,viatura de passageiros sem excepção:36h/i com36(4). Provisão de créditos200 num período curto de3meses:limite anual por corresponder.",
|
||||
"resume": "Esclarecer especificamente a articulação h/i/36(4) e a base/limite dos períodos curtos de publicidade/créditos,se houver proporcionalização aplicável. Não somar exclusões,anualizar ou repartir por presunção. Retomar só perante referência/resposta concreta para o exemplo.",
|
||||
"affected": "Só combinação ou limite do período;casos independentes com regra já aplicada mantidos."
|
||||
},
|
||||
{
|
||||
"case": "Regra fiscal de conversão anual",
|
||||
"example": "PlanoUSD com64MZN/USD por mês é pressuposto sintético de simulação,não confirmação da data/taxa fiscal anual ou da cotação do saldo final.",
|
||||
"resume": "Identificar disposição/âmbito,data,base e taxa/boletim aplicáveis ao resultado e,quando necessário,ao saldo. Reutilizar o motor existente e demonstrar só a correspondência nova;sem taxa actual por defeito ou nova ronda da pesquisa anterior.",
|
||||
"affected": "Só confirmação fiscal anual e saldo dependente;conversões mensais documentadas de simulação mantidas com os avisos."
|
||||
},
|
||||
{
|
||||
"case": "Norma sectorial de provisões reguladas",
|
||||
"example": "Provisão200 de uma entidade financeira sujeita ao28d não herda os1,5%/6% do regime ordinário29.",
|
||||
"resume": "Identificar sector,regulador,norma de supervisão aplicável e saldos/condições necessários,antes da implementação específica. A fonte oficial fornecida é aceite;falta a regra concreta do caso,não certificação genérica da fonte.",
|
||||
"affected": "Só provisão regulada respectiva;provisões ordinárias demonstradas preservadas."
|
||||
}
|
||||
],
|
||||
"sources_reused": [
|
||||
{
|
||||
"path": "docs/investmoz/simulations/irpc-l6-costs-provisions-timing-qa-20261026.json",
|
||||
"sha256": "b12df09899cbbf53fdb066f24dbe4852400b2d4bff01627e16e64c56f9860780"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/irpc-l6-depreciation-qa-20261026.json",
|
||||
"sha256": "167267f23a59cebfa874e46bf0238675fd7f92b4ee4e4c12cd0fda6ff3a99df5"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/irpc-l6-periods-fx-qa-20261026.json",
|
||||
"sha256": "a893c0608977a4b2b2a40379b2d54534f3ae96b082c0c64e43b4e2392b9152d9"
|
||||
},
|
||||
{
|
||||
"path": "docs/investmoz/simulations/irpc-l6-values-forms-qa-20261026.json",
|
||||
"sha256": "2fcf80b2493ab8472f247091ba59a9e6f84d00bab210ab667cefcba241c29a0d"
|
||||
}
|
||||
],
|
||||
"existing_matrix_row": "AUD-SIM-INT02",
|
||||
"new_research": false,
|
||||
"new_functional_tests": false,
|
||||
"L6_integrally_complete": false,
|
||||
"operational_closure_decision_recorded": false,
|
||||
"L7_L8_own_scopes": true
|
||||
},
|
||||
"L6_complete": false,
|
||||
"operational_closure_decision_recorded": false,
|
||||
"L7_L8_own_scopes": true,
|
||||
"proof_files": {
|
||||
"backup.txt": "cf1f754f54ef98184562357b55acd12b479beea5e92b2212c75d1d03560b2274",
|
||||
"balance-section.md": "26907b1ecd068819e8fb6fd9635b103750c7459d614dce28d653d6a96018fcbb",
|
||||
"balance.json": "ea400110264925daa84380c370c4b5129de4ef7923b3d1af5433a7a7879d8e00",
|
||||
"installed-protected.txt": "e5d8530e3a6be9ed5f88a326d45b0748eca4faa1b5c64f39591930be329e41ec",
|
||||
"installed-public-delta.json": "90d2a9a7d9fffb076e2773b4174fc20ce9c577d73c8154140e2b504e683638cf",
|
||||
"installed-public.txt": "074fc7a1bc4055cd357764670c17a29f678bd1d3351da918813555d53b50a5e5",
|
||||
"integration.txt": "828ca004ab574a3a687b7dc3a3176b0b4da81797af770a5e81694f5f7cee543f",
|
||||
"manifest-served.json": "e145286fdcb31ffe687568637861f7a630f9b943586d765f8d2e09957780ba14",
|
||||
"operational-delta.txt": "15c876ffa750c6b26d7cef368d78df21c101bf82dbb08e1dc7beb533bac2022c",
|
||||
"preflight.txt": "8e90d1a978640df1dd161c54ab80c0e2b4c8046d3bd484bcc866ca40046081a5",
|
||||
"preparation.json": "7df19578178f3ad55deb2c6fe8a48cb44233e64859be2e47b51b6f8e56da55e4",
|
||||
"progress.txt": "dcc4abfd0fded4529ecf58b4a24392d3e3ae5071cad1474421ff3768da8e786d",
|
||||
"restore.txt": "48c8f2a3b060ce86164273f072978eeffb57d01aa365e4c71a34cab2c1925b44",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-final.txt": "7dedabc439b43d2938fa524a275a48b350cb948d6e4bfb1d551eac66d877fff1"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,861 @@
|
||||
{
|
||||
"status": "grouped_QA_ready_not_installed",
|
||||
"date": "2026-10-26",
|
||||
"branch": "codex/irpc-l7-cessation-prior-qa-20261026",
|
||||
"installed_baseline_reported": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"accepted_QA_included": "ba83afe7d8a90fd016fd0cf424418811279285cd",
|
||||
"runtime_commit": "992c97ad",
|
||||
"main_incorporated": "ae0d74bb3a5e0220c886dd72801a6550dd4ccbbe",
|
||||
"merge_commit": "ff84ab64",
|
||||
"main_presentation_and_V2_01_preserved": true,
|
||||
"remote_installation_or_recheck_this_pass": false,
|
||||
"version": "IRPC-normal-adjustments/13",
|
||||
"scope": "resident annual2026 or fullmonth cessation2026;new historicalcost assets entering2025/2026;constant maximum normalrate,monthlyfromstart,documented prioraccounting/fiscal/recoverable balances;no cumulation",
|
||||
"scope_choice": "2025/2026 is demonstrated implementation coverage,not a new legal date restriction",
|
||||
"optional_input": "acceleration.monthly.continuation version1/period/reference/historyReference/monthlyFromStart;exclusive of startPeriod",
|
||||
"versions10_11_12_keys_results_histories_preserved": true,
|
||||
"runtime_delta": {
|
||||
"resources/js/lib/irpc-special.ts": "5b729a8a330765a4adb5c367a25d050c1c5286249187cbeacd820b0436aa6711",
|
||||
"resources/js/lib/irpc-normal.ts": "b76ecbda7aff09a12ec9d88cd5f6bf099f4ee1ed22a0ab7fd6113422f0085ea2",
|
||||
"resources/js/components/simulation-irpc-special.tsx": "10afdc4544405dc59a58efeae190c62a90d4c75e71b53dbc0b528cbb50d30991"
|
||||
},
|
||||
"L6_depreciation_period_fx_engines_unchanged": true,
|
||||
"cases_recovered": {
|
||||
"cessation": {
|
||||
"period": {
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-06-30",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "calculated",
|
||||
"additional_deduction": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "4992",
|
||||
"denominator": "5"
|
||||
},
|
||||
"ledger": [
|
||||
{
|
||||
"prior": {
|
||||
"previousAccounting": "0",
|
||||
"previousFiscal": "0",
|
||||
"available": "0",
|
||||
"reference": "QA ausência declarada de quotas anteriores;activo entrou em2026",
|
||||
"normalUsed": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRemaining": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedUsed": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRemaining": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalFiscalRemaining": {
|
||||
"numerator": "950",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedFiscalRemaining": {
|
||||
"numerator": "940",
|
||||
"denominator": "1"
|
||||
}
|
||||
},
|
||||
"exit": {
|
||||
"state": "absent",
|
||||
"date": ""
|
||||
},
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2026-01-15",
|
||||
"months": 6,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalQuota": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedQuota": {
|
||||
"numerator": "75",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": {
|
||||
"numerator": "60",
|
||||
"denominator": "1"
|
||||
},
|
||||
"additionalDeduction": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"applied": true,
|
||||
"reason": "Activo existente elegível;taxa normal ×1,5,com limite contabilístico e saldo fiscal."
|
||||
}
|
||||
],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"prior": {
|
||||
"period": {
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-06-30",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "calculated",
|
||||
"additional_deduction": {
|
||||
"numerator": "25",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3105",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3105",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "4968",
|
||||
"denominator": "5"
|
||||
},
|
||||
"ledger": [
|
||||
{
|
||||
"prior": {
|
||||
"previousAccounting": "150",
|
||||
"previousFiscal": "100",
|
||||
"available": "50",
|
||||
"reference": "QA quotas contabilísticas150,fiscais100,parcela50 temporariamente tributada;sem encargos permanentemente excluídos",
|
||||
"normalUsed": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRemaining": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedUsed": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRemaining": {
|
||||
"numerator": "35",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalFiscalRemaining": {
|
||||
"numerator": "850",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedFiscalRemaining": {
|
||||
"numerator": "825",
|
||||
"denominator": "1"
|
||||
}
|
||||
},
|
||||
"exit": {
|
||||
"state": "absent",
|
||||
"date": ""
|
||||
},
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2025-01-01",
|
||||
"months": 6,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalQuota": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedQuota": {
|
||||
"numerator": "75",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": {
|
||||
"numerator": "75",
|
||||
"denominator": "1"
|
||||
},
|
||||
"additionalDeduction": {
|
||||
"numerator": "25",
|
||||
"denominator": "1"
|
||||
},
|
||||
"applied": true,
|
||||
"reason": "Activo existente elegível;taxa normal ×1,5,com limite contabilístico e saldo fiscal."
|
||||
}
|
||||
],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"annual": {
|
||||
"period": {
|
||||
"kind": "calendar",
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-12-31",
|
||||
"reference": "QA doze meses do plano correspondem ao ano civil completo",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "6260",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "6260",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "10016",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "calculated",
|
||||
"additional_deduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "6210",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "6210",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "9936",
|
||||
"denominator": "5"
|
||||
},
|
||||
"ledger": [
|
||||
{
|
||||
"prior": {
|
||||
"previousAccounting": "150",
|
||||
"previousFiscal": "100",
|
||||
"available": "50",
|
||||
"reference": "QA quotas contabilísticas150,fiscais100,parcela50 temporariamente tributada;sem encargos permanentemente excluídos",
|
||||
"normalUsed": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRemaining": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedUsed": {
|
||||
"numerator": "30",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRemaining": {
|
||||
"numerator": "20",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalFiscalRemaining": {
|
||||
"numerator": "800",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedFiscalRemaining": {
|
||||
"numerator": "750",
|
||||
"denominator": "1"
|
||||
}
|
||||
},
|
||||
"exit": {
|
||||
"state": "absent",
|
||||
"date": ""
|
||||
},
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2025-01-01",
|
||||
"months": 12,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalQuota": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedQuota": {
|
||||
"numerator": "150",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalDeduction": {
|
||||
"numerator": "100",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": {
|
||||
"numerator": "150",
|
||||
"denominator": "1"
|
||||
},
|
||||
"additionalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"applied": true,
|
||||
"reason": "Activo existente elegível;taxa normal ×1,5,com limite contabilístico e saldo fiscal."
|
||||
}
|
||||
],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"exit": {
|
||||
"period": {
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-06-30",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "9415",
|
||||
"denominator": "3"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "9415",
|
||||
"denominator": "3"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "15064",
|
||||
"denominator": "15"
|
||||
},
|
||||
"status": "calculated",
|
||||
"additional_deduction": {
|
||||
"numerator": "125",
|
||||
"denominator": "6"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "6235",
|
||||
"denominator": "2"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "6235",
|
||||
"denominator": "2"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "4988",
|
||||
"denominator": "5"
|
||||
},
|
||||
"ledger": [
|
||||
{
|
||||
"prior": {
|
||||
"previousAccounting": "150",
|
||||
"previousFiscal": "100",
|
||||
"available": "50",
|
||||
"reference": "QA quotas contabilísticas150,fiscais100,parcela50 temporariamente tributada;sem encargos permanentemente excluídos",
|
||||
"normalUsed": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRemaining": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedUsed": {
|
||||
"numerator": "5",
|
||||
"denominator": "2"
|
||||
},
|
||||
"acceleratedRemaining": {
|
||||
"numerator": "95",
|
||||
"denominator": "2"
|
||||
},
|
||||
"normalFiscalRemaining": {
|
||||
"numerator": "2575",
|
||||
"denominator": "3"
|
||||
},
|
||||
"acceleratedFiscalRemaining": {
|
||||
"numerator": "1675",
|
||||
"denominator": "2"
|
||||
}
|
||||
},
|
||||
"exit": {
|
||||
"state": "known",
|
||||
"date": "2026-06-20"
|
||||
},
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2025-01-01",
|
||||
"months": 5,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalQuota": {
|
||||
"numerator": "125",
|
||||
"denominator": "3"
|
||||
},
|
||||
"acceleratedQuota": {
|
||||
"numerator": "125",
|
||||
"denominator": "2"
|
||||
},
|
||||
"normalDeduction": {
|
||||
"numerator": "125",
|
||||
"denominator": "3"
|
||||
},
|
||||
"acceleratedDeduction": {
|
||||
"numerator": "125",
|
||||
"denominator": "2"
|
||||
},
|
||||
"additionalDeduction": {
|
||||
"numerator": "125",
|
||||
"denominator": "6"
|
||||
},
|
||||
"applied": true,
|
||||
"reason": "Activo existente elegível;taxa normal ×1,5,com limite contabilístico e saldo fiscal."
|
||||
}
|
||||
],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"missing": {
|
||||
"period": {
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-06-30",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "indeterminate",
|
||||
"additional_deduction": null,
|
||||
"L7_profit": null,
|
||||
"L7_base": null,
|
||||
"L7_colecta": null,
|
||||
"ledger": [
|
||||
{
|
||||
"prior": {
|
||||
"previousAccounting": "150",
|
||||
"previousFiscal": "100",
|
||||
"available": "50",
|
||||
"reference": "QA quotas contabilísticas150,fiscais100,parcela50 temporariamente tributada;sem encargos permanentemente excluídos",
|
||||
"normalUsed": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRemaining": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedUsed": null,
|
||||
"acceleratedRemaining": null,
|
||||
"normalFiscalRemaining": {
|
||||
"numerator": "850",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedFiscalRemaining": null
|
||||
},
|
||||
"exit": {
|
||||
"state": "absent",
|
||||
"date": ""
|
||||
},
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2025-01-01",
|
||||
"months": 6,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": null,
|
||||
"normalQuota": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedQuota": null,
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": null,
|
||||
"additionalDeduction": null,
|
||||
"applied": false,
|
||||
"reason": "CBF16 cessação/quotas anteriores:identifique período,suporte da vigência/condições e das quotas anteriores ou ausência;duodécimos desde a entrada emuso por documentar. Sem recalcular ou presumir saldos anteriores."
|
||||
}
|
||||
],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"negative": {
|
||||
"period": {
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-06-30",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "calculated",
|
||||
"additional_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"ledger": [
|
||||
{
|
||||
"prior": {
|
||||
"previousAccounting": "150",
|
||||
"previousFiscal": "100",
|
||||
"available": "50",
|
||||
"reference": "QA quotas contabilísticas150,fiscais100,parcela50 temporariamente tributada;sem encargos permanentemente excluídos",
|
||||
"normalUsed": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRemaining": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedUsed": null,
|
||||
"acceleratedRemaining": null,
|
||||
"normalFiscalRemaining": {
|
||||
"numerator": "850",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedFiscalRemaining": null
|
||||
},
|
||||
"exit": {
|
||||
"state": "absent",
|
||||
"date": ""
|
||||
},
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2025-01-01",
|
||||
"months": 6,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": null,
|
||||
"normalQuota": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedQuota": null,
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": null,
|
||||
"additionalDeduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"applied": false,
|
||||
"reason": "Condição negativa documentada;quota normal mantida."
|
||||
}
|
||||
],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"absent": {
|
||||
"period": {
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-06-30",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "absent",
|
||||
"additional_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"ledger": [],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"new_frontend_tests": 11,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 123,
|
||||
"API_database": "simulator_fiscal_delta_20261021_test",
|
||||
"API_host": "127.0.0.1",
|
||||
"API_port": 55441,
|
||||
"transaction_rollback": true,
|
||||
"wayfinder_with_form": true,
|
||||
"typescript_after_main": true,
|
||||
"build_after_main": true,
|
||||
"HTML_financial_dossier_from_7_API_recoveries": true,
|
||||
"UI": {
|
||||
"actualComponent": true,
|
||||
"explicitPreparationAndCancel": true,
|
||||
"missingOnlyDependentL7": true,
|
||||
"assetsAndPeriodNotEdited": true,
|
||||
"prior15RecoveredWithin75DeductionAdditional25": true,
|
||||
"prior35RemainingNotConsumed": true,
|
||||
"annual30RecoveredWithin150DeductionAdditional50": true,
|
||||
"cessationDoesNotImplyAssetExit": true,
|
||||
"documentedExit5MonthsExact125over6": true,
|
||||
"saveRecoverDownload": true,
|
||||
"negativeAbsenceDistinct": true,
|
||||
"accepted12DoesNotGainConflictingInput": true,
|
||||
"L8FinalUnknown": true,
|
||||
"errors": []
|
||||
},
|
||||
"accepted_ba83_proofs_reused_not_rerun": true
|
||||
},
|
||||
"preservation": {
|
||||
"tracked_files_compared_before_documentation": 2816,
|
||||
"unchanged": 2810,
|
||||
"changed": [
|
||||
"docs/investmoz/unification/traceability-and-manual.md",
|
||||
"docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv",
|
||||
"resources/js/components/simulation-irpc-special.tsx",
|
||||
"resources/js/lib/irpc-normal.ts",
|
||||
"resources/js/lib/irpc-special.ts",
|
||||
"resources/js/pages/portal/why-invest.tsx"
|
||||
],
|
||||
"main_changes_reconciled_separately": [
|
||||
"docs/investmoz/unification/traceability-and-manual.md",
|
||||
"docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv",
|
||||
"resources/js/pages/portal/why-invest.tsx"
|
||||
],
|
||||
"original_files": {
|
||||
"docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973",
|
||||
"docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57",
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063",
|
||||
"docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee",
|
||||
"docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5",
|
||||
"docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358",
|
||||
"docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b",
|
||||
"docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d",
|
||||
"docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899",
|
||||
"docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee",
|
||||
"docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53",
|
||||
"docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121",
|
||||
"docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
},
|
||||
"histories_plan_assets_and_declared_balances_unchanged": true,
|
||||
"official_balances_not_consumed": true,
|
||||
"active_migrations": 0,
|
||||
"active_writes": 0,
|
||||
"SGF_TEMPO_touched": false
|
||||
},
|
||||
"source_reused": {
|
||||
"decree": "Decreto72/2013",
|
||||
"articles": [
|
||||
"3(3)",
|
||||
"9(1-3)",
|
||||
"10"
|
||||
],
|
||||
"visual_reused_pages": [
|
||||
2,
|
||||
3
|
||||
],
|
||||
"local_original": "C:\\laragon\\www\\portal-investidor-irpc-l6-depreciation-qa-20261026\\outputs\\irpc-l6-depreciation\\decreto-72-2013.pdf",
|
||||
"sha256": "922ef67cb0c1111405c3c0a092d8c302a74fba8a34d627b6e9e13223612e0659",
|
||||
"CBF": "accepted APIEX compilation,articles3/9/10/16",
|
||||
"CIRPC": "accepted period7(4)",
|
||||
"inventory_files": 8143,
|
||||
"no_broad_research_repeated": true
|
||||
},
|
||||
"remaining_code": [
|
||||
"other autonomousexpense origins/parcels",
|
||||
"mixed/withheld cooperative income and other9-14entities",
|
||||
"CBF16 pre2025entries,otherperiods/partialmonths/transition,exits outside demonstratedscope,lowerquota,methods/categories/cumulation",
|
||||
"capitalgains61-A and specialoperations54-56/41-A",
|
||||
"CBF17-19 and potential15entitlement;annualuseL8",
|
||||
"sector/territorial/specificregimes",
|
||||
"official L7 M20/M22 transport"
|
||||
],
|
||||
"document_conditions": [
|
||||
"nature/parcels/period",
|
||||
"required recognition or exception",
|
||||
"reconciliation of actual prioraccounting/fiscal/temporaryrecoverable balances",
|
||||
"specific normativeperiod/cumulationorder/limits",
|
||||
"form edition/field/fraction representation"
|
||||
],
|
||||
"future_delivery_requires": [
|
||||
"current main compatibility recheck",
|
||||
"fresh space/inodes/build/backup capacity",
|
||||
"fresh backup/restore",
|
||||
"keep active until new ready"
|
||||
],
|
||||
"L6_operational_delimited": true,
|
||||
"L7_partial": true,
|
||||
"L8_final_balance_separate": true,
|
||||
"evidence_directory": "outputs/irpc-l7-cessation-prior"
|
||||
}
|
||||
@@ -0,0 +1,789 @@
|
||||
{
|
||||
"status": "L7_combinations_installed",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"release": "/var/www/investmoz-homologacao/releases/f8d57bddf96b4610604a013fcc5bdd703c7dc6d5-7a31e8ac",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_installed": "a7434cd27c09df3d8e6c586f9676b67abcde798e",
|
||||
"preserved_fiscal_delivery": "632dc069",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l7-combinations-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T14:20:47Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "2a069fcda7a89368323cda9d5339e76e545b85088de594c1e5a585891dd7b3c3",
|
||||
"files_sha256": "289ebdcb8cf1983f8fcdb237d3fb947d43fbe71a575064cede233368d43b4584",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l7_combinations_restore_20261026",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "2a069fcda7a89368323cda9d5339e76e545b85088de594c1e5a585891dd7b3c3",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"backup_restore_verified": true,
|
||||
"capacity_before_recovery": {
|
||||
"checked_at_UTC": "2026-10-26T14:16:50.285126+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "a7434cd27c09df3d8e6c586f9676b67abcde798e",
|
||||
"release": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/632dc06930d6b4f1b012feb3b4daa3b1cfc53f39-4c020686",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"release_revision": {
|
||||
"commit": "a7434cd27c09df3d8e6c586f9676b67abcde798e",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T14:07:54.031522+00:00",
|
||||
"manifest_sha256": "06af8bbd9ffabeac215cbb0357531f4e4169955461d8cfac380f3776e923e64e"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5430136832,
|
||||
"available_inodes": 21367883,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5430136832,
|
||||
"available_inodes": 21367883,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5430136832,
|
||||
"available_inodes": 21367883,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5430136832,
|
||||
"available_inodes": 21367883,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5430136832,
|
||||
"available_inodes": 21367883,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 5430136832,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175918494,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": false,
|
||||
"current_release_entry_reference": 31237,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"regenerable_Node_cache_recovery": {
|
||||
"at_UTC": "2026-10-26T14:18:26.184720+00:00",
|
||||
"target": "/tmp/node-compile-cache",
|
||||
"kind": "Node versioned compilation cache;source and node_modules retained;regenerable by Node",
|
||||
"files_removed": 6893,
|
||||
"logical_bytes": 206715844,
|
||||
"free_before": 5429366784,
|
||||
"free_after": 5652504576,
|
||||
"recovered_bytes": 223137792,
|
||||
"installed_record_unchanged": true,
|
||||
"directory_owner_permissions_preserved": true,
|
||||
"projects_releases_backups_originals_logs_untouched": true,
|
||||
"active_business_writes": 0
|
||||
},
|
||||
"capacity_before": {
|
||||
"checked_at_UTC": "2026-10-26T14:19:01.971003+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "a7434cd27c09df3d8e6c586f9676b67abcde798e",
|
||||
"release": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/632dc06930d6b4f1b012feb3b4daa3b1cfc53f39-4c020686",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"release_revision": {
|
||||
"commit": "a7434cd27c09df3d8e6c586f9676b67abcde798e",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T14:07:54.031522+00:00",
|
||||
"manifest_sha256": "06af8bbd9ffabeac215cbb0357531f4e4169955461d8cfac380f3776e923e64e"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5652262912,
|
||||
"available_inodes": 21374782,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5652262912,
|
||||
"available_inodes": 21374782,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5652262912,
|
||||
"available_inodes": 21374782,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5652262912,
|
||||
"available_inodes": 21374782,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5652242432,
|
||||
"available_inodes": 21374780,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 5652262912,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175918494,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": true,
|
||||
"current_release_entry_reference": 31237,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"capacity_after_backup": {
|
||||
"checked_at_UTC": "2026-10-26T14:22:54.407089+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "a7434cd27c09df3d8e6c586f9676b67abcde798e",
|
||||
"release": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/632dc06930d6b4f1b012feb3b4daa3b1cfc53f39-4c020686",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"release_revision": {
|
||||
"commit": "a7434cd27c09df3d8e6c586f9676b67abcde798e",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T14:07:54.031522+00:00",
|
||||
"manifest_sha256": "06af8bbd9ffabeac215cbb0357531f4e4169955461d8cfac380f3776e923e64e"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5472501760,
|
||||
"available_inodes": 21374766,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5472501760,
|
||||
"available_inodes": 21374766,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5472501760,
|
||||
"available_inodes": 21374766,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5472501760,
|
||||
"available_inodes": 21374766,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5472501760,
|
||||
"available_inodes": 21374766,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 5472501760,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175918494,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": false,
|
||||
"current_release_entry_reference": 31237,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"post_backup_existing_build_minimum_satisfied": true,
|
||||
"post_backup_next_fresh_backup_guard_not_required_for_already_completed_backup": true,
|
||||
"capacity_after_installation": {
|
||||
"checked_at_UTC": "2026-10-26T14:29:30.537317+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"release": "/var/www/investmoz-homologacao/releases/f8d57bddf96b4610604a013fcc5bdd703c7dc6d5-7a31e8ac",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/f8d57bddf96b4610604a013fcc5bdd703c7dc6d5-7a31e8ac",
|
||||
"release_revision": {
|
||||
"commit": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T14:26:51.629481+00:00",
|
||||
"manifest_sha256": "367be71b25b56a83571d610e211ea11beae2af87989d62ef6cc7b9c54eabf580"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4441751552,
|
||||
"available_inodes": 21342698,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4441751552,
|
||||
"available_inodes": 21342698,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4441751552,
|
||||
"available_inodes": 21342698,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4441747456,
|
||||
"available_inodes": 21342697,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4441747456,
|
||||
"available_inodes": 21342696,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 4441751552,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175918494,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": false,
|
||||
"current_release_entry_reference": 31259,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"next_delivery_capacity_adjustment_required": true,
|
||||
"delta": [
|
||||
{
|
||||
"path": "resources/js/lib/irpc-special.ts",
|
||||
"sha256_LF": "aea0e55b9317ca8ebb313a02e5e92c5b0bac805157d67d54f7c30c71068f46e6"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "bce82366ab4ae41fc5f889d9a68d041604e1c032823e4a9384a1227e170c649b"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-special.tsx",
|
||||
"sha256_LF": "de77c20af4f07cb2fda31b94cb2c163b627b987d816b43e196590afe59d22fb8"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-special-combinations.ts",
|
||||
"sha256_LF": "0c80d39930e2a3f598ba2fed6d7e31252bc24211b5a908778367e2451fcbc90c"
|
||||
}
|
||||
],
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"release": "/var/www/investmoz-homologacao/releases/f8d57bddf96b4610604a013fcc5bdd703c7dc6d5-7a31e8ac",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 4,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 68,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "0d909f267cc44165e41d5ac5e966448f"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "8381b51b093febcc81854e20cb22bec8"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 12,
|
||||
"checksum": "aa6448d95c23f325f4e2004fb48315ce"
|
||||
},
|
||||
"after": {
|
||||
"rows": 13,
|
||||
"checksum": "e64cf16446c054a7e852f4944574dabf"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions_after": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
|
||||
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 12,
|
||||
"after_rows": 14,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "d8e8fff391c7cb6369d141adae95227c9616f39055ffd58b5fda3f0cc6eda2a4",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "1618c52511f4c5d1fba6bbf74167ce464d7fbe7a121a937cab645415fa7f0878",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T14:26:51.629481+00:00",
|
||||
"manifest_sha256": "367be71b25b56a83571d610e211ea11beae2af87989d62ef6cc7b9c54eabf580"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"IRPC-normal-adjustments/14": [
|
||||
"assets/project-dossier-JLJx7klI.js"
|
||||
],
|
||||
"Preparar cumulações dos tratamentos L7 registados": [
|
||||
"assets/services-BKUDFoA6.js"
|
||||
],
|
||||
"Combinação incompatível": [
|
||||
"assets/project-dossier-JLJx7klI.js"
|
||||
],
|
||||
"única diferença adicional:": [
|
||||
"assets/project-dossier-JLJx7klI.js"
|
||||
],
|
||||
"IRPC-normal-adjustments/13": [
|
||||
"assets/project-dossier-JLJx7klI.js"
|
||||
],
|
||||
"Preparar CBF16 para início de actividade": [
|
||||
"assets/services-BKUDFoA6.js"
|
||||
],
|
||||
"Preparar CBF16 para cessação e quotas anteriores": [
|
||||
"assets/services-BKUDFoA6.js"
|
||||
],
|
||||
"sem consumo de saldos oficiais": [
|
||||
"assets/project-dossier-JLJx7klI.js"
|
||||
],
|
||||
"Preparar CBF16 com duodécimos": [
|
||||
"assets/services-BKUDFoA6.js"
|
||||
],
|
||||
"CBF16 — duodécimos reutilizados de L6": [
|
||||
"assets/project-dossier-JLJx7klI.js"
|
||||
],
|
||||
"Suporte dos duodécimos CBF16": [
|
||||
"assets/services-BKUDFoA6.js"
|
||||
],
|
||||
"Manter preparação anual CBF16": [
|
||||
"assets/services-BKUDFoA6.js"
|
||||
],
|
||||
"CBF16 por duodécimos — ": [
|
||||
"assets/project-dossier-JLJx7klI.js"
|
||||
],
|
||||
"diferença adicional:": [
|
||||
"assets/project-dossier-JLJx7klI.js"
|
||||
],
|
||||
"IRPC-normal-adjustments/10": [
|
||||
"assets/project-dossier-JLJx7klI.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/project-dossier-document-W46BRNSe.js",
|
||||
"status": 200,
|
||||
"sha256": "80e14fba26e9e81f840ba09eb3f9e24a70404bbe7e6933b490b3085299a6186f"
|
||||
},
|
||||
{
|
||||
"file": "assets/services-BKUDFoA6.js",
|
||||
"status": 200,
|
||||
"sha256": "0ac8c266fcecec0e564619948f4cec28cd2572975aff70acc6997971a67fcfd9"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-JLJx7klI.js",
|
||||
"status": 200,
|
||||
"sha256": "1016cb33e4476a95e1a06ce17fad4312efc93aef01994a2674e251d00c884f0b"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-zFZ4YNrB.js",
|
||||
"status": 200,
|
||||
"sha256": "338068b86cce1c3215ee71b1328a6cb2f754b903ed78ff1886f8554df506d2d6"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-BPLj40Iz.js",
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"pipeline": {
|
||||
"service": "ExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"release": "/var/www/investmoz-homologacao/releases/f8d57bddf96b4610604a013fcc5bdd703c7dc6d5-7a31e8ac",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"latest_report": {
|
||||
"status": "installed",
|
||||
"commit": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"release": "/var/www/investmoz-homologacao/releases/f8d57bddf96b4610604a013fcc5bdd703c7dc6d5-7a31e8ac",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/a7434cd27c09df3d8e6c586f9676b67abcde798e-60070b10",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0,
|
||||
"requested_commits": [
|
||||
"f8d57bddf96b4610604a013fcc5bdd703c7dc6d5"
|
||||
],
|
||||
"finished_at": "2026-10-26T14:26:54.452008+00:00"
|
||||
},
|
||||
"log_file": "1793024604346159017.log",
|
||||
"summaries": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 32.14s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 1054",
|
||||
"# pass 1054",
|
||||
"# fail 0"
|
||||
],
|
||||
"log_bytes": 299642
|
||||
},
|
||||
"accepted_QA_proofs_reused": {
|
||||
"new_frontend_tests": 12,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 133,
|
||||
"QA_database": "simulator_fiscal_delta_20261021_test",
|
||||
"QA_host": "127.0.0.1",
|
||||
"QA_port": 55441,
|
||||
"QA_transaction_rollback": true,
|
||||
"wayfinder_with_form": true,
|
||||
"typescript": true,
|
||||
"build": true,
|
||||
"recovered_HTML_and_financial_dossier": 7,
|
||||
"UI": {
|
||||
"actualComponent": true,
|
||||
"explicitPrepareCancel": true,
|
||||
"assetsPeriodsBenefitsNotEdited": true,
|
||||
"missingOnlyDependentL7": true,
|
||||
"CBF16Additional25ThenCooperative16": true,
|
||||
"prior15AlreadyIncluded": true,
|
||||
"specificGenericIncompatibilityNoAutomaticChoice": true,
|
||||
"unmappedExceptionIndeterminate": true,
|
||||
"autonomous35NotHalved": true,
|
||||
"saveRecoverDownload": true,
|
||||
"accepted13InputPreserved": true,
|
||||
"L8FinalUnknown": true,
|
||||
"errors": []
|
||||
},
|
||||
"accepted13_exact_model_key_history_comparison": true,
|
||||
"accepted_suites_not_rerun": true,
|
||||
"typescript_build_after_main": true
|
||||
},
|
||||
"no_custom_QA_suite_repeated": true,
|
||||
"L7_remaining_code": [
|
||||
"other combinations and express exceptions",
|
||||
"CBF17-19 and potential15 entitlement",
|
||||
"specific sector/territorial regimes",
|
||||
"mixed/withheld cooperativeincome and otherentities",
|
||||
"other autonome expense origins",
|
||||
"furtherCBF16 scopes",
|
||||
"capitalgains/specialoperations",
|
||||
"officialL7M20M22transport"
|
||||
],
|
||||
"L7_resume_conditions": [
|
||||
"disposition/article/scope/period/order/limit and segregatedparcel for combination",
|
||||
"implement not-yet-supported treatment before adding its effect",
|
||||
"specific document only for dependentcase/field"
|
||||
],
|
||||
"L8_first_increment": {
|
||||
"status": "L8_first_increment_delimited_not_implemented",
|
||||
"date": "2026-10-26",
|
||||
"installed_L7": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"no_new_L8_calculator_installed": true,
|
||||
"initial_scope": "resident general IRPC,annualcivil2026,MZN,currentdetermined assessment,documented absence of positive PEC/unmappedcredits and autonomoustax needing ownsettlement",
|
||||
"inputs_reused": [
|
||||
"current L6 or applicable qualifiedL7 assessment key/version/subjectNUIT/period;never add both",
|
||||
"L5 received/effective/on_account qualified and reconciled withholding proofs",
|
||||
"actual documented PPC payments by subject/period/receipt",
|
||||
"known/declaredabsence/missing states for every credit/paymentfamily"
|
||||
],
|
||||
"wrong_credits_excluded": [
|
||||
"withholding remitted by enterprise on payments to others",
|
||||
"definitive withholding",
|
||||
"projected amount without effective proof",
|
||||
"duplicate receipt/allocation/year",
|
||||
"unmapped positive PEC/investment/doubletax credit"
|
||||
],
|
||||
"sequence": [
|
||||
"validassessment",
|
||||
"admissibledeductions and explicitabsence",
|
||||
"effective onaccount withholdings",
|
||||
"actual PPC",
|
||||
"signed arithmeticbalance",
|
||||
"applicable collection/refund minimum rules",
|
||||
"simulatedpayable orrecoverable;not submittedor receivedrefund"
|
||||
],
|
||||
"proposed_acceptance_cases": [
|
||||
{
|
||||
"colecta": "1408",
|
||||
"withholdings": "300",
|
||||
"PPC": "500",
|
||||
"arithmetic_balance": "608"
|
||||
},
|
||||
{
|
||||
"colecta": "1408",
|
||||
"withholdings": "1000",
|
||||
"PPC": "600",
|
||||
"arithmetic_balance": "-192"
|
||||
},
|
||||
{
|
||||
"colecta": "1408",
|
||||
"withholdings": "408",
|
||||
"PPC": "1000",
|
||||
"arithmetic_balance": "0"
|
||||
},
|
||||
"minimumrule boundaries afterperiod/version mapping",
|
||||
"knownzero vs declaredabsence vs missing",
|
||||
"wrongbeneficiary/definitive/duplicates",
|
||||
"calculation-save-recover-report with oldhistories unchanged"
|
||||
],
|
||||
"cases_tested_now": false,
|
||||
"rule_work_before_implementation": [
|
||||
"CIRPC63/67 with Lei12/2025 nature applicable",
|
||||
"Decreto9/2008 art21(2-5) deductionorder/limits and27(1-2/6) settlement",
|
||||
"100MZN minimum in accepted2008 exemplar:link to applicable version/period before enabling parameter;no generic credibility revalidation",
|
||||
"retain PEC/credits distinct and nonrefundable limits;no3/5year automaticcarry"
|
||||
],
|
||||
"boundaries": [
|
||||
"qualified cooperative withoutwithheldincome cannot silently acceptpositivereceivedwithholdings without L7segregation",
|
||||
"no L6fallback toignore applicablependingL7effect",
|
||||
"autonomoustax/61Apositive needs own settlement articulation",
|
||||
"fraction exact;unmapped formrepresentation onlyblocks affectedtransport"
|
||||
],
|
||||
"deferred": [
|
||||
"automatic PPC/PEC obligationcalculation",
|
||||
"positivePEC/creditorderlimitscarry",
|
||||
"autonomoustaxsettlement",
|
||||
"specialperiods/foreigncurrencypayments",
|
||||
"interest/penalties/calendar/guideremittance",
|
||||
"AT submission/refundprocessing",
|
||||
"unmappedM20M22fields"
|
||||
],
|
||||
"sources_reused": [
|
||||
{
|
||||
"file": "C:\\laragon\\www\\portal-investidor-irpc-l7-common-qa-20261026\\docs\\investmoz\\simulations\\source-archive\\Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"articles": "CIRPC63/67",
|
||||
"PDF_pages": [
|
||||
18,
|
||||
19
|
||||
],
|
||||
"official_source_acceptance_preserved": true
|
||||
},
|
||||
{
|
||||
"file": "C:\\laragon\\www\\portal-investidor-irpc-l7-common-qa-20261026\\docs\\investmoz\\simulations\\source-archive\\Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"articles": "RIRPC21/27",
|
||||
"PDF_pages": [
|
||||
6,
|
||||
7
|
||||
],
|
||||
"official_source_acceptance_preserved": true
|
||||
},
|
||||
{
|
||||
"file": "C:\\laragon\\www\\portal-investidor-irpc-l7-common-qa-20261026\\docs\\investmoz\\simulations\\source-archive\\BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"articles": "Lei12/2025 IRPC67/version2026",
|
||||
"PDF_pages": [
|
||||
18,
|
||||
19,
|
||||
20
|
||||
],
|
||||
"official_source_acceptance_preserved": true
|
||||
}
|
||||
],
|
||||
"global_effort": {
|
||||
"initial_L8_L14_reference_hours": [
|
||||
240,
|
||||
416
|
||||
],
|
||||
"is_current_remainingforecast": false,
|
||||
"reconciliation_before_globalforecast": [
|
||||
"implemented/reusable vs remainingcode perlot",
|
||||
"reuseacceptedproofs;no duplicate sharedcomponentestimate",
|
||||
"documentarywait separately",
|
||||
"L1-L7residuals,integration/delivery,L15-L16 included"
|
||||
]
|
||||
},
|
||||
"L7_partial": true,
|
||||
"L8_final_still_not_implemented": true
|
||||
},
|
||||
"global_effort_forecast_not_assumed": true,
|
||||
"L6_operational_delimited": true,
|
||||
"L7_partial": true,
|
||||
"L8_final_separate": true,
|
||||
"SGF_TEMPO_untouched": true
|
||||
}
|
||||
@@ -0,0 +1,614 @@
|
||||
{
|
||||
"status": "combinations_QA_ready_not_installed",
|
||||
"date": "2026-10-26",
|
||||
"branch": "codex/irpc-l7-combinations-qa-20261026",
|
||||
"installed_baseline": "632dc06930d6b4f1b012feb3b4daa3b1cfc53f39",
|
||||
"documentation_baseline": "f33d99b4",
|
||||
"version": "IRPC-normal-adjustments/14",
|
||||
"optional_input": "special.combinations version1;document presence/absence of specific/other benefits and express exception;reuse existing qualification/period/assets",
|
||||
"scope": "CIRPC12 qualified pure cooperative + genericCBF16;separate expense61(4);CBF4/13 incompatibility of specific+generic without express exception;unmapped exception/other benefit remain indeterminate",
|
||||
"calculation_order": [
|
||||
"CBF16 net difference once",
|
||||
"existing taxablebase deductions/losses",
|
||||
"16percent on fullyeligible cooperativebase",
|
||||
"35percent autonomous expenses separately",
|
||||
"L8 final remains unknown"
|
||||
],
|
||||
"positive_unmapped_L6_benefit_not_reapplied": true,
|
||||
"runtime_delta": {
|
||||
"resources/js/lib/irpc-special.ts": "bc72c0c045fa7d7fc2a6b98ca95205479aa448f0c2a9819b930e72f7c93f6ade",
|
||||
"resources/js/lib/irpc-normal.ts": "4741c2bdecb8570fe786e51f777c633da34dcb0052bb000f9b63ebfde48b1f4a",
|
||||
"resources/js/components/simulation-irpc-special.tsx": "bb567f06cf2c844419341fa298751752ef94a2f493972d28f68b5f2245b95e00",
|
||||
"resources/js/lib/irpc-special-combinations.ts": "b638fdf96e33a27c1c73492fb5690c7b170ecbe97dd4ad9881465b2c4eaa6a22"
|
||||
},
|
||||
"L6_depreciation_period_fx_engines_unchanged": true,
|
||||
"cases_recovered": {
|
||||
"combined": {
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "compatible",
|
||||
"order": [
|
||||
"Diferença adicionalCBF16 aplicada uma vez ao lucroL6",
|
||||
"Matéria colectável recalculada com as mesmas deduções/perdasL6",
|
||||
"Cooperativa12:50% da taxa geral32%=16% apenas na base integralmente elegível",
|
||||
"Imposto autónomo61(4) separado a35%,sem redução cooperativa",
|
||||
"Saldo final a pagar/recuperar permaneceL8"
|
||||
],
|
||||
"asset_claims": [
|
||||
{
|
||||
"assetId": "server",
|
||||
"document": "QA-activo-servidor",
|
||||
"line": "1",
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": {
|
||||
"numerator": "75",
|
||||
"denominator": "1"
|
||||
},
|
||||
"priorRecoveredIncluded": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"additionalDeduction": {
|
||||
"numerator": "25",
|
||||
"denominator": "1"
|
||||
},
|
||||
"remainingFiscal": {
|
||||
"numerator": "825",
|
||||
"denominator": "1"
|
||||
}
|
||||
}
|
||||
],
|
||||
"L7_profit": {
|
||||
"numerator": "3105",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3105",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "2484",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": {
|
||||
"numerator": "2484",
|
||||
"denominator": "5"
|
||||
},
|
||||
"pending": [],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"autonomous": {
|
||||
"L6_profit": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5168",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "compatible",
|
||||
"order": [
|
||||
"Diferença adicionalCBF16 aplicada uma vez ao lucroL6",
|
||||
"Matéria colectável recalculada com as mesmas deduções/perdasL6",
|
||||
"Cooperativa12:50% da taxa geral32%=16% apenas na base integralmente elegível",
|
||||
"Imposto autónomo61(4) separado a35%,sem redução cooperativa",
|
||||
"Saldo final a pagar/recuperar permaneceL8"
|
||||
],
|
||||
"asset_claims": [
|
||||
{
|
||||
"assetId": "server",
|
||||
"document": "QA-activo-servidor",
|
||||
"line": "1",
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": {
|
||||
"numerator": "75",
|
||||
"denominator": "1"
|
||||
},
|
||||
"priorRecoveredIncluded": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"additionalDeduction": {
|
||||
"numerator": "25",
|
||||
"denominator": "1"
|
||||
},
|
||||
"remainingFiscal": {
|
||||
"numerator": "825",
|
||||
"denominator": "1"
|
||||
}
|
||||
}
|
||||
],
|
||||
"L7_profit": {
|
||||
"numerator": "3205",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3205",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "2564",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": {
|
||||
"numerator": "35",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": {
|
||||
"numerator": "2739",
|
||||
"denominator": "5"
|
||||
},
|
||||
"pending": [],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"incompatible": {
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "incompatible",
|
||||
"order": [
|
||||
"Diferença adicionalCBF16 aplicada uma vez ao lucroL6",
|
||||
"Matéria colectável recalculada com as mesmas deduções/perdasL6",
|
||||
"Cooperativa12:50% da taxa geral32%=16% apenas na base integralmente elegível",
|
||||
"Imposto autónomo61(4) separado a35%,sem redução cooperativa",
|
||||
"Saldo final a pagar/recuperar permaneceL8"
|
||||
],
|
||||
"asset_claims": [
|
||||
{
|
||||
"assetId": "server",
|
||||
"document": "QA-activo-servidor",
|
||||
"line": "1",
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": null,
|
||||
"priorRecoveredIncluded": null,
|
||||
"additionalDeduction": null,
|
||||
"remainingFiscal": null
|
||||
}
|
||||
],
|
||||
"L7_profit": null,
|
||||
"L7_base": null,
|
||||
"L7_colecta": null,
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": null,
|
||||
"pending": [
|
||||
"IncompatibilidadeCBF4/13:benefício específico declarado e genéricoCBF16 sem excepção expressa;nenhum benefício é escolhido ou removido automaticamente."
|
||||
],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"missing": {
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "indeterminate",
|
||||
"order": [
|
||||
"Diferença adicionalCBF16 aplicada uma vez ao lucroL6",
|
||||
"Matéria colectável recalculada com as mesmas deduções/perdasL6",
|
||||
"Cooperativa12:50% da taxa geral32%=16% apenas na base integralmente elegível",
|
||||
"Imposto autónomo61(4) separado a35%,sem redução cooperativa",
|
||||
"Saldo final a pagar/recuperar permaneceL8"
|
||||
],
|
||||
"asset_claims": [
|
||||
{
|
||||
"assetId": "server",
|
||||
"document": "QA-activo-servidor",
|
||||
"line": "1",
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": null,
|
||||
"priorRecoveredIncluded": null,
|
||||
"additionalDeduction": null,
|
||||
"remainingFiscal": null
|
||||
}
|
||||
],
|
||||
"L7_profit": null,
|
||||
"L7_base": null,
|
||||
"L7_colecta": null,
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": null,
|
||||
"pending": [
|
||||
"Benefícios específicosCBF:identifique presença ou ausência documentada;localização não prova estatuto."
|
||||
],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"exception": {
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "indeterminate",
|
||||
"order": [
|
||||
"Diferença adicionalCBF16 aplicada uma vez ao lucroL6",
|
||||
"Matéria colectável recalculada com as mesmas deduções/perdasL6",
|
||||
"Cooperativa12:50% da taxa geral32%=16% apenas na base integralmente elegível",
|
||||
"Imposto autónomo61(4) separado a35%,sem redução cooperativa",
|
||||
"Saldo final a pagar/recuperar permaneceL8"
|
||||
],
|
||||
"asset_claims": [
|
||||
{
|
||||
"assetId": "server",
|
||||
"document": "QA-activo-servidor",
|
||||
"line": "1",
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": null,
|
||||
"priorRecoveredIncluded": null,
|
||||
"additionalDeduction": null,
|
||||
"remainingFiscal": null
|
||||
}
|
||||
],
|
||||
"L7_profit": null,
|
||||
"L7_base": null,
|
||||
"L7_colecta": null,
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": null,
|
||||
"pending": [
|
||||
"Excepção expressa invocada:ligar artigo,âmbito,período e limites à combinação antes de calcular;esta excepção ainda não está correspondida."
|
||||
],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"negative": {
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "compatible",
|
||||
"order": [
|
||||
"Diferença adicionalCBF16 aplicada uma vez ao lucroL6",
|
||||
"Matéria colectável recalculada com as mesmas deduções/perdasL6",
|
||||
"Cooperativa12:50% da taxa geral32%=16% apenas na base integralmente elegível",
|
||||
"Imposto autónomo61(4) separado a35%,sem redução cooperativa",
|
||||
"Saldo final a pagar/recuperar permaneceL8"
|
||||
],
|
||||
"asset_claims": [
|
||||
{
|
||||
"assetId": "server",
|
||||
"document": "QA-activo-servidor",
|
||||
"line": "1",
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": {
|
||||
"numerator": "75",
|
||||
"denominator": "1"
|
||||
},
|
||||
"priorRecoveredIncluded": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"additionalDeduction": {
|
||||
"numerator": "25",
|
||||
"denominator": "1"
|
||||
},
|
||||
"remainingFiscal": {
|
||||
"numerator": "825",
|
||||
"denominator": "1"
|
||||
}
|
||||
}
|
||||
],
|
||||
"L7_profit": {
|
||||
"numerator": "3105",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3105",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "4968",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": {
|
||||
"numerator": "4968",
|
||||
"denominator": "5"
|
||||
},
|
||||
"pending": [],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"absent": {
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "compatible",
|
||||
"order": [
|
||||
"Diferença adicionalCBF16 aplicada uma vez ao lucroL6",
|
||||
"Matéria colectável recalculada com as mesmas deduções/perdasL6",
|
||||
"Cooperativa12:50% da taxa geral32%=16% apenas na base integralmente elegível",
|
||||
"Imposto autónomo61(4) separado a35%,sem redução cooperativa",
|
||||
"Saldo final a pagar/recuperar permaneceL8"
|
||||
],
|
||||
"asset_claims": [],
|
||||
"L7_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "2504",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": {
|
||||
"numerator": "2504",
|
||||
"denominator": "5"
|
||||
},
|
||||
"pending": [],
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"new_frontend_tests": 12,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 133,
|
||||
"QA_database": "simulator_fiscal_delta_20261021_test",
|
||||
"QA_host": "127.0.0.1",
|
||||
"QA_port": 55441,
|
||||
"QA_transaction_rollback": true,
|
||||
"wayfinder_with_form": true,
|
||||
"typescript": true,
|
||||
"build": true,
|
||||
"recovered_HTML_and_financial_dossier": 7,
|
||||
"UI": {
|
||||
"actualComponent": true,
|
||||
"explicitPrepareCancel": true,
|
||||
"assetsPeriodsBenefitsNotEdited": true,
|
||||
"missingOnlyDependentL7": true,
|
||||
"CBF16Additional25ThenCooperative16": true,
|
||||
"prior15AlreadyIncluded": true,
|
||||
"specificGenericIncompatibilityNoAutomaticChoice": true,
|
||||
"unmappedExceptionIndeterminate": true,
|
||||
"autonomous35NotHalved": true,
|
||||
"saveRecoverDownload": true,
|
||||
"accepted13InputPreserved": true,
|
||||
"L8FinalUnknown": true,
|
||||
"errors": []
|
||||
},
|
||||
"accepted13_exact_model_key_history_comparison": true,
|
||||
"accepted_suites_not_rerun": true,
|
||||
"typescript_build_after_main": true
|
||||
},
|
||||
"preservation": {
|
||||
"tracked_files_compared_before_docs": 2822,
|
||||
"unchanged": 2819,
|
||||
"modified": [
|
||||
"resources/js/components/simulation-irpc-special.tsx",
|
||||
"resources/js/lib/irpc-normal.ts",
|
||||
"resources/js/lib/irpc-special.ts"
|
||||
],
|
||||
"new_runtime_module": "resources/js/lib/irpc-special-combinations.ts",
|
||||
"originals": {
|
||||
"docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973",
|
||||
"docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57",
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063",
|
||||
"docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee",
|
||||
"docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5",
|
||||
"docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358",
|
||||
"docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b",
|
||||
"docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d",
|
||||
"docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899",
|
||||
"docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee",
|
||||
"docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53",
|
||||
"docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121",
|
||||
"docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
},
|
||||
"histories_assets_balances_plan_otherbooks_preserved": true,
|
||||
"official_balances_not_consumed": true,
|
||||
"active_writes": 0,
|
||||
"migrations": 0,
|
||||
"SGF_TEMPO_untouched": true
|
||||
},
|
||||
"sources_reused": [
|
||||
{
|
||||
"path": "C:/laragon/www/portal-investidor-irpc-l7-scope-20261026/outputs/irpc-l7-scope/APIEX-legislacao-investimentos-2025.pdf",
|
||||
"sha256": "ba1e9eaabfec5d0c4cb2d9f2444a6860f7a90f222034764197829be402d408ed",
|
||||
"pages": [
|
||||
66,
|
||||
70,
|
||||
72
|
||||
],
|
||||
"articles": "CBF4/13/16"
|
||||
},
|
||||
{
|
||||
"path": "C:\\laragon\\www\\portal-investidor-irpc-l7-common-qa-20261026\\docs\\investmoz\\simulations\\source-archive\\Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"pages": [
|
||||
5
|
||||
],
|
||||
"articles": "CIRPC12/14"
|
||||
}
|
||||
],
|
||||
"inventory_reused": 8143,
|
||||
"remaining_code": [
|
||||
"other combinations and express exceptions",
|
||||
"CBF17-19 and potential15 entitlement",
|
||||
"specific sector/territorial regimes",
|
||||
"mixed/withheld cooperativeincome and otherentities",
|
||||
"other autonome expense origins",
|
||||
"furtherCBF16 scopes",
|
||||
"capitalgains/specialoperations",
|
||||
"officialL7M20M22transport"
|
||||
],
|
||||
"resume_conditions": [
|
||||
"disposition/article/scope/period/order/limit and segregatedparcel for combination",
|
||||
"implement not-yet-supported treatment before adding its effect",
|
||||
"specific document only for dependentcase/field"
|
||||
],
|
||||
"effort_reference": {
|
||||
"type": "initial planning figures,not updated remainingestimate",
|
||||
"L8_to_L14_hours": [
|
||||
240,
|
||||
416
|
||||
],
|
||||
"eight_hour_days": [
|
||||
30,
|
||||
52
|
||||
],
|
||||
"excludes": [
|
||||
"L1-L7residuals",
|
||||
"L15-L16unestimated",
|
||||
"documentarywait"
|
||||
],
|
||||
"global_completion_percentage_not_established": true
|
||||
},
|
||||
"future_delivery_requires_fresh_main_capacity_backup_restore": true,
|
||||
"L6_operational_delimited": true,
|
||||
"L7_partial": true,
|
||||
"L8_final_balance_separate": true,
|
||||
"evidence_directory": "outputs/irpc-l7-combinations",
|
||||
"main_incorporated": "a7434cd27c09df3d8e6c586f9676b67abcde798e",
|
||||
"main_merge_commit": "ea2bceb5ce0c089698603da4cfd268ac1cafbb7a",
|
||||
"main_source_delta_preserved": [
|
||||
"app/Http/Controllers/PortalServicesController.php",
|
||||
"app/Http/Controllers/PublicPortalController.php",
|
||||
"app/Services/SectorInvestment.php",
|
||||
"docs/investmoz/unification/traceability-and-manual.md",
|
||||
"docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv",
|
||||
"resources/js/components/educational-article-card.tsx",
|
||||
"resources/js/components/sector-content.tsx",
|
||||
"resources/js/components/sector-entry.tsx",
|
||||
"resources/js/pages/portal/services.tsx",
|
||||
"resources/js/pages/portal/why-invest.tsx",
|
||||
"tests/Feature/SectorCatalogueContentTest.php"
|
||||
],
|
||||
"accepted_QA13_manual_appendix_restored": true,
|
||||
"served_revision_not_rechecked_this_QA": true
|
||||
}
|
||||
@@ -0,0 +1,585 @@
|
||||
{
|
||||
"status": "installed_first_grouped_L7_demonstrated_scope",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"QA_candidate": "ab2ff2fdbcbe6fb94f03e4bc4cc7ccbd647d94fc",
|
||||
"integration_candidate": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"previous_main": "a2122dc34cc9d3e8b64938c3d6b31cc36f336154",
|
||||
"previous_installed": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"authorization": "Tempo:disponibilizar entrega agrupadaL7 peloGit,backup/restauro fresco,conferência do delta,preservarL6/provas aceites e apresentar saldo concreto",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l7-common-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T10:55:59Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "a3d46de6c10b37bd6f211125686da8c489f879ab243f082e7b72a397638901f9",
|
||||
"files_sha256": "409d378ce59ca3d82e39cbf44f139114a839e1aa56457755316a2fecdd7e5b07",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l7_restore_20261026",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "a3d46de6c10b37bd6f211125686da8c489f879ab243f082e7b72a397638901f9",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 13,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 50,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "63f3ceed97ce2f40106530ef6eb6e083"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "38aa09dc08f13ff12ac1e71dbae22d0b"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 11,
|
||||
"checksum": "823228a21cb8173718f6010a9aaa319a"
|
||||
},
|
||||
"after": {
|
||||
"rows": 14,
|
||||
"checksum": "1529684ad387db4b9aaa40ac775ebe74"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions_before": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected"
|
||||
},
|
||||
"schema_permissions_after": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
|
||||
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "8d6ea77eb4b34d86d207362d583cfa8bf2880b907becd9b00398964482c6b4bd",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "2f251473865d14b953236ab95b1521764754d76abd79b58ca7d38c96dfe2fab1",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 11,
|
||||
"after_rows": 14,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "cd8c2106a4f4ab7802317e6602c26cfa4cf82a23a86f67a0abbc27fbd82edfb8",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "a89dca10cb8a95f4451ff60eeefe7ac3cd7751b779b0bf97a7e5f5b894f9b115",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "7fb2119013f872a5e4dd70952cc896a4ac8291134e02362bd60805eb77e9587a",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T11:02:32.435267+00:00",
|
||||
"manifest_sha256": "d78a1bdb503c10849f5ea8d8879753653c2c2fc22f6182f6d68ec9f6adf635b5"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"IRPC-normal-adjustments/10": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"Preparar qualificação L7": [
|
||||
"assets/services-BSj1SuMk.js"
|
||||
],
|
||||
"Despesas — imposto autónomo": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"Cooperativa — redução da taxa": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"Amortizações aceleradas": [
|
||||
"assets/services-BSj1SuMk.js",
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"novo ajustamento ao lucro:": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"colecta combinada:": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"Saldo final — âmbito L8": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"Reutilizar selecção cambial": [
|
||||
"assets/services-BSj1SuMk.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/project-dossier-document-BRdhvWgC.js",
|
||||
"status": 200,
|
||||
"sha256": "5b1de561be552259de776a2dbaf4b49909a3edd2647fec7c296a96054c929a9f"
|
||||
},
|
||||
{
|
||||
"file": "assets/services-BSj1SuMk.js",
|
||||
"status": 200,
|
||||
"sha256": "ea1a3812cbced72f4df115e8e379ae6d2307e97b2152d288b1c80d357f03f78b"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-KEyrPtc6.js",
|
||||
"status": 200,
|
||||
"sha256": "b6ae250a30b5030a6e40e7dfb140a3335ce6d5bc16835098d3d7c5828fc526c5"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-ByAQSjfI.js",
|
||||
"existing_fiscal_availability": {
|
||||
"data": {
|
||||
"enabled": true,
|
||||
"coverage_start": "2026-01-01",
|
||||
"coverage_end": "2026-12-31",
|
||||
"message": "IVA geral sobre base líquida disponível; enquadramento declarado."
|
||||
}
|
||||
},
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"pipeline": {
|
||||
"service": "ExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"latest_report": {
|
||||
"status": "installed",
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0,
|
||||
"requested_commits": [
|
||||
"e07f89da3d59d06aa1b8c50c22a478b7b167bfdd"
|
||||
],
|
||||
"finished_at": "2026-10-26T11:02:35.885260+00:00"
|
||||
},
|
||||
"log_file": "1793012270105316629.log",
|
||||
"summaries": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 33.69s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 1007",
|
||||
"# pass 1007",
|
||||
"# fail 0"
|
||||
],
|
||||
"log_bytes": 287128
|
||||
},
|
||||
"concurrent_main_reconciliation": {
|
||||
"QA_candidate": "ab2ff2fdbcbe6fb94f03e4bc4cc7ccbd647d94fc",
|
||||
"concurrent_main": "a2122dc34cc9d3e8b64938c3d6b31cc36f336154",
|
||||
"installed_baseline": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"runtime_QA_files_exact": [
|
||||
"resources/js/lib/irpc-special.ts",
|
||||
"resources/js/components/simulation-irpc-special.tsx",
|
||||
"resources/js/lib/irpc-normal.ts",
|
||||
"resources/js/lib/irpc-normal-depreciation.ts",
|
||||
"resources/js/components/simulation-irpc-normal.tsx",
|
||||
"resources/js/lib/project-dossier-report.ts"
|
||||
],
|
||||
"concurrent_files_preserved": {
|
||||
"resources/js/components/portal-hero.tsx": "0ebe2c3e2ae2615d966d050864699a90dac2fef36ebfc174aa1059b83db9a514",
|
||||
"resources/js/components/tempo-brand.tsx": "27c01d317ec59c9a4ddb2a184c0a8a9427fcf92d34a916060287d07226364d02",
|
||||
"resources/js/layouts/portal-navigation.tsx": "f1f66b645035f56c9bcc7fbc8c2983e84eb29ae3ecb99461e3963a7deefbaaa6",
|
||||
"resources/js/lib/portal-navigation.ts": "12aad264eeb5cebe7c9bf467391c611f58d1b84cc9d5fd30db983ba640e25951",
|
||||
"resources/js/pages/PortalInvestidor.tsx": "d418f960f82ae0d054acfe094047bc80a16f7b418506f054e6d7da07edf6ef00",
|
||||
"resources/js/pages/investment/shared.tsx": "00098334435de3bb5c7b13608c0e53c63a4bdee7d9cdf07f24b3aec54441f05e",
|
||||
"resources/js/pages/portal/why-invest.tsx": "3917efa7b0d33fe8fe6e4562c3b9e2f53200b9e07807cd29bade328f8e5ae7e2",
|
||||
"tests/frontend/portal-navigation.test.mjs": "518c7e1de6fb1b385caffe39914e2905bf8f561d938f0527561156602a0e3098"
|
||||
},
|
||||
"CSV_concurrent_V2_01_preserved": true,
|
||||
"removed_manual_history_lines_restored": 586,
|
||||
"resolution": "main changed only by removing586tail lines from the manual;candidate manual retained in full;CSV auto-merge preserved V2-01 and changed only fiscal rowAUD-SIM-INT02",
|
||||
"new_functional_round": false,
|
||||
"accepted_QA_proofs_reused": {
|
||||
"new_frontend_tests": 19,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 108,
|
||||
"API_database": "simulator_fiscal_delta_20261021_test",
|
||||
"API_host": "127.0.0.1",
|
||||
"API_port": 55441,
|
||||
"API_transaction_rollback": true,
|
||||
"QA_identity_guard": true,
|
||||
"Wayfinder_generated_with_form": true,
|
||||
"typescript_noEmit": true,
|
||||
"QA_build": true,
|
||||
"API_recovered_to_HTML_and_financial_dossier_cases": 6,
|
||||
"UI": {
|
||||
"actualComponent": true,
|
||||
"expenseL6Addback100Autonomous35": true,
|
||||
"missingClassificationDoesNotEraseNormalProfit": true,
|
||||
"absenceExplicit": true,
|
||||
"cooperative16MixedCaseBlockedOnly": true,
|
||||
"acceleratedQuota150LimitedToAccounted120": true,
|
||||
"netAdditionalDeduction20": true,
|
||||
"cumulationMissingExplicit": true,
|
||||
"saveRecoveryDownload": true,
|
||||
"finalBalanceL8Unknown": true,
|
||||
"errors": []
|
||||
},
|
||||
"old_functional_suites_repeated": false,
|
||||
"building_and_lower_optional_quota_cases": true
|
||||
}
|
||||
},
|
||||
"dependency_archiving": {
|
||||
"status": "dependencies_archived_and_verified",
|
||||
"versions": 8,
|
||||
"free_before": 4349009920,
|
||||
"free_after": 6454341632,
|
||||
"receipt": "/var/backups/investmoz-build-dependencies-irpc-l7-common-20261026/receipt.json",
|
||||
"protected": [
|
||||
"/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"/var/www/investmoz-homologacao/releases/56475acb2f39e58cb51664913f7fb499f58eb7ab-694b3932"
|
||||
],
|
||||
"active_or_previous_release_modified": false,
|
||||
"source_data_backups_deleted": 0
|
||||
},
|
||||
"accepted_QA_proofs_reused": {
|
||||
"new_frontend_tests": 19,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 108,
|
||||
"API_database": "simulator_fiscal_delta_20261021_test",
|
||||
"API_host": "127.0.0.1",
|
||||
"API_port": 55441,
|
||||
"API_transaction_rollback": true,
|
||||
"QA_identity_guard": true,
|
||||
"Wayfinder_generated_with_form": true,
|
||||
"typescript_noEmit": true,
|
||||
"QA_build": true,
|
||||
"API_recovered_to_HTML_and_financial_dossier_cases": 6,
|
||||
"UI": {
|
||||
"actualComponent": true,
|
||||
"expenseL6Addback100Autonomous35": true,
|
||||
"missingClassificationDoesNotEraseNormalProfit": true,
|
||||
"absenceExplicit": true,
|
||||
"cooperative16MixedCaseBlockedOnly": true,
|
||||
"acceleratedQuota150LimitedToAccounted120": true,
|
||||
"netAdditionalDeduction20": true,
|
||||
"cumulationMissingExplicit": true,
|
||||
"saveRecoveryDownload": true,
|
||||
"finalBalanceL8Unknown": true,
|
||||
"errors": []
|
||||
},
|
||||
"old_functional_suites_repeated": false,
|
||||
"building_and_lower_optional_quota_cases": true
|
||||
},
|
||||
"source_inventory_reused": {
|
||||
"files_reused": 8143,
|
||||
"broad_search_repeated": false,
|
||||
"receipt": "irpc-l7-scope-20261026.json",
|
||||
"sources": [
|
||||
{
|
||||
"id": "CIRPC",
|
||||
"title": "Lei34/2007",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\Lei-34-2007-BR52.pdf",
|
||||
"bytes": 1676884,
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"references": "PDF5/p768(59):12,14,15; PDF15–16:54–56; PDF17/p768(71):61",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "IRPC-2026",
|
||||
"title": "Lei12/2025",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\BR-248-I-Suplemento-1-2025.pdf",
|
||||
"bytes": 440018,
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"references": "PDF18–20; PDF20:art2/61-A,art3,art6; vigência01/01/2026",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "IRPC-2022",
|
||||
"title": "Lei20/2022",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"bytes": 17966640,
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"references": "PDF1/p2731:61(2), termo31/12/2025",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "CBF-local",
|
||||
"title": "Lei4/2009",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\CBF-Lei4-2009-APIEX.pdf",
|
||||
"bytes": 10998765,
|
||||
"sha256": "4231a5b6783e603cedb98992f3e93ecaf1c1d5be341b093560cf2fdd0845b0dc",
|
||||
"references": "Original local disponível; scan sem extracção textual útil; cotejo textual pela compilação oficial",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false,
|
||||
"authorised_original": "\\\\Mac\\Home\\Documents\\TEMPO\\Portal Tempo\\Legislacao\\Apiex\\3.-Lei-no4-2009-de-12-de-Janeiro-Codigo-dos-Beneficios-Fiscais.pdf"
|
||||
},
|
||||
{
|
||||
"id": "APIEX",
|
||||
"title": "Compilação oficial APIEX",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\APIEX-legislacao-investimentos-2025.pdf",
|
||||
"bytes": 6467655,
|
||||
"sha256": "ba1e9eaabfec5d0c4cb2d9f2444a6860f7a90f222034764197829be402d408ed",
|
||||
"references": "pp8–32:Lei8/2023; pp36–59:Decreto8/2024; pp64–92:CBF4/2009; p68:9/10;p71–74:15–19",
|
||||
"official_url": "https://pt.apiex.gov.mz/wp-content/uploads/2025/02/LEGISLACAO-DE-INVESTIMENTOS-EM-MOCAMBIQUE.pdf",
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "RCBF",
|
||||
"title": "Decreto56/2009",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\Decreto56-2009-BR40.pdf",
|
||||
"bytes": 422005,
|
||||
"sha256": "6ea1b8d93daed48c6d590481d874010fa1708211d8f27c319dc9a31328456017",
|
||||
"references": "Procedimento já cotejado em iva-l1-p084-p085-model-i1-cotejo-20261024.json; não estende isenções IVA a IRPC",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
}
|
||||
],
|
||||
"document_consultation_activates_calculation": false
|
||||
},
|
||||
"L6_operational_demonstrated_scope_preserved": true,
|
||||
"L6_pending_code_and_documentation_preserved": true,
|
||||
"L7_integrally_complete": false,
|
||||
"IRPC_integrally_complete": false,
|
||||
"new_private_synthetic_writes_on_active": 0,
|
||||
"location_grants_benefit": false,
|
||||
"L8_retentions_payments_annual_credit_application_final_balance_separate": true,
|
||||
"remaining_scope": {
|
||||
"implementation": [
|
||||
"61(4) sources/partial segregation outside calculated36g",
|
||||
"cooperative mixed/withheld income and other entity exemptions9–14",
|
||||
"CBF16 other assets/methods/optional lower quota/periods/prior quotas and combinations",
|
||||
"61-A capital gains and special operations54–56/41-A",
|
||||
"CBF17–19 deductions/magnifications andCBF15 potential credit origin/eligibility",
|
||||
"sector/territory and specific special regimes",
|
||||
"L7 M20/M22 official transport"
|
||||
],
|
||||
"documentary_case_dependencies": [
|
||||
"nature/incidence/parcel and correct period",
|
||||
"individual statute/title/recognition or applicable exception only where required",
|
||||
"specific norm/validity/compatibility/order/limit not corresponded",
|
||||
"affected form edition/field/representation"
|
||||
],
|
||||
"examples_and_resume_conditions": "same consolidated matrix and manual section:saldo concreto de L7 após a primeira entrega agrupada"
|
||||
},
|
||||
"evidence": {
|
||||
"backup.txt": "dac1a5cddac111160d64f4f34184f999cb40655b210582b9a18dbef20aedd8d0",
|
||||
"baseline.txt": "6e4bf2e80c29cc3c81d14c3da9f44e1ef3d576b0eb25f9c7ecb85f060c15b196",
|
||||
"compact-dependencies.txt": "a2385728e917cc20008da8b8144ff57a1bcbe3a1a352848c548b11bdf38fbbf0",
|
||||
"concurrent-main-reconciliation.json": "8a6aefa957e2b28905f89dca161de53bcffdc9dba2575e9f76efb13ac80a6c16",
|
||||
"installed-protected.txt": "e2fc267572cf8c29ee15e4efa524679843377766d19456ccba4e9187b7c55a21",
|
||||
"installed-public-delta.json": "557cbdc9ec7db9b0eb6865d0998c83a9c4a957ee041ba1bce0e54cd2df4ee3cb",
|
||||
"installed-public.txt": "4efa54256c1de8af63f80f0ff245f529cb581746f165a1299d7389ffd8047ee9",
|
||||
"integration.txt": "c320a8d33ea33e1f70a291b7da2fa4934658b2f87fc9a26a9521325e23cfac7d",
|
||||
"manifest-served.json": "d78a1bdb503c10849f5ea8d8879753653c2c2fc22f6182f6d68ec9f6adf635b5",
|
||||
"operational-delta.txt": "18793b0013b52e87ad088317b49ef3ef31e582dfb073500fa29a5822e237f61c",
|
||||
"preflight-ready.txt": "ffe2dfba440adebbd45ba72336d56668735f4916d3ae5385a4d750c5775a6a04",
|
||||
"preflight.txt": "6bf42bb982a7e5807123569ba9a4951bd639132b628965586b7ed60f36b5f0ea",
|
||||
"preparation.json": "46c078247bb3b68f2aabdb9aa5c0e40bf648dbc07e467933ce82d749b9741a00",
|
||||
"process-progress.txt": "721a9cf3e8b3892122dabe8b05e8c377b097d94ed0123b7135dcf83c53a40cd6",
|
||||
"progress-2.txt": "df6ae7b7f2e49c9da3ffbe12c0de6746a191f51dcf30428a93a3db4693c7972b",
|
||||
"progress-3.txt": "de4fa512b1e124d6c48c34eec14ab50fb66ebb718b49c0fd039e6a148598688d",
|
||||
"progress-4.txt": "de4fa512b1e124d6c48c34eec14ab50fb66ebb718b49c0fd039e6a148598688d",
|
||||
"restore.txt": "fcf1cbf5a6de6c0ac9172c3b5acd39c7c0438f950a2297be5f84964268ef4c24",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-before.txt": "290e99722a17dabbeb4bb609b2c3df423357dd1e34b3cc6f4e45cd64e758c797",
|
||||
"status-final.txt": "3814636ae1e3d45f6da832b42b3a9215503598bc20c0c080b3ab5181a074bea0",
|
||||
"status-progress-1.txt": "b289c9824a293d6b97db770712ce92e65c714fe72f22e0410ef6447b655d47d6"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,570 @@
|
||||
{
|
||||
"status": "L7_common_qualification_autonomous_expenses_cooperative_acceleration_QA_prepared_not_installed",
|
||||
"recorded_date": "2026-10-26",
|
||||
"installed_baseline": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"scope_baseline": "d37fffb2d2eacef6300f1c81fc29993178532f35",
|
||||
"branch": "codex/irpc-l7-common-autonomous-qa-20261026",
|
||||
"version": "IRPC-normal-adjustments/10",
|
||||
"installed": false,
|
||||
"L6_operational_scope_preserved": true,
|
||||
"IRPC_integrally_complete": false,
|
||||
"runtime_delta": {
|
||||
"resources/js/lib/irpc-special.ts": "5d261cdb54506bd892fa49776bb53a20600e62e64a4c180ef26cdcdb8b6a3806",
|
||||
"resources/js/components/simulation-irpc-special.tsx": "9ccd89e46703f9dd14c1110459b22673623a19bd652d137f40ec83e0f7c223db",
|
||||
"resources/js/lib/irpc-normal.ts": "7e63e7e5928a90c5305fd1fca49db883fec32666381ee99ae6fa4b06c711d9a7",
|
||||
"resources/js/lib/irpc-normal-depreciation.ts": "00ba22e449b23e570bfbbf3895bd334029a16f938d5a5ff999ca67b4318f58c3",
|
||||
"resources/js/components/simulation-irpc-normal.tsx": "e01e54dee4cd2555a8a27ed77512cf220056b5899ea9dacbaaae6d4063ce2d42",
|
||||
"resources/js/lib/project-dossier-report.ts": "cba66c88391da83b4fdb345a9570eca5ae83979cbbd508eb44b53995d812718d"
|
||||
},
|
||||
"cases_recovered": {
|
||||
"expense": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "5168",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "5168",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": {
|
||||
"numerator": "35",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": {
|
||||
"numerator": "5343",
|
||||
"denominator": "5"
|
||||
},
|
||||
"expense_status": "calculated",
|
||||
"cooperative_status": "absent",
|
||||
"acceleration_status": "absent",
|
||||
"additional_depreciation_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"history_versions": [
|
||||
"IRPC-normal-adjustments/1",
|
||||
"IRPC-normal-adjustments/2",
|
||||
"IRPC-normal-adjustments/3",
|
||||
"IRPC-normal-adjustments/4",
|
||||
"IRPC-normal-adjustments/5",
|
||||
"IRPC-normal-adjustments/6",
|
||||
"IRPC-normal-adjustments/7",
|
||||
"IRPC-normal-adjustments/8",
|
||||
"IRPC-normal-adjustments/9"
|
||||
],
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"missing": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "5168",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "5168",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": null,
|
||||
"combined_colecta": null,
|
||||
"expense_status": "indeterminate",
|
||||
"cooperative_status": "absent",
|
||||
"acceleration_status": "absent",
|
||||
"additional_depreciation_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"history_versions": [
|
||||
"IRPC-normal-adjustments/1",
|
||||
"IRPC-normal-adjustments/2",
|
||||
"IRPC-normal-adjustments/3",
|
||||
"IRPC-normal-adjustments/4",
|
||||
"IRPC-normal-adjustments/5",
|
||||
"IRPC-normal-adjustments/6",
|
||||
"IRPC-normal-adjustments/7",
|
||||
"IRPC-normal-adjustments/8",
|
||||
"IRPC-normal-adjustments/9"
|
||||
],
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"negative": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "5168",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3230",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "5168",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": {
|
||||
"numerator": "5168",
|
||||
"denominator": "5"
|
||||
},
|
||||
"expense_status": "calculated",
|
||||
"cooperative_status": "absent",
|
||||
"acceleration_status": "absent",
|
||||
"additional_depreciation_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"history_versions": [
|
||||
"IRPC-normal-adjustments/1",
|
||||
"IRPC-normal-adjustments/2",
|
||||
"IRPC-normal-adjustments/3",
|
||||
"IRPC-normal-adjustments/4",
|
||||
"IRPC-normal-adjustments/5",
|
||||
"IRPC-normal-adjustments/6",
|
||||
"IRPC-normal-adjustments/7",
|
||||
"IRPC-normal-adjustments/8",
|
||||
"IRPC-normal-adjustments/9"
|
||||
],
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"absent": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"expense_status": "absent",
|
||||
"cooperative_status": "absent",
|
||||
"acceleration_status": "absent",
|
||||
"additional_depreciation_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"history_versions": [
|
||||
"IRPC-normal-adjustments/1",
|
||||
"IRPC-normal-adjustments/2",
|
||||
"IRPC-normal-adjustments/3",
|
||||
"IRPC-normal-adjustments/4",
|
||||
"IRPC-normal-adjustments/5",
|
||||
"IRPC-normal-adjustments/6",
|
||||
"IRPC-normal-adjustments/7",
|
||||
"IRPC-normal-adjustments/8",
|
||||
"IRPC-normal-adjustments/9"
|
||||
],
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"cooperative": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "2504",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": {
|
||||
"numerator": "2504",
|
||||
"denominator": "5"
|
||||
},
|
||||
"expense_status": "absent",
|
||||
"cooperative_status": "calculated",
|
||||
"acceleration_status": "absent",
|
||||
"additional_depreciation_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"history_versions": [
|
||||
"IRPC-normal-adjustments/1",
|
||||
"IRPC-normal-adjustments/2",
|
||||
"IRPC-normal-adjustments/3",
|
||||
"IRPC-normal-adjustments/4",
|
||||
"IRPC-normal-adjustments/5",
|
||||
"IRPC-normal-adjustments/6",
|
||||
"IRPC-normal-adjustments/7",
|
||||
"IRPC-normal-adjustments/8",
|
||||
"IRPC-normal-adjustments/9"
|
||||
],
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"acceleration": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "6260",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "6260",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "10016",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "6240",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "6240",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "9984",
|
||||
"denominator": "5"
|
||||
},
|
||||
"autonomous_tax": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"combined_colecta": {
|
||||
"numerator": "9984",
|
||||
"denominator": "5"
|
||||
},
|
||||
"expense_status": "absent",
|
||||
"cooperative_status": "absent",
|
||||
"acceleration_status": "calculated",
|
||||
"additional_depreciation_deduction": {
|
||||
"numerator": "20",
|
||||
"denominator": "1"
|
||||
},
|
||||
"history_versions": [
|
||||
"IRPC-normal-adjustments/1",
|
||||
"IRPC-normal-adjustments/2",
|
||||
"IRPC-normal-adjustments/3",
|
||||
"IRPC-normal-adjustments/4",
|
||||
"IRPC-normal-adjustments/5",
|
||||
"IRPC-normal-adjustments/6",
|
||||
"IRPC-normal-adjustments/7",
|
||||
"IRPC-normal-adjustments/8",
|
||||
"IRPC-normal-adjustments/9"
|
||||
],
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"source_inventory": {
|
||||
"files_reused": 8143,
|
||||
"broad_search_repeated": false,
|
||||
"receipt": "irpc-l7-scope-20261026.json",
|
||||
"sources": [
|
||||
{
|
||||
"id": "CIRPC",
|
||||
"title": "Lei34/2007",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\Lei-34-2007-BR52.pdf",
|
||||
"bytes": 1676884,
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"references": "PDF5/p768(59):12,14,15; PDF15–16:54–56; PDF17/p768(71):61",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "IRPC-2026",
|
||||
"title": "Lei12/2025",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\BR-248-I-Suplemento-1-2025.pdf",
|
||||
"bytes": 440018,
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"references": "PDF18–20; PDF20:art2/61-A,art3,art6; vigência01/01/2026",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "IRPC-2022",
|
||||
"title": "Lei20/2022",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"bytes": 17966640,
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"references": "PDF1/p2731:61(2), termo31/12/2025",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "CBF-local",
|
||||
"title": "Lei4/2009",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\CBF-Lei4-2009-APIEX.pdf",
|
||||
"bytes": 10998765,
|
||||
"sha256": "4231a5b6783e603cedb98992f3e93ecaf1c1d5be341b093560cf2fdd0845b0dc",
|
||||
"references": "Original local disponível; scan sem extracção textual útil; cotejo textual pela compilação oficial",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false,
|
||||
"authorised_original": "\\\\Mac\\Home\\Documents\\TEMPO\\Portal Tempo\\Legislacao\\Apiex\\3.-Lei-no4-2009-de-12-de-Janeiro-Codigo-dos-Beneficios-Fiscais.pdf"
|
||||
},
|
||||
{
|
||||
"id": "APIEX",
|
||||
"title": "Compilação oficial APIEX",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\APIEX-legislacao-investimentos-2025.pdf",
|
||||
"bytes": 6467655,
|
||||
"sha256": "ba1e9eaabfec5d0c4cb2d9f2444a6860f7a90f222034764197829be402d408ed",
|
||||
"references": "pp8–32:Lei8/2023; pp36–59:Decreto8/2024; pp64–92:CBF4/2009; p68:9/10;p71–74:15–19",
|
||||
"official_url": "https://pt.apiex.gov.mz/wp-content/uploads/2025/02/LEGISLACAO-DE-INVESTIMENTOS-EM-MOCAMBIQUE.pdf",
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "RCBF",
|
||||
"title": "Decreto56/2009",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\Decreto56-2009-BR40.pdf",
|
||||
"bytes": 422005,
|
||||
"sha256": "6ea1b8d93daed48c6d590481d874010fa1708211d8f27c319dc9a31328456017",
|
||||
"references": "Procedimento já cotejado em iva-l1-p084-p085-model-i1-cotejo-20261024.json; não estende isenções IVA a IRPC",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
}
|
||||
],
|
||||
"document_consultation_activates_calculation": false
|
||||
},
|
||||
"coverage": {
|
||||
"optional_input_backward_compatible": true,
|
||||
"accepted_version9_current_key_and_result_unchanged_without_L7": true,
|
||||
"expense_source": "calculated36(1)g schedule ID;full amount reused;no parallel amount",
|
||||
"expense_rate": "35/100",
|
||||
"expense_additional_profit_adjustment": "0",
|
||||
"cooperative_rate": "32/100 × 1/2 =16/100;eligible ordinary base only",
|
||||
"accelerated_rate": "normal maximum table rate ×3/2;lower optional quota not covered;first full civil2026,new supported asset,prior quotas zero",
|
||||
"accelerated_deduction": "min calculated quota/accounted eligible amount/fiscal remaining balance;only difference over normal map",
|
||||
"mixed_cases": "cooperative+autonomous expense demonstrated;cooperative+CBF16 not supported",
|
||||
"context": "reuses documented sector/territory/provenance;no benefit by location alone;raw snapshots not dumped in report",
|
||||
"states": [
|
||||
"information_missing",
|
||||
"declared_absence",
|
||||
"not_applicable_or_negative_condition",
|
||||
"calculated"
|
||||
],
|
||||
"report": "same normalReportRows/HTML and financial project dossier;L6 reference separated from L7 effects",
|
||||
"final_settlement": "not calculated;L8"
|
||||
},
|
||||
"pending": {
|
||||
"code": [
|
||||
"autonomous expenses outside already-calculated36g parcel",
|
||||
"mixed cooperative income/withheld parcels",
|
||||
"CBF16 rehabilitated/other categories/lower optional quota/methods/months/prior quotas/later years",
|
||||
"specific benefit combinations and cumulation",
|
||||
"61-A capital gains and other previously delimited treatment families",
|
||||
"L7 official form transport"
|
||||
],
|
||||
"documents_per_case": [
|
||||
"individual status/title/exception and qualification proof when required by applicable norm",
|
||||
"parcel/limit/order/cumulation/chronology not evidenced",
|
||||
"affected form field/edition/representation correspondence"
|
||||
],
|
||||
"resume_conditions": "same existing matrix/manual L7 QA section;no blanket validation or repeated transversal research",
|
||||
"L6_pending_unchanged": true,
|
||||
"L8_annual_credit_application_retentions_payments_final_balance_separate": true
|
||||
},
|
||||
"checks": {
|
||||
"new_frontend_tests": 19,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 108,
|
||||
"API_database": "simulator_fiscal_delta_20261021_test",
|
||||
"API_host": "127.0.0.1",
|
||||
"API_port": 55441,
|
||||
"API_transaction_rollback": true,
|
||||
"QA_identity_guard": true,
|
||||
"Wayfinder_generated_with_form": true,
|
||||
"typescript_noEmit": true,
|
||||
"QA_build": true,
|
||||
"API_recovered_to_HTML_and_financial_dossier_cases": 6,
|
||||
"UI": {
|
||||
"actualComponent": true,
|
||||
"expenseL6Addback100Autonomous35": true,
|
||||
"missingClassificationDoesNotEraseNormalProfit": true,
|
||||
"absenceExplicit": true,
|
||||
"cooperative16MixedCaseBlockedOnly": true,
|
||||
"acceleratedQuota150LimitedToAccounted120": true,
|
||||
"netAdditionalDeduction20": true,
|
||||
"cumulationMissingExplicit": true,
|
||||
"saveRecoveryDownload": true,
|
||||
"finalBalanceL8Unknown": true,
|
||||
"errors": []
|
||||
},
|
||||
"old_functional_suites_repeated": false,
|
||||
"building_and_lower_optional_quota_cases": true
|
||||
},
|
||||
"preservation": {
|
||||
"baseline": "d37fffb2d2eacef6300f1c81fc29993178532f35",
|
||||
"files_compared": 662,
|
||||
"only_existing_changed": [
|
||||
"resources/js/lib/irpc-normal-depreciation.ts",
|
||||
"resources/js/lib/irpc-normal.ts",
|
||||
"resources/js/lib/project-dossier-report.ts"
|
||||
],
|
||||
"protected_code_schema_config_routes_contract_files": 576,
|
||||
"originals": {
|
||||
"docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973",
|
||||
"docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57",
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063",
|
||||
"docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee",
|
||||
"docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5",
|
||||
"docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358",
|
||||
"docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b",
|
||||
"docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d",
|
||||
"docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899",
|
||||
"docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee",
|
||||
"docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53",
|
||||
"docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121",
|
||||
"docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
},
|
||||
"active_writes": 0,
|
||||
"migrations": 0,
|
||||
"permission_changes": false
|
||||
},
|
||||
"evidence_directory": "outputs/irpc-l7-common",
|
||||
"delivery": {
|
||||
"prepared_only": true,
|
||||
"Git_branch_isolated": true,
|
||||
"active_installation": false,
|
||||
"fresh_backup_restore_and_delta_check_required_at_future_installation": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,937 @@
|
||||
{
|
||||
"status": "CBF16_start_cessation_prior_group_installed",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "632dc06930d6b4f1b012feb3b4daa3b1cfc53f39",
|
||||
"release": "/var/www/investmoz-homologacao/releases/632dc06930d6b4f1b012feb3b4daa3b1cfc53f39-4c020686",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_installed": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"included_QA": [
|
||||
"ba83afe7d8a90fd016fd0cf424418811279285cd",
|
||||
"632dc06930d6b4f1b012feb3b4daa3b1cfc53f39"
|
||||
],
|
||||
"main_preserved_before_integration": "ae0d74bb3a5e0220c886dd72801a6550dd4ccbbe",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l7-grouped-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T13:29:24Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "80e6149d9d1eb001b32893e40ae484bcb6ed618d41bff1489ab7a5bccbdf306e",
|
||||
"files_sha256": "2f0d1fff3e0b6237b01af52377ea71718e9970550f9b017b58817ec2a560adcf",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l7_grouped_restore_20261026",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "80e6149d9d1eb001b32893e40ae484bcb6ed618d41bff1489ab7a5bccbdf306e",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"capacity_block_before": {
|
||||
"checked_at_UTC": "2026-10-26T13:25:42.513605+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"release_revision": {
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T12:39:22.332516+00:00",
|
||||
"manifest_sha256": "ce3110f77afcaefb5943e50fff77cc8feb34b4c1af20aea1fb64602ffa739264"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=1\nActiveState=failed\nSubState=failed\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4636987392,
|
||||
"available_inodes": 21416284,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4636987392,
|
||||
"available_inodes": 21416284,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4636987392,
|
||||
"available_inodes": 21416284,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4636987392,
|
||||
"available_inodes": 21416284,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 4636987392,
|
||||
"available_inodes": 21416284,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 4636987392,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175917995,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": false,
|
||||
"current_release_entry_reference": 31197,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"regenerable_npm_cache_recovery": {
|
||||
"at_UTC": "2026-10-26T13:28:45.839223+00:00",
|
||||
"target": "/root/.npm/_cacache",
|
||||
"method": "npm cache clean --force with separate new log directory",
|
||||
"free_before": 4648849408,
|
||||
"free_after": 7681077248,
|
||||
"recovered_bytes": 3032227840,
|
||||
"old_npm_logs_verified": 32,
|
||||
"npx_bytes_preserved": 109912064,
|
||||
"installed_record_unchanged": true,
|
||||
"project_dependencies_releases_backups_untouched": true,
|
||||
"active_business_writes": 0
|
||||
},
|
||||
"capacity_before": {
|
||||
"checked_at_UTC": "2026-10-26T13:29:08.917728+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"release_revision": {
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T12:39:22.332516+00:00",
|
||||
"manifest_sha256": "ce3110f77afcaefb5943e50fff77cc8feb34b4c1af20aea1fb64602ffa739264"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=1\nActiveState=failed\nSubState=failed\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7680946176,
|
||||
"available_inodes": 21431150,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7680946176,
|
||||
"available_inodes": 21431150,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7680946176,
|
||||
"available_inodes": 21431150,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7680946176,
|
||||
"available_inodes": 21431150,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7680946176,
|
||||
"available_inodes": 21431150,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 7680946176,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175917995,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": true,
|
||||
"current_release_entry_reference": 31197,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"capacity_after_backup": {
|
||||
"checked_at_UTC": "2026-10-26T13:30:52.665710+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"release_revision": {
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T12:39:22.332516+00:00",
|
||||
"manifest_sha256": "ce3110f77afcaefb5943e50fff77cc8feb34b4c1af20aea1fb64602ffa739264"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=1\nActiveState=failed\nSubState=failed\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7501979648,
|
||||
"available_inodes": 21431137,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7501979648,
|
||||
"available_inodes": 21431137,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7501979648,
|
||||
"available_inodes": 21431137,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7501979648,
|
||||
"available_inodes": 21431137,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 7501979648,
|
||||
"available_inodes": 21431137,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 7501979648,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175917995,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": true,
|
||||
"current_release_entry_reference": 31197,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"capacity_after_installation": {
|
||||
"checked_at_UTC": "2026-10-26T13:36:32.849652+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "632dc06930d6b4f1b012feb3b4daa3b1cfc53f39",
|
||||
"release": "/var/www/investmoz-homologacao/releases/632dc06930d6b4f1b012feb3b4daa3b1cfc53f39-4c020686",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/632dc06930d6b4f1b012feb3b4daa3b1cfc53f39-4c020686",
|
||||
"release_revision": {
|
||||
"commit": "632dc06930d6b4f1b012feb3b4daa3b1cfc53f39",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T13:34:38.155848+00:00",
|
||||
"manifest_sha256": "a19a56e9ecf5e15cdbac92baefa483af70905a530c39927d30f0abfaaebcdf3f"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 6477869056,
|
||||
"available_inodes": 21399599,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 6477869056,
|
||||
"available_inodes": 21399599,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 6477869056,
|
||||
"available_inodes": 21399599,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 6477869056,
|
||||
"available_inodes": 21399599,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 6477869056,
|
||||
"available_inodes": 21399599,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 6477869056,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175917995,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": true,
|
||||
"current_release_entry_reference": 31234,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"backup_restore_verified": true,
|
||||
"fiscal_runtime_delta": [
|
||||
{
|
||||
"path": "resources/js/lib/irpc-special.ts",
|
||||
"sha256_LF": "89f1eafa35111b92ec739d8e36c3279f20224024a1629869b85199566d642c24"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "5b182929ed984f41abe17c9b744c2b76a75532aefd00e2d967063e2b03f76322"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-special.tsx",
|
||||
"sha256_LF": "5baedb1df299babef8850022a06f88845f747c008d7773bc226ce9fe9210b5b0"
|
||||
}
|
||||
],
|
||||
"concurrent_main_presentation_delta_preserved": [
|
||||
"resources/js/pages/portal/why-invest.tsx"
|
||||
],
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "632dc06930d6b4f1b012feb3b4daa3b1cfc53f39",
|
||||
"release": "/var/www/investmoz-homologacao/releases/632dc06930d6b4f1b012feb3b4daa3b1cfc53f39-4c020686",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 3,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 60,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "d0ab7ac01e245cd9a1b545db96cbdf2c"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "b725d24eab666bda380f94df620c7b1c"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 22,
|
||||
"checksum": "7ad93d9dd3b3b34dee00d256213cf6a2"
|
||||
},
|
||||
"after": {
|
||||
"rows": 10,
|
||||
"checksum": "3034d8ede70cb5c6aa4cccb181d828b2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions_after": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
|
||||
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 22,
|
||||
"after_rows": 11,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dd5c5235e9b48e28573884145b201d1f92cdabfea21a1602307c2569efe5d56c",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "d3d49a6f04c09c9852119084de7f840a69a14872847f363523457bcc567f2220",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "d1963bf84cb07dfc540935a88fbeb14f272763938b4db1fb68ffd28e6be9e157",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": false,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "5b744c29cc4e8a7d20f33814b52fa522e2c04dc525e7e82fa1c00e18ba91d528",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": false,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "7cd11e7b663d5c5b1b6b31703b8b702ccef9a51f5ae9003f6ea177f3bde8c576",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": false,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "3da37b843afdc870f2c0b1336344e97218a264ab5a7b44825a194c89a48fab32",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "6e12944bc8f670195d0c6d2638337e2bf922261a158d130ba09f640a5722f0df",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "cd8c2106a4f4ab7802317e6602c26cfa4cf82a23a86f67a0abbc27fbd82edfb8",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "8cb63d0938103966b238f3aef867a970f2d3f3f66fe62b663457b3f7f2814b10",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": false,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "11bbe5f81c536cf605ed71f402fbaa6e9ef551d97c0a76e098078521d9f37f71",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "0efd8f20e81562999badc07fe5af262be1705f08554208e03d281055cd38e34e",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": false,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "a89dca10cb8a95f4451ff60eeefe7ac3cd7751b779b0bf97a7e5f5b894f9b115",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "f8e1fa11cf234c2c9f498402557b4c4aed3b89c83dace57af783ae840e4dc821",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "6827c4d8b9a804dc85c3ba12ec33f715b5e753ca00ad0f707e7cbd0e48e5e173",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "9bb5ab5f9a5a161579f25f0d029de6a3a5a9b6a8d03868682bf3fc73c9af6720",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": false,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "d0a4dbafaf19e2eee3af4ea41ce9aabf52cb42d5a61a598c54b37d8863b533d7",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "7fb2119013f872a5e4dd70952cc896a4ac8291134e02362bd60805eb77e9587a",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "9bce01e56add682b9d4f3f1829ee83129ab6b18a21c6cf221b04357a8b1232c6",
|
||||
"kind": "deleted",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": false,
|
||||
"expired_before_comparison": true,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": false
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "632dc06930d6b4f1b012feb3b4daa3b1cfc53f39",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T13:34:38.155848+00:00",
|
||||
"manifest_sha256": "a19a56e9ecf5e15cdbac92baefa483af70905a530c39927d30f0abfaaebcdf3f"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"IRPC-normal-adjustments/12": [
|
||||
"assets/project-dossier-MN0piFXE.js"
|
||||
],
|
||||
"IRPC-normal-adjustments/13": [
|
||||
"assets/project-dossier-MN0piFXE.js"
|
||||
],
|
||||
"Preparar CBF16 para início de actividade": [
|
||||
"assets/services-Dwp9X13w.js"
|
||||
],
|
||||
"Preparar CBF16 para cessação e quotas anteriores": [
|
||||
"assets/services-Dwp9X13w.js"
|
||||
],
|
||||
"sem consumo de saldos oficiais": [
|
||||
"assets/project-dossier-MN0piFXE.js"
|
||||
],
|
||||
"Preparar CBF16 com duodécimos": [
|
||||
"assets/services-Dwp9X13w.js"
|
||||
],
|
||||
"CBF16 — duodécimos reutilizados de L6": [
|
||||
"assets/project-dossier-MN0piFXE.js"
|
||||
],
|
||||
"Suporte dos duodécimos CBF16": [
|
||||
"assets/services-Dwp9X13w.js"
|
||||
],
|
||||
"Manter preparação anual CBF16": [
|
||||
"assets/services-Dwp9X13w.js"
|
||||
],
|
||||
"CBF16 por duodécimos — ": [
|
||||
"assets/project-dossier-MN0piFXE.js"
|
||||
],
|
||||
"diferença adicional:": [
|
||||
"assets/project-dossier-MN0piFXE.js"
|
||||
],
|
||||
"IRPC-normal-adjustments/10": [
|
||||
"assets/project-dossier-MN0piFXE.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/project-dossier-document-CNhBEvbI.js",
|
||||
"status": 200,
|
||||
"sha256": "b9b847d250ac7868f3751371cd49009a3b7d6ad88bdbcb18890b711157508074"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
},
|
||||
{
|
||||
"file": "assets/services-Dwp9X13w.js",
|
||||
"status": 200,
|
||||
"sha256": "3b102fdc35d71ba203451d784264e949f2fec8ad55de84ecdee44a4920dc35c2"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-MN0piFXE.js",
|
||||
"status": 200,
|
||||
"sha256": "7dc6c894ba3b9cd83dea620c0f6412fdb219d75970e15a5e2e81af479066c3d6"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-BLx8DOj2.js",
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"pipeline": {
|
||||
"service": "ExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "632dc06930d6b4f1b012feb3b4daa3b1cfc53f39",
|
||||
"release": "/var/www/investmoz-homologacao/releases/632dc06930d6b4f1b012feb3b4daa3b1cfc53f39-4c020686",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"latest_report": {
|
||||
"status": "installed",
|
||||
"commit": "632dc06930d6b4f1b012feb3b4daa3b1cfc53f39",
|
||||
"release": "/var/www/investmoz-homologacao/releases/632dc06930d6b4f1b012feb3b4daa3b1cfc53f39-4c020686",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0,
|
||||
"requested_commits": [
|
||||
"632dc06930d6b4f1b012feb3b4daa3b1cfc53f39"
|
||||
],
|
||||
"finished_at": "2026-10-26T13:34:41.383616+00:00"
|
||||
},
|
||||
"log_file": "1793021473834371945.log",
|
||||
"summaries": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 32.94s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 1042",
|
||||
"# pass 1042",
|
||||
"# fail 0"
|
||||
],
|
||||
"log_bytes": 296124
|
||||
},
|
||||
"accepted_QA_proofs_reused": {
|
||||
"irpc-l7-start-period-qa-20261026.json": {
|
||||
"new_frontend_tests": 9,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 97,
|
||||
"API_database": "simulator_fiscal_delta_20261021_test",
|
||||
"API_host": "127.0.0.1",
|
||||
"API_port": 55441,
|
||||
"API_transaction_rollback": true,
|
||||
"wayfinder_with_form": true,
|
||||
"typescript": true,
|
||||
"isolated_build": true,
|
||||
"HTML_financial_dossier_from_5_API_recoveries": true,
|
||||
"actual_component": {
|
||||
"actualComponent": true,
|
||||
"explicitStartOptionAndCancel": true,
|
||||
"reuseL6PeriodEvidenceExplicit": true,
|
||||
"assetsAndPeriodUnchanged": true,
|
||||
"missingPreservesNormal1001_60": true,
|
||||
"sixActualMonths50Normal75Accelerated60Cap10Additional": true,
|
||||
"simulatedColecta998_40": true,
|
||||
"exactFraction5over3": true,
|
||||
"saveRecoveryDownload": true,
|
||||
"negativeAbsenceDistinct": true,
|
||||
"L8FinalUnknown": true,
|
||||
"errors": []
|
||||
}
|
||||
},
|
||||
"irpc-l7-cessation-prior-qa-20261026.json": {
|
||||
"new_frontend_tests": 11,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 123,
|
||||
"API_database": "simulator_fiscal_delta_20261021_test",
|
||||
"API_host": "127.0.0.1",
|
||||
"API_port": 55441,
|
||||
"transaction_rollback": true,
|
||||
"wayfinder_with_form": true,
|
||||
"typescript_after_main": true,
|
||||
"build_after_main": true,
|
||||
"HTML_financial_dossier_from_7_API_recoveries": true,
|
||||
"UI": {
|
||||
"actualComponent": true,
|
||||
"explicitPreparationAndCancel": true,
|
||||
"missingOnlyDependentL7": true,
|
||||
"assetsAndPeriodNotEdited": true,
|
||||
"prior15RecoveredWithin75DeductionAdditional25": true,
|
||||
"prior35RemainingNotConsumed": true,
|
||||
"annual30RecoveredWithin150DeductionAdditional50": true,
|
||||
"cessationDoesNotImplyAssetExit": true,
|
||||
"documentedExit5MonthsExact125over6": true,
|
||||
"saveRecoverDownload": true,
|
||||
"negativeAbsenceDistinct": true,
|
||||
"accepted12DoesNotGainConflictingInput": true,
|
||||
"L8FinalUnknown": true,
|
||||
"errors": []
|
||||
},
|
||||
"accepted_ba83_proofs_reused_not_rerun": true
|
||||
}
|
||||
},
|
||||
"no_custom_QA_suite_repeated": true,
|
||||
"demonstrated_example": {
|
||||
"normal_deduction_MZN": "50",
|
||||
"accelerated_deduction_MZN": "75",
|
||||
"prior_recovered_included_in_75_MZN": "15",
|
||||
"additional_deduction_MZN": "25",
|
||||
"prior_remaining_arithmetic_MZN": "35",
|
||||
"colecta_simulated_MZN": "993.60",
|
||||
"declared_prior_balances_unchanged": [
|
||||
"150",
|
||||
"100",
|
||||
"50"
|
||||
],
|
||||
"official_balances_consumed": false,
|
||||
"final_balance": "L8_not_calculated"
|
||||
},
|
||||
"remaining_L7": "cumulation and remaining implementation/document dependencies retained in same matrix;no full completion",
|
||||
"next_scope": "qualify combinations per applicable dispositions and segregated parcels;do not add positive benefits or apply automatic global cumulation",
|
||||
"L6_operational_delimited": true,
|
||||
"L7_partial": true,
|
||||
"L8_final_separate": true,
|
||||
"SGF_TEMPO_untouched": true
|
||||
}
|
||||
@@ -0,0 +1,532 @@
|
||||
{
|
||||
"status": "CBF16_monthly_installed",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"previous_installed": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"backup": {
|
||||
"stage": "/var/backups/investmoz-irpc-l7-months-delivery-20261026/backup",
|
||||
"created_at": "2026-10-26T12:34:42Z",
|
||||
"target": {
|
||||
"database": "teste_investidor",
|
||||
"port": 5432
|
||||
},
|
||||
"tables": 174,
|
||||
"files_verified": 369,
|
||||
"dump_sha256": "a4e23c6647eeb88ad14b697fafb4728be34118ad0fcfb73f02430fdc8a29135c",
|
||||
"files_sha256": "11143477968fecb78ddccaba1d36842fa18c1ccf0f2c84ae60704b4cbe4c8274",
|
||||
"restore_verified": false
|
||||
},
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l7_months_restore_20261026",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "a4e23c6647eeb88ad14b697fafb4728be34118ad0fcfb73f02430fdc8a29135c",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"capacity_before": {
|
||||
"checked_at_UTC": "2026-10-26T12:33:43.711257+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"release_revision": {
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T11:02:32.435267+00:00",
|
||||
"manifest_sha256": "d78a1bdb503c10849f5ea8d8879753653c2c2fc22f6182f6d68ec9f6adf635b5"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5901660160,
|
||||
"available_inodes": 21448052,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5901660160,
|
||||
"available_inodes": 21448052,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5901660160,
|
||||
"available_inodes": 21448052,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5901660160,
|
||||
"available_inodes": 21448052,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5901660160,
|
||||
"available_inodes": 21448052,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 5901660160,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175917329,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": true,
|
||||
"current_release_entry_reference": 31179,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"capacity_after_backup": {
|
||||
"checked_at_UTC": "2026-10-26T12:35:49.897136+00:00",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"current_link": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"release_revision": {
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T11:02:32.435267+00:00",
|
||||
"manifest_sha256": "d78a1bdb503c10849f5ea8d8879753653c2c2fc22f6182f6d68ec9f6adf635b5"
|
||||
},
|
||||
"service": "MainPID=0\nExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5723119616,
|
||||
"available_inodes": 21448040,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5723119616,
|
||||
"available_inodes": 21448040,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5723119616,
|
||||
"available_inodes": 21448040,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5723119616,
|
||||
"available_inodes": 21448040,
|
||||
"total_inodes": 29089792
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"available_bytes": 5723119616,
|
||||
"available_inodes": 21448040,
|
||||
"total_inodes": 29089792
|
||||
}
|
||||
],
|
||||
"free_bytes": 5723119616,
|
||||
"existing_pipeline_minimum_bytes": 5368709120,
|
||||
"observed_previous_backup_bytes": 175917329,
|
||||
"same_partition_release_and_backup": true,
|
||||
"space_guard_satisfied": true,
|
||||
"current_release_entry_reference": 31179,
|
||||
"inodes_available_vs_reference": true,
|
||||
"inode_note": "Observed current release footprint for scale;no new arbitrary inode threshold. Capacity rechecked after fresh backup.",
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"active_writes": 0
|
||||
},
|
||||
"delta": [
|
||||
{
|
||||
"path": "resources/js/lib/irpc-special.ts",
|
||||
"sha256_LF": "a6efbece159a118c5900a6c0d1ebd7b57091b62853c0ad589538546b377aa184"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-normal.ts",
|
||||
"sha256_LF": "f21868298d050c72149bcc814858123cb5c7320a93399b30c994b09b5117087c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-special.tsx",
|
||||
"sha256_LF": "da8160778c75935e8b7061ed5722616240189be818e1e04f5711d5b14ec6672d"
|
||||
}
|
||||
],
|
||||
"preservation": {
|
||||
"previous_release_preserved": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"runtime_files_verified": 3,
|
||||
"preserved_L3_ISPC_FX_runtime_files_verified": 60,
|
||||
"documentary_files_verified": 31,
|
||||
"persistent_files_and_env_verified": 369,
|
||||
"tables_compared": 174,
|
||||
"changed_tables": {
|
||||
"cache": {
|
||||
"before": {
|
||||
"rows": 106,
|
||||
"checksum": "716daf400150d9b23980e9c93b3e2f69"
|
||||
},
|
||||
"after": {
|
||||
"rows": 106,
|
||||
"checksum": "512b1ff328aa6bd8c495408be1ab804f"
|
||||
}
|
||||
},
|
||||
"sessions": {
|
||||
"before": {
|
||||
"rows": 17,
|
||||
"checksum": "7fa218eac3ce56d098b61c1dd270c47d"
|
||||
},
|
||||
"after": {
|
||||
"rows": 20,
|
||||
"checksum": "8f0c8ef146080d0b1bea08aaaddf0446"
|
||||
}
|
||||
}
|
||||
},
|
||||
"preserved_counts": {
|
||||
"published_fiches": 29,
|
||||
"relations": 28,
|
||||
"geometries": 408
|
||||
},
|
||||
"migration_count": 0,
|
||||
"content_imports": 0,
|
||||
"comparison_role": "postgres_before_and_after;sameexportedsnapshotbaseline;noapplicationRLSvisibilityinference",
|
||||
"writes_by_verification": 0
|
||||
},
|
||||
"schema_permissions_after": {
|
||||
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
|
||||
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
|
||||
"filesystem_permissions": {
|
||||
".env": {
|
||||
"mode": 416,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"storage/app": {
|
||||
"mode": 1533,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
},
|
||||
"bootstrap/cache": {
|
||||
"mode": 1528,
|
||||
"uid": 1001,
|
||||
"gid": 33
|
||||
}
|
||||
},
|
||||
"comparison_identity": "postgres;catalogue read only;no passwords collected",
|
||||
"unchanged": true
|
||||
},
|
||||
"operational_delta": {
|
||||
"status": "operational_delta_reconciled",
|
||||
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
|
||||
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
|
||||
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
|
||||
"delta": {
|
||||
"cache": {
|
||||
"before_rows": 106,
|
||||
"after_rows": 106,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "dbb99b7e17f5b4b9bb7a8bdf9350d9b2ae368aaa4bc44593a2522d87617d8461",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "c1c7bc86ef3255c103a0be6aeb651b824eb07259e993cc5daf3665c1a6afff2d",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-{hash}:timer",
|
||||
"is_queue_restart_key": false,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": true,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
},
|
||||
{
|
||||
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
|
||||
"kind": "updated",
|
||||
"fields": [
|
||||
"value",
|
||||
"expiration"
|
||||
],
|
||||
"key_pattern": "investemoz-cache-illuminate:queue:restart",
|
||||
"is_queue_restart_key": true,
|
||||
"expiration_unchanged": false,
|
||||
"throttle_timer_pair": false,
|
||||
"same_value_home_cache_expiry_refresh": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"sessions": {
|
||||
"before_rows": 17,
|
||||
"after_rows": 20,
|
||||
"changes": [
|
||||
{
|
||||
"key_sha256": "5b744c29cc4e8a7d20f33814b52fa522e2c04dc525e7e82fa1c00e18ba91d528",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": false,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "26b9b547d6b141fc234b6ea7dac11a679e4bcc54771dfccfcd48a0a5e5abd472",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
},
|
||||
{
|
||||
"key_sha256": "db3bcd670b9bafa55a0eb8069cdb3687fd0b7af8640fb4dc464c8adda4aaeccb",
|
||||
"kind": "added",
|
||||
"fields": [
|
||||
"id",
|
||||
"ip_address",
|
||||
"user_agent",
|
||||
"payload",
|
||||
"last_activity"
|
||||
],
|
||||
"anonymous_user": true,
|
||||
"delivery_user_agent": true,
|
||||
"expired_before_comparison": false,
|
||||
"session_lifetime_minutes": 120,
|
||||
"anonymous_public_request_logged": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"business_tables_to_confirm_separately": 172,
|
||||
"active_data_writes_by_comparison": 0,
|
||||
"restore_network": "none"
|
||||
},
|
||||
"public": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T12:39:22.332516+00:00",
|
||||
"manifest_sha256": "ce3110f77afcaefb5943e50fff77cc8feb34b4c1af20aea1fb64602ffa739264"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"IRPC-normal-adjustments/11": [
|
||||
"assets/project-dossier-BFw3okex.js"
|
||||
],
|
||||
"Preparar CBF16 com duodécimos": [
|
||||
"assets/services-BDq13GEq.js"
|
||||
],
|
||||
"CBF16 — duodécimos reutilizados de L6": [
|
||||
"assets/project-dossier-BFw3okex.js"
|
||||
],
|
||||
"Suporte dos duodécimos CBF16": [
|
||||
"assets/services-BDq13GEq.js"
|
||||
],
|
||||
"Manter preparação anual CBF16": [
|
||||
"assets/services-BDq13GEq.js"
|
||||
],
|
||||
"CBF16 por duodécimos — ": [
|
||||
"assets/project-dossier-BFw3okex.js"
|
||||
],
|
||||
"diferença adicional:": [
|
||||
"assets/project-dossier-BFw3okex.js"
|
||||
],
|
||||
"IRPC-normal-adjustments/10": [
|
||||
"assets/project-dossier-BFw3okex.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/project-dossier-document-BE3GlToo.js",
|
||||
"status": 200,
|
||||
"sha256": "ff2cddc6e148022c6358910dc7bc3deb002887fc9851c2a46bb2ce69b9c39aaa"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-BFw3okex.js",
|
||||
"status": 200,
|
||||
"sha256": "7d7263d2fb030111d5ea842eb0ee8b98565e9208b6c8ad7dfd4ff58e4a4b1346"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
},
|
||||
{
|
||||
"file": "assets/services-BDq13GEq.js",
|
||||
"status": 200,
|
||||
"sha256": "05d13e2e1f454db1f6430de4882468ade75f130b3044f781e68853e4367a1732"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-C9i2PsI1.js",
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only installedrevision/manifest/newcompiledcatalogueandreaders/simulatorentry;acceptedQAproofsreused"
|
||||
},
|
||||
"pipeline": {
|
||||
"service": "ExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"latest_report": {
|
||||
"status": "installed",
|
||||
"commit": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"release": "/var/www/investmoz-homologacao/releases/0bd5d495505d512088887efd3dc5c61f645b1647-ad28558b",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0,
|
||||
"requested_commits": [
|
||||
"0bd5d495505d512088887efd3dc5c61f645b1647"
|
||||
],
|
||||
"finished_at": "2026-10-26T12:39:25.297008+00:00"
|
||||
},
|
||||
"log_file": "1793018162607468190.log",
|
||||
"summaries": [
|
||||
"OK (1 test, 3106 assertions)",
|
||||
"built in 30.45s",
|
||||
"OK (59 tests, 317 assertions)",
|
||||
"# tests 1022",
|
||||
"# pass 1022",
|
||||
"# fail 0"
|
||||
],
|
||||
"log_bytes": 290854
|
||||
},
|
||||
"accepted_QA_proofs_reused": {
|
||||
"frontend_new_tests": 15,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 89,
|
||||
"API_database": "simulator_fiscal_delta_20261021_test",
|
||||
"API_port": 55441,
|
||||
"API_identity_guard": true,
|
||||
"API_transaction_rollback": true,
|
||||
"API_to_report_cases": 5,
|
||||
"UI": {
|
||||
"actualComponent": true,
|
||||
"explicitOptionalMonthlyDoesNotEditAssets": true,
|
||||
"cancelPreservesDeliveredAnnual": true,
|
||||
"missingSupportPreservesNormalReference": true,
|
||||
"L6TimingEditedAndReused": true,
|
||||
"quota75LimitedTo60Additional10": true,
|
||||
"OctoberUses3MonthsAdditional12_50": true,
|
||||
"exactFraction25over6": true,
|
||||
"saveRecoveryDownload": true,
|
||||
"negativeAbsenceDistinct": true,
|
||||
"finalL8Unknown": true,
|
||||
"errors": []
|
||||
},
|
||||
"Wayfinder_with_form_generated": true,
|
||||
"typescript_noEmit": true,
|
||||
"QA_build": true,
|
||||
"unaffected_functional_suites_repeated": false
|
||||
},
|
||||
"demonstrated_example": {
|
||||
"normal_quota_MZN": "50",
|
||||
"CBF16_quota_MZN": "75",
|
||||
"deduction_after_accounting_cap_MZN": "60",
|
||||
"additional_deduction_MZN": "10",
|
||||
"colecta_simulated_MZN": "2016",
|
||||
"final_balance": "L8_not_calculated"
|
||||
},
|
||||
"next_compatible_QA_scope": "CBF16 for a resident beginning activity during2026:documented short period and monthly asset timing reused from L6;explicit scope;no cessation/transition/priorquotas/cumulation",
|
||||
"L7_partial": true,
|
||||
"L6_and_first_L7_treatments_preserved": true,
|
||||
"L8_final_settlement_separate": true,
|
||||
"SGF_affected": false,
|
||||
"cleanup_executed": false,
|
||||
"new_private_synthetic_writes_on_active": 0,
|
||||
"evidence": {
|
||||
"backup.txt": "08e14e4dc56973954fdafb3ecca8fb586894e6d50188a0c450f714cc69bd442a",
|
||||
"baseline.txt": "3838c6d8327fe90ef9f5e19dacaf9c2fcdd61f44d95127520a61da09399bd81c",
|
||||
"capacity-after-backup.txt": "347647d26d78d4da2c21602f7ca9d58dbfdacf987af1a3dda8d13595790e0f58",
|
||||
"installed-protected.txt": "d7c47360d40bcf1380ba419dbf55cffb84651bf11b3b073547328bfee0c76cb5",
|
||||
"installed-public-delta.json": "1a882e238d57af6b7d8b551905011e39e8d5ade96852aeddca7e6c2e76df2df8",
|
||||
"installed-public.txt": "d79a2ebea5691ed85fb432b3b5ec1e68fc83585431b86caa22b8c07f64e6b852",
|
||||
"integration.txt": "58473f88aadc2f40d0cb1f6cafc4bad5f19a74fd94fced4007150c8bc4e72033",
|
||||
"manifest-served.json": "ce3110f77afcaefb5943e50fff77cc8feb34b4c1af20aea1fb64602ffa739264",
|
||||
"operational-delta.txt": "ec794652c7de2e71ee3126d741c330961cde9b123477185c1f9bdb5b530b9afb",
|
||||
"preflight.txt": "1bb024b6c1d66fc07ae0a181961729d4af532d3c51570c1aec06ca5b0039033a",
|
||||
"preparation.json": "22c21051049a495d3aa98c83c3faaddad6ddd0200489647bb137cb5c7fdb5bcc",
|
||||
"progress-1.txt": "4556381c15abcb5c96d6b675f328b6ee9baa20e9e83495becc58106a224dcaed",
|
||||
"progress-2.txt": "c882b2b1c75e7e462f59b97fb4b4d570d772fb331c4d4676a660d94619b8c778",
|
||||
"progress-3.txt": "1e02bd58bf4477f0573cecdcec6ec086820401a2628a02df7518a969d7115dc1",
|
||||
"restore.txt": "7f987653a5a41b4e586bb88247548a3e4ab1ef94080fbef4d448dc2e249e1baa",
|
||||
"schema-permissions-after.txt": "76b5a4d8af11e4898a205062766cfb7ab6ec0783200e77e60a1927aa1ca18597",
|
||||
"schema-permissions-before.txt": "0ab7c964792acdd8917bce256c472e55e034b103500a58b49f020b5084823ed7",
|
||||
"status-final.txt": "3353b0b2e359627d9987fff4df576b5c466ba903235d60bbc40feac5d8082efa"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,527 @@
|
||||
{
|
||||
"status": "CBF16_monthly_QA_prepared_not_installed",
|
||||
"date": "2026-10-26",
|
||||
"branch": "codex/irpc-l7-months-qa-20261026",
|
||||
"QA_workspace_reused_without_deleting_old_proofs": "C:\\laragon\\www\\portal-investidor-irpc-l7-common-qa-20261026",
|
||||
"installed_baseline": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"documentation_baseline": "aed020d19eff800ac970ac43b7e0b7a157df5486",
|
||||
"version": "IRPC-normal-adjustments/11",
|
||||
"optional_input": "special.acceleration.monthly version1 and explicit reference;no automatic date/value changes",
|
||||
"delivered_version10_keys_models_histories_preserved": true,
|
||||
"runtime_delta": {
|
||||
"resources/js/lib/irpc-special.ts": "a6efbece159a118c5900a6c0d1ebd7b57091b62853c0ad589538546b377aa184",
|
||||
"resources/js/lib/irpc-normal.ts": "f21868298d050c72149bcc814858123cb5c7320a93399b30c994b09b5117087c",
|
||||
"resources/js/components/simulation-irpc-special.tsx": "da8160778c75935e8b7061ed5722616240189be818e1e04f5711d5b14ec6672d"
|
||||
},
|
||||
"L6_depreciation_engine_unchanged": true,
|
||||
"cases_recovered": {
|
||||
"monthly": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "10096",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "6300",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "6300",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "2016",
|
||||
"denominator": "1"
|
||||
},
|
||||
"additional_deduction": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"status": "calculated",
|
||||
"monthly": {
|
||||
"input": {
|
||||
"version": 1,
|
||||
"reference": "QA opção de duodécimos desde a entrada emuso,datas/meses do mesmo activoL6"
|
||||
},
|
||||
"period": {
|
||||
"kind": "calendar",
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-12-31",
|
||||
"reference": "QA doze meses do plano correspondem ao ano civil completo",
|
||||
"pending": []
|
||||
},
|
||||
"source": "CBF16 com Decreto72/2013 art9:taxa normal máxima ×1,5 ×duodécimos/12,meses reutilizados do mapaL6. Exercício anual civil2026,entrada emuso no ano,método constante,sem saída/quotas anteriores/cumulação. Dedução limitada ao contabilizado elegível e saldo fiscal;apenas diferença adicional,não nova amortização contabilística.",
|
||||
"assets": [
|
||||
{
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2026-07-15",
|
||||
"months": 6,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalQuota": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedQuota": {
|
||||
"numerator": "75",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": {
|
||||
"numerator": "60",
|
||||
"denominator": "1"
|
||||
},
|
||||
"additionalDeduction": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"applied": true,
|
||||
"reason": "Activo existente elegível;taxa normal ×1,5,com limite contabilístico e saldo fiscal."
|
||||
}
|
||||
]
|
||||
},
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"fraction": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "19055",
|
||||
"denominator": "3"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "19055",
|
||||
"denominator": "3"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "30488",
|
||||
"denominator": "15"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "12695",
|
||||
"denominator": "2"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "12695",
|
||||
"denominator": "2"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "10156",
|
||||
"denominator": "5"
|
||||
},
|
||||
"additional_deduction": {
|
||||
"numerator": "25",
|
||||
"denominator": "6"
|
||||
},
|
||||
"status": "calculated",
|
||||
"monthly": {
|
||||
"input": {
|
||||
"version": 1,
|
||||
"reference": "QA opção de duodécimos desde a entrada emuso,datas/meses do mesmo activoL6"
|
||||
},
|
||||
"period": {
|
||||
"kind": "calendar",
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-12-31",
|
||||
"reference": "QA doze meses do plano correspondem ao ano civil completo",
|
||||
"pending": []
|
||||
},
|
||||
"source": "CBF16 com Decreto72/2013 art9:taxa normal máxima ×1,5 ×duodécimos/12,meses reutilizados do mapaL6. Exercício anual civil2026,entrada emuso no ano,método constante,sem saída/quotas anteriores/cumulação. Dedução limitada ao contabilizado elegível e saldo fiscal;apenas diferença adicional,não nova amortização contabilística.",
|
||||
"assets": [
|
||||
{
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2026-12-15",
|
||||
"months": 1,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": {
|
||||
"numerator": "15",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalQuota": {
|
||||
"numerator": "25",
|
||||
"denominator": "3"
|
||||
},
|
||||
"acceleratedQuota": {
|
||||
"numerator": "25",
|
||||
"denominator": "2"
|
||||
},
|
||||
"normalDeduction": {
|
||||
"numerator": "25",
|
||||
"denominator": "3"
|
||||
},
|
||||
"acceleratedDeduction": {
|
||||
"numerator": "25",
|
||||
"denominator": "2"
|
||||
},
|
||||
"additionalDeduction": {
|
||||
"numerator": "25",
|
||||
"denominator": "6"
|
||||
},
|
||||
"applied": true,
|
||||
"reason": "Activo existente elegível;taxa normal ×1,5,com limite contabilístico e saldo fiscal."
|
||||
}
|
||||
]
|
||||
},
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"missing": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "10096",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": null,
|
||||
"L7_base": null,
|
||||
"L7_colecta": null,
|
||||
"additional_deduction": null,
|
||||
"status": "indeterminate",
|
||||
"monthly": {
|
||||
"input": {
|
||||
"version": 1,
|
||||
"reference": ""
|
||||
},
|
||||
"period": {
|
||||
"kind": "calendar",
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-12-31",
|
||||
"reference": "QA doze meses do plano correspondem ao ano civil completo",
|
||||
"pending": []
|
||||
},
|
||||
"source": "CBF16 com Decreto72/2013 art9:taxa normal máxima ×1,5 ×duodécimos/12,meses reutilizados do mapaL6. Exercício anual civil2026,entrada emuso no ano,método constante,sem saída/quotas anteriores/cumulação. Dedução limitada ao contabilizado elegível e saldo fiscal;apenas diferença adicional,não nova amortização contabilística.",
|
||||
"assets": [
|
||||
{
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2026-07-15",
|
||||
"months": 6,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": null,
|
||||
"normalQuota": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedQuota": null,
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": null,
|
||||
"additionalDeduction": null,
|
||||
"applied": false,
|
||||
"reason": "Falta suporte da reutilização dos meses e da opção por duodécimosCBF16 no mapaL6."
|
||||
}
|
||||
]
|
||||
},
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"negative": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "10096",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "10096",
|
||||
"denominator": "5"
|
||||
},
|
||||
"additional_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"status": "calculated",
|
||||
"monthly": {
|
||||
"input": {
|
||||
"version": 1,
|
||||
"reference": "QA opção de duodécimos desde a entrada emuso,datas/meses do mesmo activoL6"
|
||||
},
|
||||
"period": {
|
||||
"kind": "calendar",
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-12-31",
|
||||
"reference": "QA doze meses do plano correspondem ao ano civil completo",
|
||||
"pending": []
|
||||
},
|
||||
"source": "CBF16 com Decreto72/2013 art9:taxa normal máxima ×1,5 ×duodécimos/12,meses reutilizados do mapaL6. Exercício anual civil2026,entrada emuso no ano,método constante,sem saída/quotas anteriores/cumulação. Dedução limitada ao contabilizado elegível e saldo fiscal;apenas diferença adicional,não nova amortização contabilística.",
|
||||
"assets": [
|
||||
{
|
||||
"id": "accelerated1",
|
||||
"assetId": "server",
|
||||
"assetKey": "asset-server",
|
||||
"description": "Máquina industrial existente QA",
|
||||
"start": "2026-07-15",
|
||||
"months": 6,
|
||||
"taxBasis": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"normalRate": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedRate": null,
|
||||
"normalQuota": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedQuota": null,
|
||||
"normalDeduction": {
|
||||
"numerator": "50",
|
||||
"denominator": "1"
|
||||
},
|
||||
"acceleratedDeduction": null,
|
||||
"additionalDeduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"applied": false,
|
||||
"reason": "Condição negativa documentada;quota normal mantida."
|
||||
}
|
||||
]
|
||||
},
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"absent": {
|
||||
"L6_reference": {
|
||||
"taxableProfit": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"taxableBase": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"colecta": {
|
||||
"numerator": "10096",
|
||||
"denominator": "5"
|
||||
}
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "6310",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "10096",
|
||||
"denominator": "5"
|
||||
},
|
||||
"additional_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"status": "absent",
|
||||
"monthly": {
|
||||
"input": {
|
||||
"version": 1,
|
||||
"reference": "QA opção de duodécimos desde a entrada emuso,datas/meses do mesmo activoL6"
|
||||
},
|
||||
"period": {
|
||||
"kind": "calendar",
|
||||
"from": "2026-01-01",
|
||||
"to": "2026-12-31",
|
||||
"reference": "QA doze meses do plano correspondem ao ano civil completo",
|
||||
"pending": []
|
||||
},
|
||||
"source": "CBF16 com Decreto72/2013 art9:taxa normal máxima ×1,5 ×duodécimos/12,meses reutilizados do mapaL6. Exercício anual civil2026,entrada emuso no ano,método constante,sem saída/quotas anteriores/cumulação. Dedução limitada ao contabilizado elegível e saldo fiscal;apenas diferença adicional,não nova amortização contabilística.",
|
||||
"assets": []
|
||||
},
|
||||
"final_balance": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"frontend_new_tests": 15,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 89,
|
||||
"API_database": "simulator_fiscal_delta_20261021_test",
|
||||
"API_port": 55441,
|
||||
"API_identity_guard": true,
|
||||
"API_transaction_rollback": true,
|
||||
"API_to_report_cases": 5,
|
||||
"UI": {
|
||||
"actualComponent": true,
|
||||
"explicitOptionalMonthlyDoesNotEditAssets": true,
|
||||
"cancelPreservesDeliveredAnnual": true,
|
||||
"missingSupportPreservesNormalReference": true,
|
||||
"L6TimingEditedAndReused": true,
|
||||
"quota75LimitedTo60Additional10": true,
|
||||
"OctoberUses3MonthsAdditional12_50": true,
|
||||
"exactFraction25over6": true,
|
||||
"saveRecoveryDownload": true,
|
||||
"negativeAbsenceDistinct": true,
|
||||
"finalL8Unknown": true,
|
||||
"errors": []
|
||||
},
|
||||
"Wayfinder_with_form_generated": true,
|
||||
"typescript_noEmit": true,
|
||||
"QA_build": true,
|
||||
"unaffected_functional_suites_repeated": false
|
||||
},
|
||||
"preservation": {
|
||||
"tracked_files_compared": 1006,
|
||||
"unchanged": 1003,
|
||||
"protected_code_schema_config_routes_contract_files": 584,
|
||||
"original_files": {
|
||||
"docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973",
|
||||
"docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57",
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063",
|
||||
"docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee",
|
||||
"docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5",
|
||||
"docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358",
|
||||
"docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b",
|
||||
"docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d",
|
||||
"docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899",
|
||||
"docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee",
|
||||
"docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53",
|
||||
"docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121",
|
||||
"docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
},
|
||||
"active_writes": 0,
|
||||
"migrations": 0,
|
||||
"imports": 0,
|
||||
"configuration_or_permission_changes": false,
|
||||
"SGF_affected": false
|
||||
},
|
||||
"sources_reused": {
|
||||
"inventory_files": 8143,
|
||||
"evidence_receipts": [
|
||||
"irpc-l6-depreciation-qa-20261026.json",
|
||||
"irpc-l7-scope-20261026.json",
|
||||
"irpc-l7-common-qa-20261026.json"
|
||||
],
|
||||
"rules": "CBF16 and Decreto72/2013 art3(3)/9;same L6 monthly timing/maximum normal rate/accounting caps",
|
||||
"broad_research_repeated": false
|
||||
},
|
||||
"remaining_scope": [
|
||||
"short/noncivil fiscal periods and exits",
|
||||
"lateryears/priorquotas/selected lower rate/decliningmethod",
|
||||
"rehabilitated/used/revalued/unmappedassets",
|
||||
"benefitcumulation,cooperative+CBF16 and other L7 families",
|
||||
"L7 official M20/M22 field transport"
|
||||
],
|
||||
"resume_condition": "Case-specific rule/period/accounting/compatibility and existing evidence linked,then only new effects demonstrated;L6 dependency limits its asset only",
|
||||
"delivery_prepared_only": true,
|
||||
"remote_capacity_before_next_installation": {
|
||||
"last_observed": "2026-10-26T13:56:51.412248+02:00",
|
||||
"historical_available_bytes": 5922545664,
|
||||
"historical_available_inodes": 21448231,
|
||||
"existing_pipeline_guard_bytes": 5368709120,
|
||||
"mandatory_fresh_check_for_build_and_new_backup": true,
|
||||
"backup_restore_fresh_required": true,
|
||||
"main_compatibility_recheck_required": true,
|
||||
"active_release_preserved_until_ready": true,
|
||||
"no_local_or_SGF_cleanup_dependency": true
|
||||
},
|
||||
"L7_partial": true,
|
||||
"L8_final_balance_separate": true,
|
||||
"evidence_directory": "outputs/irpc-l7-months"
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"status": "L6_operational_demonstrated_scope_accepted_L7_delimited_not_implemented",
|
||||
"recorded_date": "2026-10-26",
|
||||
"authority": {
|
||||
"origin": "express_user_instruction",
|
||||
"decision": "L6 operacional no âmbito demonstrado, com limitações explícitas; delimitar L7; L8 conserva liquidação final",
|
||||
"new_generic_approval_required": false
|
||||
},
|
||||
"baseline": {
|
||||
"installed_commit": "5aaf1a56f9d928331364fcc8b0d1528e51dba327",
|
||||
"reused_delivery_receipt": "irpc-l6-values-forms-delivery-20261026.json",
|
||||
"documentation_parent": "45fd591c7faa765f33de0a0b9000c3ceb4057abe",
|
||||
"root_documentation_parent": "31651a76b11ed50576c52cd274e3c59cda0f8924"
|
||||
},
|
||||
"L6": {
|
||||
"operational_scope_accepted": true,
|
||||
"integrally_complete": false,
|
||||
"existing_code_pending_groups": 5,
|
||||
"existing_documentary_pending_groups": 5,
|
||||
"pending_list": "same matrix/manual: saldo consolidado de L6",
|
||||
"old_pending_decision_records_preserved_as_history": true,
|
||||
"dependent_cases_only_blocked": true,
|
||||
"accepted_proofs_reused": true
|
||||
},
|
||||
"L7": {
|
||||
"state": "delimited; no new executable treatment",
|
||||
"context_reused": [
|
||||
"opportunity/dossier snapshots",
|
||||
"sector and territorial IDs/labels/provenance",
|
||||
"subject/NUIT/residence/EP/period",
|
||||
"business_plan_snapshot",
|
||||
"modelo_a_snapshot.irpcNormal versions",
|
||||
"asset and expense IDs/previous quotas",
|
||||
"exact rational values and demonstrated form mappings"
|
||||
],
|
||||
"location_grants_benefit": false,
|
||||
"effect_types": [
|
||||
"profit_adjustment",
|
||||
"taxable_base_deduction",
|
||||
"rate_by_eligible_parcel",
|
||||
"separate_autonomous_tax",
|
||||
"potential_credit_entitlement_for_L8"
|
||||
],
|
||||
"families": [
|
||||
"61(4) expenses autonomous tax",
|
||||
"61-A capital gains autonomous tax from2026",
|
||||
"CIRPC9–14 entity exemptions/cooperative12",
|
||||
"CBF16 accelerated depreciation",
|
||||
"CBF17–19 deductions/magnifications",
|
||||
"CBF15 potential investment credit; annual use L8",
|
||||
"CBF sector/territory specific provisions",
|
||||
"special operations54–56/41-A and specifically mapped sector regimes"
|
||||
],
|
||||
"first_increment": [
|
||||
"common qualification, provenance, period and separate effects",
|
||||
"61(4) expense35% with existing36g addback, no duplicate",
|
||||
"missing-information and negative-condition cases"
|
||||
],
|
||||
"next_compatible_cases": [
|
||||
"cooperative12 eligible parcel",
|
||||
"CBF16 supported asset and reconciled prior quotas"
|
||||
],
|
||||
"not_implemented_yet": [
|
||||
"specific qualification/persistence",
|
||||
"new treatment calculations and per-parcel reconciliation",
|
||||
"treatment-specific reporting/exports"
|
||||
],
|
||||
"documentary_pending_scope": "Only individual status/title where required, parcel/limit/chronology, unmapped specific sector norm or affected form edition/field; examples and resume conditions in same matrix/manual",
|
||||
"historical_mutation_permitted": false
|
||||
},
|
||||
"L8": {
|
||||
"retentions_payments_annual_credit_application_final_settlement": true,
|
||||
"final_balance_calculated": false
|
||||
},
|
||||
"source_inventory": {
|
||||
"reused_inventory": "C:\\laragon\\www\\portal-investidor\\outputs\\ispc-l4a-20261025\\preservation-before-tests.json",
|
||||
"files": 8143,
|
||||
"fresh_broad_scan": false,
|
||||
"sources": [
|
||||
{
|
||||
"id": "CIRPC",
|
||||
"title": "Lei34/2007",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\Lei-34-2007-BR52.pdf",
|
||||
"bytes": 1676884,
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"references": "PDF5/p768(59):12,14,15; PDF15–16:54–56; PDF17/p768(71):61",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "IRPC-2026",
|
||||
"title": "Lei12/2025",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\BR-248-I-Suplemento-1-2025.pdf",
|
||||
"bytes": 440018,
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"references": "PDF18–20; PDF20:art2/61-A,art3,art6; vigência01/01/2026",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "IRPC-2022",
|
||||
"title": "Lei20/2022",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\docs\\investmoz\\simulations\\source-archive\\BR252-I-Serie-2022-Lei20-PESOE.pdf",
|
||||
"bytes": 17966640,
|
||||
"sha256": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"references": "PDF1/p2731:61(2), termo31/12/2025",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "CBF-local",
|
||||
"title": "Lei4/2009",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\CBF-Lei4-2009-APIEX.pdf",
|
||||
"bytes": 10998765,
|
||||
"sha256": "4231a5b6783e603cedb98992f3e93ecaf1c1d5be341b093560cf2fdd0845b0dc",
|
||||
"references": "Original local disponível; scan sem extracção textual útil; cotejo textual pela compilação oficial",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false,
|
||||
"authorised_original": "\\\\Mac\\Home\\Documents\\TEMPO\\Portal Tempo\\Legislacao\\Apiex\\3.-Lei-no4-2009-de-12-de-Janeiro-Codigo-dos-Beneficios-Fiscais.pdf"
|
||||
},
|
||||
{
|
||||
"id": "APIEX",
|
||||
"title": "Compilação oficial APIEX",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\APIEX-legislacao-investimentos-2025.pdf",
|
||||
"bytes": 6467655,
|
||||
"sha256": "ba1e9eaabfec5d0c4cb2d9f2444a6860f7a90f222034764197829be402d408ed",
|
||||
"references": "pp8–32:Lei8/2023; pp36–59:Decreto8/2024; pp64–92:CBF4/2009; p68:9/10;p71–74:15–19",
|
||||
"official_url": "https://pt.apiex.gov.mz/wp-content/uploads/2025/02/LEGISLACAO-DE-INVESTIMENTOS-EM-MOCAMBIQUE.pdf",
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
},
|
||||
{
|
||||
"id": "RCBF",
|
||||
"title": "Decreto56/2009",
|
||||
"exemplar": "C:\\laragon\\www\\portal-investidor-irpc-l7-scope-20261026\\outputs\\irpc-l7-scope\\Decreto56-2009-BR40.pdf",
|
||||
"bytes": 422005,
|
||||
"sha256": "6ea1b8d93daed48c6d590481d874010fa1708211d8f27c319dc9a31328456017",
|
||||
"references": "Procedimento já cotejado em iva-l1-p084-p085-model-i1-cotejo-20261024.json; não estende isenções IVA a IRPC",
|
||||
"official_url": null,
|
||||
"available_for_consultation": true,
|
||||
"documentary_status": "official_source_accepted; applicability/version/period_per_treatment",
|
||||
"new_calculation_activation": false
|
||||
}
|
||||
],
|
||||
"rendered_pages_reviewed": [
|
||||
"CIRPC PDF5",
|
||||
"CIRPC PDF17",
|
||||
"APIEX PDF68",
|
||||
"APIEX PDF72",
|
||||
"Lei12/2025 PDF20"
|
||||
],
|
||||
"no_period_extension_presumed": "61(2) Law20/2022 ends31/12/2025; no automatic2026 rate",
|
||||
"availability_is_not_rule_activation": true
|
||||
},
|
||||
"preservation": {
|
||||
"source_archive_files": {
|
||||
"docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57",
|
||||
"docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b",
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063",
|
||||
"docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee",
|
||||
"docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5",
|
||||
"docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358",
|
||||
"docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b",
|
||||
"docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d",
|
||||
"docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899",
|
||||
"docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee",
|
||||
"docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53",
|
||||
"docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121",
|
||||
"docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
},
|
||||
"source_archive_count": 31,
|
||||
"root_existing_source_files": 28,
|
||||
"root_preexisting_branch_absences": [
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf"
|
||||
],
|
||||
"root_absences_introduced_by_this_change": false,
|
||||
"runtime_schema_config_permissions_changed": false,
|
||||
"active_writes": 0,
|
||||
"migrations": 0,
|
||||
"imports": 0,
|
||||
"deployment": false,
|
||||
"functional_tests_repeated": false,
|
||||
"existing_accepted_proofs_reused": true
|
||||
},
|
||||
"validation": {
|
||||
"expected_tracked_delta": [
|
||||
"docs/investmoz/consolidated-review-matrix-2026-10-03.md",
|
||||
"docs/investmoz/unification/traceability-and-manual.md",
|
||||
"docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv",
|
||||
"docs/investmoz/simulations/irpc-l7-scope-20261026.json"
|
||||
],
|
||||
"csv_only_changed_id": "AUD-SIM-INT02",
|
||||
"scope_present_in_existing_matrix_and_manual": true,
|
||||
"new_backlog_created": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,270 @@
|
||||
{
|
||||
"status": "L7_installed_reconfirmed_not_reinstalled",
|
||||
"checked_at_UTC": "2026-10-26T11:56:51.412248+00:00",
|
||||
"checked_at_Africa_Johannesburg": "2026-10-26T13:56:51.412248+02:00",
|
||||
"main": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"QA_origin": "ab2ff2fdbcbe6fb94f03e4bc4cc7ccbd647d94fc",
|
||||
"installed_commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"previous_delivery_receipt": "irpc-l7-common-delivery-20261026.json",
|
||||
"server_read_only": {
|
||||
"checked_at_UTC": "2026-10-26T11:56:51.412248+00:00",
|
||||
"read_only": true,
|
||||
"installed": {
|
||||
"status": "installed",
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0
|
||||
},
|
||||
"release_revision": {
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T11:02:32.435267+00:00",
|
||||
"manifest_sha256": "d78a1bdb503c10849f5ea8d8879753653c2c2fc22f6182f6d68ec9f6adf635b5"
|
||||
},
|
||||
"latest_report": {
|
||||
"status": "installed",
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"release": "/var/www/investmoz-homologacao/releases/e07f89da3d59d06aa1b8c50c22a478b7b167bfdd-6b82c3f2",
|
||||
"previous_release": "/var/www/investmoz-homologacao/releases/5aaf1a56f9d928331364fcc8b0d1528e51dba327-c1543f3e",
|
||||
"database_migrations": 0,
|
||||
"content_imports": 0,
|
||||
"requested_commits": [
|
||||
"e07f89da3d59d06aa1b8c50c22a478b7b167bfdd"
|
||||
],
|
||||
"finished_at": "2026-10-26T11:02:35.885260+00:00"
|
||||
},
|
||||
"service": "ExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
|
||||
"volumes": [
|
||||
{
|
||||
"path": "/var/www/investmoz-homologacao/releases",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"total_bytes": 467909804032,
|
||||
"available_bytes": 5922545664,
|
||||
"total_inodes": 29089792,
|
||||
"available_inodes": 21448231
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/investmoz-deploy",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"total_bytes": 467909804032,
|
||||
"available_bytes": 5922545664,
|
||||
"total_inodes": 29089792,
|
||||
"available_inodes": 21448231
|
||||
},
|
||||
{
|
||||
"path": "/var/backups",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"total_bytes": 467909804032,
|
||||
"available_bytes": 5922545664,
|
||||
"total_inodes": 29089792,
|
||||
"available_inodes": 21448231
|
||||
},
|
||||
{
|
||||
"path": "/tmp",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"total_bytes": 467909804032,
|
||||
"available_bytes": 5922545664,
|
||||
"total_inodes": 29089792,
|
||||
"available_inodes": 21448231
|
||||
},
|
||||
{
|
||||
"path": "/var/lib/docker",
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"device": 2306,
|
||||
"total_bytes": 467909804032,
|
||||
"available_bytes": 5922545664,
|
||||
"total_inodes": 29089792,
|
||||
"available_inodes": 21448231
|
||||
}
|
||||
],
|
||||
"existing_pipeline_space_guard_excerpt": [
|
||||
" self.releases.mkdir(parents=True,exist_ok=True)",
|
||||
" if shutil.disk_usage(self.releases).free < 5 * 1024**3:",
|
||||
" raise RuntimeError('Insufficient free space for an isolated build; active release preserved')",
|
||||
" release=self.releases/(target+'-'+uuid.uuid4().hex[:8]);release.mkdir(mode=0o750)"
|
||||
],
|
||||
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"L7_delta_hashes_match": {
|
||||
"resources/js/components/simulation-irpc-normal.tsx": true,
|
||||
"resources/js/components/simulation-irpc-special.tsx": true,
|
||||
"resources/js/lib/irpc-normal-depreciation.ts": true,
|
||||
"resources/js/lib/irpc-normal.ts": true,
|
||||
"resources/js/lib/irpc-special.ts": true,
|
||||
"resources/js/lib/project-dossier-report.ts": true
|
||||
},
|
||||
"installed_release_nonlinked_files": 28674,
|
||||
"installed_release_nonlinked_directories": 2503,
|
||||
"inode_requirement_note": "Current release file/directory counts are an observed reference,not a guarantee for another build;no new inode threshold introduced.",
|
||||
"prior_installation_backup": {
|
||||
"created_at": "2026-10-26T10:55:59Z",
|
||||
"tables": 174,
|
||||
"files": 369,
|
||||
"dump_sha256": "a3d46de6c10b37bd6f211125686da8c489f879ab243f082e7b72a397638901f9",
|
||||
"restore": {
|
||||
"restore_verified": true,
|
||||
"tables_verified": 174,
|
||||
"container_network": "none",
|
||||
"database": "irpc_l7_restore_20261026",
|
||||
"port": 55441,
|
||||
"source_dump_sha256": "a3d46de6c10b37bd6f211125686da8c489f879ab243f082e7b72a397638901f9",
|
||||
"active_database_writes": 0
|
||||
},
|
||||
"files_present": {
|
||||
"database.dump": {
|
||||
"present": true,
|
||||
"bytes": 22880589
|
||||
},
|
||||
"files-before.tar.gz": {
|
||||
"present": true,
|
||||
"bytes": 153036740
|
||||
},
|
||||
"backup-receipt.json": {
|
||||
"present": true,
|
||||
"bytes": 94539
|
||||
},
|
||||
"restore-receipt.json": {
|
||||
"present": true,
|
||||
"bytes": 269
|
||||
}
|
||||
}
|
||||
},
|
||||
"new_backup_or_restore_executed": false,
|
||||
"deployment_executed": false,
|
||||
"cleanup_executed": false,
|
||||
"active_data_writes": 0
|
||||
},
|
||||
"capacity_assessment": {
|
||||
"mount": "/dev/md2 / ext4",
|
||||
"existing_pipeline_guard_bytes": 5368709120,
|
||||
"available_bytes": 5922545664,
|
||||
"available_inodes": 21448231,
|
||||
"total_inodes": 29089792,
|
||||
"same_partition_for_release_state_backup_tmp_docker": true,
|
||||
"observed_existing_backup_files_bytes": 176012137,
|
||||
"available_minus_guard_and_one_observed_backup_bytes": 377824407,
|
||||
"existing_space_guard_plus_observed_backup_satisfied": true,
|
||||
"inode_reference_files_plus_directories": 31177,
|
||||
"inode_note": "Available21million vs31thousand entries in current nonlinked release;no new arbitrary threshold or guarantee for changed future payload",
|
||||
"new_deployment_needed": false
|
||||
},
|
||||
"existing_backup_integrity": {
|
||||
"backup_created_at": "2026-10-26T10:55:59Z",
|
||||
"existing_dump_hash_matches": true,
|
||||
"existing_files_archive_hash_matches": true,
|
||||
"accepted_restore_proof_matches_same_dump": true,
|
||||
"restored_tables": 174,
|
||||
"new_backup_or_restore_executed": false,
|
||||
"active_writes": 0
|
||||
},
|
||||
"public_delta": {
|
||||
"status": "installed_delta_verified",
|
||||
"served_revision": {
|
||||
"commit": "e07f89da3d59d06aa1b8c50c22a478b7b167bfdd",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T11:02:32.435267+00:00",
|
||||
"manifest_sha256": "d78a1bdb503c10849f5ea8d8879753653c2c2fc22f6182f6d68ec9f6adf635b5"
|
||||
},
|
||||
"manifest_hash_matches": true,
|
||||
"compiled_delta_markers": {
|
||||
"IRPC-normal-adjustments/10": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"Preparar qualificação L7": [
|
||||
"assets/services-BSj1SuMk.js"
|
||||
],
|
||||
"Despesas — imposto autónomo": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"Cooperativa — redução da taxa": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"Amortizações aceleradas": [
|
||||
"assets/project-dossier-KEyrPtc6.js",
|
||||
"assets/services-BSj1SuMk.js"
|
||||
],
|
||||
"novo ajustamento ao lucro:": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
],
|
||||
"colecta combinada:": [
|
||||
"assets/project-dossier-KEyrPtc6.js"
|
||||
]
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"file": "assets/project-dossier-KEyrPtc6.js",
|
||||
"status": 200,
|
||||
"sha256": "b6ae250a30b5030a6e40e7dfb140a3335ce6d5bc16835098d3d7c5828fc526c5"
|
||||
},
|
||||
{
|
||||
"file": "assets/simulation-form-BqVD91Ek.js",
|
||||
"status": 200,
|
||||
"sha256": "85cbd533c5bc92af5a448db71da006d4346d2d0adb09dde825db0aa19ad5048c"
|
||||
},
|
||||
{
|
||||
"file": "assets/services-BSj1SuMk.js",
|
||||
"status": 200,
|
||||
"sha256": "ea1a3812cbced72f4df115e8e379ae6d2307e97b2152d288b1c80d357f03f78b"
|
||||
},
|
||||
{
|
||||
"file": "assets/project-dossier-document-BRdhvWgC.js",
|
||||
"status": 200,
|
||||
"sha256": "5b1de561be552259de776a2dbaf4b49909a3edd2647fec7c296a96054c929a9f"
|
||||
}
|
||||
],
|
||||
"simulator_status": 200,
|
||||
"simulator_entry": "assets/app-ByAQSjfI.js",
|
||||
"synthetic_private_writes": 0,
|
||||
"method": "Read-only L7 revision/manifest/compiled delta/simulator entry;accepted functional proofs reused"
|
||||
},
|
||||
"accepted_proofs_reused": {
|
||||
"QA_frontend_tests": 19,
|
||||
"QA_API_assertions": 108,
|
||||
"QA_UI_types_build": true,
|
||||
"prior_installation_backup_restore_tables": 174,
|
||||
"prior_installation_files": 369,
|
||||
"prior_preservation_runtime_files": 50,
|
||||
"prior_originals": 31,
|
||||
"new_functional_round": false
|
||||
},
|
||||
"next_compatible_QA_scope": {
|
||||
"status": "delimited_for_next_QA_not_implemented",
|
||||
"treatment": "CBF16 constant-method depreciation by monthly fractions for supported new assets entering service during2026",
|
||||
"reuse": [
|
||||
"existing asset IDs/classification and maximum normal catalogue rates",
|
||||
"L6 monthly timing/financial source and normal reference result",
|
||||
"existing qualification/source/title/provenance and versioned book"
|
||||
],
|
||||
"first_case": "Civil annual2026,new supported industrial/agroindustrial machine or new project building entering service during the year;documented CBF eligibility,no previous quotas/no other benefits",
|
||||
"acceptance": [
|
||||
"normal vs accelerated quota and accounted/fiscal balance caps",
|
||||
"additional effect only,without second deduction or changes to original asset/history",
|
||||
"conditions true,false,missing and declared absence",
|
||||
"calculation-save-recover-report with profit/base/colecta effects and final L8 balance unknown"
|
||||
],
|
||||
"out_of_scope": [
|
||||
"declining method",
|
||||
"rehabilitated/used/revalued assets",
|
||||
"recovery of previous quotas",
|
||||
"cooperative+CBF16 or other benefit combinations",
|
||||
"unmapped official form fields"
|
||||
],
|
||||
"resume_condition": "Link already-demonstrated L6 monthly timing to qualified CBF16 rate increment,retain exact values/caps and prove only new effects in isolated QA;missing project evidence affects that asset only"
|
||||
},
|
||||
"remaining_L7_groups_preserved": {
|
||||
"implementation_groups": 7,
|
||||
"documentary_case_dependencies": 4,
|
||||
"section": "saldo concreto de L7 após a primeira entrega agrupada"
|
||||
},
|
||||
"L6_operational_scope_and_pending_preserved": true,
|
||||
"L7_integrally_complete": false,
|
||||
"L8_final_settlement_separate": true,
|
||||
"local_cleanup": false,
|
||||
"SGF_affected": false,
|
||||
"new_backup_restore_or_installation": false
|
||||
}
|
||||
@@ -0,0 +1,309 @@
|
||||
{
|
||||
"status": "QA_ready_not_installed",
|
||||
"date": "2026-10-26",
|
||||
"branch": "codex/irpc-l7-start-period-qa-20261026",
|
||||
"installed_baseline": "0bd5d495505d512088887efd3dc5c61f645b1647",
|
||||
"documentation_baseline": "eccd95f9e79c871b592839aceca5f968440d067d",
|
||||
"scope": "CBF16:resident start of activity,short complete-month period ending2026-12-31,new supported asset entering inperiod,constant maximum table rate,no priorquotas/exit/cumulation",
|
||||
"version": "IRPC-normal-adjustments/12",
|
||||
"explicit_optional_input": "acceleration.monthly.startPeriod version1/reference;without it versions10/11 retain keys/models/history",
|
||||
"runtime_delta": {
|
||||
"resources/js/lib/irpc-special.ts": "052bd703cdfd7fbb10ea8089146d5e52ea247d612ce557b1e2c9c20730600261",
|
||||
"resources/js/lib/irpc-normal.ts": "290d7d66621668d2b684850729c57c0435cce144acf0704f9fd9e1d4a6d491f3",
|
||||
"resources/js/components/simulation-irpc-special.tsx": "6f6b203062df36fedbdfa341bba8b8aa7796d2f3169f1bd84395ada8f71fd749"
|
||||
},
|
||||
"reused_L6_period_fx_and_depreciation_engines_unchanged": true,
|
||||
"cases_recovered": {
|
||||
"start": {
|
||||
"period": {
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "calculated",
|
||||
"additional_deduction": {
|
||||
"numerator": "10",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3120",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "4992",
|
||||
"denominator": "5"
|
||||
},
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"fraction": {
|
||||
"period": {
|
||||
"from": "2026-12-01",
|
||||
"to": "2026-12-31",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "1565",
|
||||
"denominator": "3"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "1565",
|
||||
"denominator": "3"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "2504",
|
||||
"denominator": "15"
|
||||
},
|
||||
"status": "calculated",
|
||||
"additional_deduction": {
|
||||
"numerator": "5",
|
||||
"denominator": "3"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "520",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "520",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "832",
|
||||
"denominator": "5"
|
||||
},
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"missing": {
|
||||
"period": {
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "indeterminate",
|
||||
"additional_deduction": null,
|
||||
"L7_profit": null,
|
||||
"L7_base": null,
|
||||
"L7_colecta": null,
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"negative": {
|
||||
"period": {
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "calculated",
|
||||
"additional_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
},
|
||||
"absent": {
|
||||
"period": {
|
||||
"from": "2026-07-01",
|
||||
"to": "2026-12-31",
|
||||
"pending": []
|
||||
},
|
||||
"L6_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L6_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"status": "absent",
|
||||
"additional_deduction": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_profit": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_base": {
|
||||
"numerator": "3130",
|
||||
"denominator": "1"
|
||||
},
|
||||
"L7_colecta": {
|
||||
"numerator": "5008",
|
||||
"denominator": "5"
|
||||
},
|
||||
"L8_final": {
|
||||
"scope": "L8",
|
||||
"payable": null,
|
||||
"recoverable": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"new_frontend_tests": 9,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 97,
|
||||
"API_database": "simulator_fiscal_delta_20261021_test",
|
||||
"API_host": "127.0.0.1",
|
||||
"API_port": 55441,
|
||||
"API_transaction_rollback": true,
|
||||
"wayfinder_with_form": true,
|
||||
"typescript": true,
|
||||
"isolated_build": true,
|
||||
"HTML_financial_dossier_from_5_API_recoveries": true,
|
||||
"actual_component": {
|
||||
"actualComponent": true,
|
||||
"explicitStartOptionAndCancel": true,
|
||||
"reuseL6PeriodEvidenceExplicit": true,
|
||||
"assetsAndPeriodUnchanged": true,
|
||||
"missingPreservesNormal1001_60": true,
|
||||
"sixActualMonths50Normal75Accelerated60Cap10Additional": true,
|
||||
"simulatedColecta998_40": true,
|
||||
"exactFraction5over3": true,
|
||||
"saveRecoveryDownload": true,
|
||||
"negativeAbsenceDistinct": true,
|
||||
"L8FinalUnknown": true,
|
||||
"errors": []
|
||||
}
|
||||
},
|
||||
"preservation": {
|
||||
"protected_code_schema_config_routes_contract_files": 584,
|
||||
"original_files": {
|
||||
"docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973",
|
||||
"docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57",
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063",
|
||||
"docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee",
|
||||
"docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5",
|
||||
"docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358",
|
||||
"docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b",
|
||||
"docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d",
|
||||
"docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899",
|
||||
"docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee",
|
||||
"docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53",
|
||||
"docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121",
|
||||
"docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
},
|
||||
"prior_result_and_entire_history_preserved": true,
|
||||
"plan_assets_and_other_tax_books_unchanged": true,
|
||||
"active_migrations": 0,
|
||||
"active_private_writes": 0,
|
||||
"SGF_TEMPO_touched": false
|
||||
},
|
||||
"sources_reused": [
|
||||
"CBF3/9/10/16 accepted APIEX compilation pp66-68/72",
|
||||
"CIRPC7(4) accepted shortperiod implementation",
|
||||
"Decreto72/2013 art3(3)/9(3),accepted source inventory8143"
|
||||
],
|
||||
"remaining_code": [
|
||||
"other autonomous expense origins/parcels",
|
||||
"mixed/withheld cooperative income and other CIRPC9-14 entities",
|
||||
"CBF16 cessation/transition/noncivil/previousquotas/exit/lateryears/lowerquota/othercategories/methods/cumulation",
|
||||
"capitalgains61-A and specialoperations54-56/41-A",
|
||||
"CBF17-19 and potential15 entitlement;annualuseL8",
|
||||
"sector/territorial/specificregimes",
|
||||
"official L7 M20/M22 transport"
|
||||
],
|
||||
"document_conditions": [
|
||||
"classification/parcels/period evidence",
|
||||
"statute/recognition required by disposition or exception",
|
||||
"specific normativeperiod and cumulation order/limits",
|
||||
"form edition/field/fraction representation"
|
||||
],
|
||||
"remote_capacity_before_future_installation": {
|
||||
"fresh_space_inodes_build_backup_measurement": true,
|
||||
"main_compatibility_recheck": true,
|
||||
"fresh_backup_restore": true,
|
||||
"keep_active_until_ready": true
|
||||
},
|
||||
"L6_operational_delimited": true,
|
||||
"L7_partial": true,
|
||||
"L8_final_balance_separate": true,
|
||||
"evidence_directory": "outputs/irpc-l7-start-period"
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
{
|
||||
"status": "prepared_delivery_deferred_by_user_capacity_not_satisfied",
|
||||
"date": "2026-10-27",
|
||||
"candidate": "14360748194f3658d91a7d7ae5615efd0fcbfbb7",
|
||||
"QA_runtime_commit": "11a6cee981f0a425b0fceefb6ed85485bb298245",
|
||||
"candidate_branch": "codex/irpc-l8-settlement-qa-20261026",
|
||||
"remote_main_verified": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"installed_remote_verified": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"capacity": {
|
||||
"checked_at_UTC": "2026-10-27T06:05:28.744338+00:00",
|
||||
"partition": "/dev/md2 / ext4",
|
||||
"free_bytes": 4402343936,
|
||||
"free_GiB": 4.100002288818359,
|
||||
"required_after_backup_bytes": 5368709120,
|
||||
"previous_backup_reference_bytes": 175917490,
|
||||
"estimated_required_before_backup_bytes": 5544626610,
|
||||
"additional_free_bytes_needed": 1142282674,
|
||||
"additional_GiB_needed_rounded_up": 1.07,
|
||||
"inodes_available": 21340182,
|
||||
"release_entries_reference": 31259,
|
||||
"inodes_sufficient_against_reference": true,
|
||||
"fresh_measurement_required_on_resume": true,
|
||||
"installer_threshold_not_changed": true
|
||||
},
|
||||
"baseline": {
|
||||
"baseline": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"files_verified": 168,
|
||||
"active_writes": 0
|
||||
},
|
||||
"prepared_runtime_delta_files": 5,
|
||||
"preserved_runtime_files": 134,
|
||||
"originals_preserved": 31,
|
||||
"caches_read_only": {
|
||||
"caches": [
|
||||
{
|
||||
"path": "/root/.cache/composer/files",
|
||||
"resolved": "/root/.cache/composer/files",
|
||||
"symlink": false,
|
||||
"bytes": 127242240,
|
||||
"first_entries": [
|
||||
"carbonphp",
|
||||
"maatwebsite",
|
||||
"iamcal",
|
||||
"bordoni",
|
||||
"fidry",
|
||||
"mockery",
|
||||
"symfony",
|
||||
"mtdowling",
|
||||
"inertiajs",
|
||||
"tcg",
|
||||
"nyholm",
|
||||
"dflydev"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "/tmp/node-compile-cache",
|
||||
"resolved": "/tmp/node-compile-cache",
|
||||
"symlink": false,
|
||||
"bytes": 4009984,
|
||||
"first_entries": [
|
||||
"v22.23.4-x64-d04b8edd-1001"
|
||||
]
|
||||
}
|
||||
],
|
||||
"package_manager_processes": [],
|
||||
"open_cache_handles": [],
|
||||
"service": "ActiveState=inactive\nSubState=dead\n",
|
||||
"active_writes": 0
|
||||
},
|
||||
"caches_insufficient_to_resolve_gap": true,
|
||||
"cleanup_performed": false,
|
||||
"fresh_backup_executed": false,
|
||||
"fresh_restore_executed": false,
|
||||
"main_push_executed": false,
|
||||
"installation_executed": false,
|
||||
"server_persistent_writes": 0,
|
||||
"business_database_writes": 0,
|
||||
"user_decision": "Manter a entrega preparada por agora",
|
||||
"next_action": "New space/inode and main/servedrevision checks;confirm capacity for freshbackup/restore and isolatedbuild;then authorized Git delivery and onlydelta verification. Keep active release until new is ready.",
|
||||
"QA_proofs_reused": {
|
||||
"frontend": 19,
|
||||
"API_assertions": 170,
|
||||
"UI_round_trip": true,
|
||||
"typescript": true,
|
||||
"isolatedbuild": true,
|
||||
"not_repeated": true
|
||||
},
|
||||
"L8_partial": true,
|
||||
"PEC_and_own_credits_separate": true,
|
||||
"L7_residuals_unchanged": true,
|
||||
"SGF_TEMPO_untouched": true,
|
||||
"preflight_pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604",
|
||||
"resume_candidate_branch": "codex/irpc-l8-settlement-qa-20261026",
|
||||
"notes_branch": "codex/irpc-l8-delivery-capacity-20261027"
|
||||
}
|
||||
@@ -0,0 +1,382 @@
|
||||
{
|
||||
"status": "QA_complete_ready_for_grouped_delivery_not_installed",
|
||||
"date": "2026-10-26",
|
||||
"branch": "codex/irpc-l8-settlement-qa-20261026",
|
||||
"runtime_revision": "11a6cee981f0a425b0fceefb6ed85485bb298245",
|
||||
"installed_revision_per_user": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"remote_main_checked": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"version": "IRPC-annual-settlement/1",
|
||||
"scope": "resident general IRPC,annualcivil2026,MZN,currentdetermined assessment,documented absence of positive PEC/unmappedcredits and autonomoustax needing ownsettlement",
|
||||
"inputs_reused": [
|
||||
"current L6 or applicable qualifiedL7 assessment key/version/subjectNUIT/period;never add both",
|
||||
"L5 received/effective/on_account qualified and reconciled withholding proofs",
|
||||
"actual documented PPC payments by subject/period/receipt",
|
||||
"known/declaredabsence/missing states for every credit/paymentfamily"
|
||||
],
|
||||
"PEC_and_special_credits_separate": true,
|
||||
"official_credit_consumption_or_central_reservation": false,
|
||||
"duplicate_guards": [
|
||||
"same L5 allocation/pair",
|
||||
"normalised issuer/document even if date changed",
|
||||
"same receipt as withholding and PPC",
|
||||
"receipt total including partial allocations in other contexts in same dossier",
|
||||
"same sourceKey L5 allocation cannot consume larger receipt twice",
|
||||
"different entity/year or inconsistent proven amount"
|
||||
],
|
||||
"cases": {
|
||||
"payable": {
|
||||
"status": "payable",
|
||||
"knownWithholdings": {
|
||||
"numerator": "300",
|
||||
"denominator": "1"
|
||||
},
|
||||
"knownPpc": {
|
||||
"numerator": "500",
|
||||
"denominator": "1"
|
||||
},
|
||||
"arithmeticBalance": {
|
||||
"numerator": "608",
|
||||
"denominator": "1"
|
||||
},
|
||||
"payable": {
|
||||
"numerator": "608",
|
||||
"denominator": "1"
|
||||
},
|
||||
"recoverable": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": []
|
||||
},
|
||||
"recoverable": {
|
||||
"status": "recoverable",
|
||||
"knownWithholdings": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"knownPpc": {
|
||||
"numerator": "600",
|
||||
"denominator": "1"
|
||||
},
|
||||
"arithmeticBalance": {
|
||||
"numerator": "-192",
|
||||
"denominator": "1"
|
||||
},
|
||||
"payable": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"recoverable": {
|
||||
"numerator": "192",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": []
|
||||
},
|
||||
"balanced": {
|
||||
"status": "balanced",
|
||||
"knownWithholdings": {
|
||||
"numerator": "408",
|
||||
"denominator": "1"
|
||||
},
|
||||
"knownPpc": {
|
||||
"numerator": "1000",
|
||||
"denominator": "1"
|
||||
},
|
||||
"arithmeticBalance": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"payable": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"recoverable": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": []
|
||||
},
|
||||
"absent": {
|
||||
"status": "payable",
|
||||
"knownWithholdings": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"knownPpc": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"arithmeticBalance": {
|
||||
"numerator": "1408",
|
||||
"denominator": "1"
|
||||
},
|
||||
"payable": {
|
||||
"numerator": "1408",
|
||||
"denominator": "1"
|
||||
},
|
||||
"recoverable": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"pending": []
|
||||
},
|
||||
"missing": {
|
||||
"status": "indeterminate",
|
||||
"knownWithholdings": {
|
||||
"numerator": "300",
|
||||
"denominator": "1"
|
||||
},
|
||||
"knownPpc": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"arithmeticBalance": null,
|
||||
"payable": null,
|
||||
"recoverable": null,
|
||||
"pending": [
|
||||
"QA-PPC-2026-1: Error: PPC exige comprovativo efectivo,MZN,data,entidade e exercício correspondentes;projecção/tesouraria não é pagamento"
|
||||
]
|
||||
},
|
||||
"duplicate": {
|
||||
"status": "indeterminate",
|
||||
"knownWithholdings": {
|
||||
"numerator": "300",
|
||||
"denominator": "1"
|
||||
},
|
||||
"knownPpc": {
|
||||
"numerator": "0",
|
||||
"denominator": "1"
|
||||
},
|
||||
"arithmeticBalance": null,
|
||||
"payable": null,
|
||||
"recoverable": null,
|
||||
"pending": [
|
||||
"QA-PPC-2026-1: Comprovativo utilizado além do montante disponível ou com montantes divergentes neste/outro mapa."
|
||||
]
|
||||
},
|
||||
"pec": {
|
||||
"status": "indeterminate",
|
||||
"knownWithholdings": {
|
||||
"numerator": "300",
|
||||
"denominator": "1"
|
||||
},
|
||||
"knownPpc": {
|
||||
"numerator": "500",
|
||||
"denominator": "1"
|
||||
},
|
||||
"arithmeticBalance": null,
|
||||
"payable": null,
|
||||
"recoverable": null,
|
||||
"pending": [
|
||||
"PEC: Error: montante positivo fora deste recorte:corresponder ordem,limite e transporte próprios;sem abatimento ou reembolso automático"
|
||||
]
|
||||
}
|
||||
},
|
||||
"checks": {
|
||||
"frontend_tests": 19,
|
||||
"frontend_pass": 19,
|
||||
"API_tests": 1,
|
||||
"API_assertions": 170,
|
||||
"API_cases": 7,
|
||||
"database": "simulator_fiscal_delta_20261021_test",
|
||||
"host": "127.0.0.1",
|
||||
"port": 55441,
|
||||
"transaction_rollback": true,
|
||||
"actual_components_UI": {
|
||||
"actualComponents": true,
|
||||
"explicitPreparation": true,
|
||||
"onlyActualOnAccountProofSelectable": true,
|
||||
"duplicateSelectionDisabled": true,
|
||||
"missingNotZero": true,
|
||||
"ownBeneficiaryAndIncludedIncomeConfirmed": true,
|
||||
"actualPPCConfirmed": true,
|
||||
"PECAndCreditsSeparate": true,
|
||||
"payable608": true,
|
||||
"recoverable192": true,
|
||||
"balanced": true,
|
||||
"duplicateIndeterminate": true,
|
||||
"positivePECIndeterminate": true,
|
||||
"oldBooksAndPlanUnchanged": true,
|
||||
"saveReloadRecoverReportDownload": true,
|
||||
"errors": []
|
||||
},
|
||||
"wayfinder_with_form": "passed",
|
||||
"typescript": "passed",
|
||||
"isolated_QA_build": "passed",
|
||||
"build_existing_warnings": [
|
||||
"chunk size over500kB;plugin timing diagnostic"
|
||||
],
|
||||
"prior_accepted_suites_not_repeated": true
|
||||
},
|
||||
"runtime_delta": [
|
||||
"resources/js/components/simulation-form.tsx",
|
||||
"resources/js/components/simulation-irpc-annual.tsx",
|
||||
"resources/js/lib/irpc-annual-settlement.ts",
|
||||
"resources/js/lib/project-dossier-report.ts",
|
||||
"resources/js/lib/project-dossier.ts",
|
||||
"tests/Feature/IrpcAnnualSettlementDraftTest.php",
|
||||
"tests/frontend/irpc-annual-settlement.test.mjs",
|
||||
"tools/irpc-annual-settlement-qa.php"
|
||||
],
|
||||
"preservation": {
|
||||
"baseline": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"documentation_base": "d5f11462",
|
||||
"existing_tracked_files": 2832,
|
||||
"changed_existing_files": [
|
||||
"docs/investmoz/consolidated-review-matrix-2026-10-03.md",
|
||||
"docs/investmoz/unification/traceability-and-manual.md",
|
||||
"docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv",
|
||||
"resources/js/components/simulation-form.tsx",
|
||||
"resources/js/lib/project-dossier-report.ts",
|
||||
"resources/js/lib/project-dossier.ts"
|
||||
],
|
||||
"all_other_existing_files_byte_identical": true,
|
||||
"schema_configuration_permissions_unchanged": true,
|
||||
"L5_L6_L7_engines_and_fixtures_byte_identical": true,
|
||||
"originals_count": 31,
|
||||
"originals": {
|
||||
"docs/investmoz/simulations/source-archive/AT-Comunicado-9-2026-ISPC.pdf": "106f8a9ce9255c03549c70bf07fe999d32e6e55302d009b509862aa74ccb4973",
|
||||
"docs/investmoz/simulations/source-archive/AT-MRFTA-19-39.pdf": "8ea62c53066b482f87078a7a7b1ecf15ca98a12a122e8d7abca63acfc993186b",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-30-ISPC.pdf": "6802edd06b6ff638a0b851a3ec7ecf69af8f07840faa47446becad67d35d445c",
|
||||
"docs/investmoz/simulations/source-archive/AT-Modelo-B-Geral.pdf": "bd977c7c59d4d98befd92e2c566b1bf168cb1343bb519f51b41a3807f431fc57",
|
||||
"docs/investmoz/simulations/source-archive/BM-Mercado-Monetario-MAIBOR-20261025.html": "00e8a7e0d3a1db4ca3beb56d5361b2084a0f1684f3d40fc1c203702a2190e063",
|
||||
"docs/investmoz/simulations/source-archive/BR-16-I-Serie-2008-04-16.pdf": "fc373ff5637edf75ec6a9595dec8763a8503d4ee786e3b7d8f1c742eae9d80ee",
|
||||
"docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"docs/investmoz/simulations/source-archive/BR-89-I-Serie-2017-06-08.pdf": "11f0cab15eb6e51010952203ffa24fdc533a24fd642e19525fe4f46b17a1f5e5",
|
||||
"docs/investmoz/simulations/source-archive/BR-95-I-Suplemento-2025-05-21.pdf": "e0e682e2c027c3cd9c1d46a73a3f48bc5f6bdbf05667fd97314d7a3f6a456358",
|
||||
"docs/investmoz/simulations/source-archive/BR252-I-Serie-2022-Lei20-PESOE.pdf": "1159fd3ce1ba5581671796d083534da48bd3c5578298819e896f1c2a8026318d",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-22-2021-BR70.pdf": "a8fac38dcfe08f9c7a8e46254cff10e1ec82fc4f7a8d88ad6e4fe7d91ffc21a5",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-27-2026-BR123.pdf": "26249c3fa58f149c81de36e99d1aac2819a4771379d9e8833159660dabf539bb",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-29-1998-BR22-5-suplemento.pdf": "6242cbe675faadf085f43f95ec8c7e8868aafe67c3b2ab2bb010992288f954f8",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-3-2011-BR-11-I-mineiros.pdf": "5bca1133666ba9c69870b89823420175b7b5b8d0eccb667ecdf5c29716f3b6be",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-37-2023-BR124.pdf": "7e680b191481faa0e2e9057fa5053587eb2a29d1d8c819e0eb9f02814255a04c",
|
||||
"docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"docs/investmoz/simulations/source-archive/Lei-13-2016-CIVA-BR-156-10-suplemento.pdf": "b90dc7c14ecea2e378c4a62e8e5a47d54a5644c457baeb8b8053b92fd2a5710b",
|
||||
"docs/investmoz/simulations/source-archive/Lei-14-1992-BR42.pdf": "089fff7423e99a70a230a73ca379e4ea3a91d124703f91016e57ff82794b9e56",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-BR251-exemplar-MCNet5.pdf": "14eb34f0af91a8f5cb1770c7b52d6ff839c6818302d1ed96d79afbfb9fe999d4",
|
||||
"docs/investmoz/simulations/source-archive/Lei-17-2022-IPP-BR250-Parlamento.pdf": "978cd22403ffd336a631704ecd7a5bbd814a427c815b9acdaca5515591dd9e2a",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2013-BR76.pdf": "bba96d645cc935ffc3d1a79b9f0f73ac1c693d6459c2ad41f56cd2841accae76",
|
||||
"docs/investmoz/simulations/source-archive/Lei-19-2017-IRPS-BR-OCAM.pdf": "c3a0186cb9ad090d7a9533006295dc9bb6a62ad0d6150173cbd49dba4ee4b52d",
|
||||
"docs/investmoz/simulations/source-archive/Lei-2-2011-BR-1-4-suplemento-MCNet.pdf": "a7543a68cc3287a46a83c39a04821b40f649dd06c4e9b5dc51ff0b47fba08899",
|
||||
"docs/investmoz/simulations/source-archive/Lei-20-2009-BR36-AT-exemplar19.pdf": "fc1c8144db42960cbf73e717e095896f511ece0f907f58f78819b27d6917a7ee",
|
||||
"docs/investmoz/simulations/source-archive/Lei-22-2022-IVA-republicada-BR-250-2-suplemento.pdf": "ea1b0dc6f5cf6e595f6d9a19e7042f398999e0087caef1785f6e8fac571b5f53",
|
||||
"docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-1994-BR37-3-suplemento.pdf": "210df9db8980d0a5690cd187a6eeec7e37a900d743e39062c16f4e0d12215c7e",
|
||||
"docs/investmoz/simulations/source-archive/Lei-4-2012-BR3.pdf": "b8845cef41dcbd9ba50c43dbfa743a56030dd3d348242a107e1ae30279eec121",
|
||||
"docs/investmoz/simulations/source-archive/Lei-7-1991-Partidos-IFES.pdf": "6b783a0bb3330688ef10660a58060d9724aa2da6a873d234fe902f0eaaeda42d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-CDT-1992.pdf": "d504e1024b28aee5c6acf4592acb96ec9c915a8414f67a61ab6984d6acf9df9d",
|
||||
"docs/investmoz/simulations/source-archive/PT-MZ-Protocolo-2009.pdf": "f353773dcf41f09f4daa6cf5ba5a5f7994f3e02615867c2dcffc61c3d901bf9b"
|
||||
},
|
||||
"all_seven_recovered_cases_match_final_inputs": true,
|
||||
"no_active_database_or_server_operations": true,
|
||||
"no_SGF_TEMPO_operations": true,
|
||||
"runtime_changed_existing_files": [
|
||||
"resources/js/components/simulation-form.tsx",
|
||||
"resources/js/lib/project-dossier-report.ts",
|
||||
"resources/js/lib/project-dossier.ts"
|
||||
],
|
||||
"documentation_changed_existing_files": [
|
||||
"docs/investmoz/consolidated-review-matrix-2026-10-03.md",
|
||||
"docs/investmoz/unification/traceability-and-manual.md",
|
||||
"docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv"
|
||||
],
|
||||
"documentation_only_appends_and_target_AUD_record": true
|
||||
},
|
||||
"sources_reused": [
|
||||
{
|
||||
"file": "docs/investmoz/simulations/source-archive/Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"articles": "CIRPC63/67",
|
||||
"PDF_pages": [
|
||||
18,
|
||||
19
|
||||
],
|
||||
"official_source_acceptance_preserved": true
|
||||
},
|
||||
{
|
||||
"file": "docs/investmoz/simulations/source-archive/Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"articles": "RIRPC21/27",
|
||||
"PDF_pages": [
|
||||
6,
|
||||
7
|
||||
],
|
||||
"official_source_acceptance_preserved": true
|
||||
},
|
||||
{
|
||||
"file": "docs/investmoz/simulations/source-archive/BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"articles": "Lei12/2025 IRPC67/version2026",
|
||||
"PDF_pages": [
|
||||
18,
|
||||
19,
|
||||
20
|
||||
],
|
||||
"official_source_acceptance_preserved": true
|
||||
}
|
||||
],
|
||||
"minimum": {
|
||||
"rule": "Decreto9/2008 art27(6)",
|
||||
"scope": "2026 resident_general/calendar/MZN",
|
||||
"less_than": "100 MZN",
|
||||
"strict_boundary_tests": [
|
||||
"+99.99",
|
||||
"+100",
|
||||
"-99.99",
|
||||
"-100"
|
||||
],
|
||||
"arithmetic_exact": true,
|
||||
"new_rounding": false,
|
||||
"automatic_carry": false
|
||||
},
|
||||
"remaining_code": [
|
||||
"automatic PPC/PEC obligationcalculation",
|
||||
"positivePEC/creditorderlimitscarry",
|
||||
"autonomoustaxsettlement",
|
||||
"specialperiods/foreigncurrencypayments",
|
||||
"interest/penalties/calendar/guideremittance",
|
||||
"AT submission/refundprocessing",
|
||||
"unmappedM20M22fields"
|
||||
],
|
||||
"documentary_dependencies": {
|
||||
"previous_L5_L6_L7_matrix_items_preserved": true,
|
||||
"examples": [
|
||||
"mixed/withheld cooperativeincome needs L7 segregation",
|
||||
"express cumulation exception requires disposition/period/limits",
|
||||
"divergent M20M22 field needs exactedition and representation"
|
||||
],
|
||||
"only_dependent_case_blocked": true
|
||||
},
|
||||
"L6_operational_delimited": true,
|
||||
"L7_partial": true,
|
||||
"L8_partial": true,
|
||||
"submitted_or_payment_or_refund_received": false,
|
||||
"server_operations_this_turn": false,
|
||||
"reported_server_free_GiB": 4.14,
|
||||
"reported_capacity_not_measured_this_turn": true,
|
||||
"capacity_blocks_future_install_not_QA": true,
|
||||
"future_delivery": {
|
||||
"fresh_main_compatibility": true,
|
||||
"measure_space_and_inodes": true,
|
||||
"confirm_backup_and_isolated_build_capacity": true,
|
||||
"fresh_backup_restore": true,
|
||||
"keep_active_until_new_ready": true,
|
||||
"verify_served_revision_and_only_delta": true
|
||||
},
|
||||
"evidence_directory": "outputs/irpc-l8-settlement/",
|
||||
"global_effort": {
|
||||
"initial_L8_L14_reference_hours": [
|
||||
240,
|
||||
416
|
||||
],
|
||||
"is_current_remainingforecast": false,
|
||||
"reconciliation_before_globalforecast": [
|
||||
"implemented/reusable vs remainingcode perlot",
|
||||
"reuseacceptedproofs;no duplicate sharedcomponentestimate",
|
||||
"documentarywait separately",
|
||||
"L1-L7residuals,integration/delivery,L15-L16 included"
|
||||
]
|
||||
},
|
||||
"root_checkout_runtime_not_merged": true,
|
||||
"SGF_TEMPO_untouched": true
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"status": "L8_first_increment_delimited_not_implemented",
|
||||
"date": "2026-10-26",
|
||||
"installed_L7": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"no_new_L8_calculator_installed": true,
|
||||
"initial_scope": "resident general IRPC,annualcivil2026,MZN,currentdetermined assessment,documented absence of positive PEC/unmappedcredits and autonomoustax needing ownsettlement",
|
||||
"inputs_reused": [
|
||||
"current L6 or applicable qualifiedL7 assessment key/version/subjectNUIT/period;never add both",
|
||||
"L5 received/effective/on_account qualified and reconciled withholding proofs",
|
||||
"actual documented PPC payments by subject/period/receipt",
|
||||
"known/declaredabsence/missing states for every credit/paymentfamily"
|
||||
],
|
||||
"wrong_credits_excluded": [
|
||||
"withholding remitted by enterprise on payments to others",
|
||||
"definitive withholding",
|
||||
"projected amount without effective proof",
|
||||
"duplicate receipt/allocation/year",
|
||||
"unmapped positive PEC/investment/doubletax credit"
|
||||
],
|
||||
"sequence": [
|
||||
"validassessment",
|
||||
"admissibledeductions and explicitabsence",
|
||||
"effective onaccount withholdings",
|
||||
"actual PPC",
|
||||
"signed arithmeticbalance",
|
||||
"applicable collection/refund minimum rules",
|
||||
"simulatedpayable orrecoverable;not submittedor receivedrefund"
|
||||
],
|
||||
"proposed_acceptance_cases": [
|
||||
{
|
||||
"colecta": "1408",
|
||||
"withholdings": "300",
|
||||
"PPC": "500",
|
||||
"arithmetic_balance": "608"
|
||||
},
|
||||
{
|
||||
"colecta": "1408",
|
||||
"withholdings": "1000",
|
||||
"PPC": "600",
|
||||
"arithmetic_balance": "-192"
|
||||
},
|
||||
{
|
||||
"colecta": "1408",
|
||||
"withholdings": "408",
|
||||
"PPC": "1000",
|
||||
"arithmetic_balance": "0"
|
||||
},
|
||||
"minimumrule boundaries afterperiod/version mapping",
|
||||
"knownzero vs declaredabsence vs missing",
|
||||
"wrongbeneficiary/definitive/duplicates",
|
||||
"calculation-save-recover-report with oldhistories unchanged"
|
||||
],
|
||||
"cases_tested_now": false,
|
||||
"rule_work_before_implementation": [
|
||||
"CIRPC63/67 with Lei12/2025 nature applicable",
|
||||
"Decreto9/2008 art21(2-5) deductionorder/limits and27(1-2/6) settlement",
|
||||
"100MZN minimum in accepted2008 exemplar:link to applicable version/period before enabling parameter;no generic credibility revalidation",
|
||||
"retain PEC/credits distinct and nonrefundable limits;no3/5year automaticcarry"
|
||||
],
|
||||
"boundaries": [
|
||||
"qualified cooperative withoutwithheldincome cannot silently acceptpositivereceivedwithholdings without L7segregation",
|
||||
"no L6fallback toignore applicablependingL7effect",
|
||||
"autonomoustax/61Apositive needs own settlement articulation",
|
||||
"fraction exact;unmapped formrepresentation onlyblocks affectedtransport"
|
||||
],
|
||||
"deferred": [
|
||||
"automatic PPC/PEC obligationcalculation",
|
||||
"positivePEC/creditorderlimitscarry",
|
||||
"autonomoustaxsettlement",
|
||||
"specialperiods/foreigncurrencypayments",
|
||||
"interest/penalties/calendar/guideremittance",
|
||||
"AT submission/refundprocessing",
|
||||
"unmappedM20M22fields"
|
||||
],
|
||||
"sources_reused": [
|
||||
{
|
||||
"file": "C:\\laragon\\www\\portal-investidor-irpc-l7-common-qa-20261026\\docs\\investmoz\\simulations\\source-archive\\Lei-34-2007-BR52.pdf",
|
||||
"sha256": "cdbef875ad7ccc1517b12faf5de0e893a70ed2ed81e33913cd6dc4a674474e6e",
|
||||
"articles": "CIRPC63/67",
|
||||
"PDF_pages": [
|
||||
18,
|
||||
19
|
||||
],
|
||||
"official_source_acceptance_preserved": true
|
||||
},
|
||||
{
|
||||
"file": "C:\\laragon\\www\\portal-investidor-irpc-l7-common-qa-20261026\\docs\\investmoz\\simulations\\source-archive\\Decreto-9-2008-BR16.pdf",
|
||||
"sha256": "96fccdecbfdc11c9eafb90fbc6c7bc259f88bbd4c7507d1ac3af1fa03f960697",
|
||||
"articles": "RIRPC21/27",
|
||||
"PDF_pages": [
|
||||
6,
|
||||
7
|
||||
],
|
||||
"official_source_acceptance_preserved": true
|
||||
},
|
||||
{
|
||||
"file": "C:\\laragon\\www\\portal-investidor-irpc-l7-common-qa-20261026\\docs\\investmoz\\simulations\\source-archive\\BR-248-I-Suplemento-1-2025.pdf",
|
||||
"sha256": "ccf2a8deeca820f2dd076b4b2141b1efe3f6a806568c3a587ca59a8e92f4c251",
|
||||
"articles": "Lei12/2025 IRPC67/version2026",
|
||||
"PDF_pages": [
|
||||
18,
|
||||
19,
|
||||
20
|
||||
],
|
||||
"official_source_acceptance_preserved": true
|
||||
}
|
||||
],
|
||||
"global_effort": {
|
||||
"initial_L8_L14_reference_hours": [
|
||||
240,
|
||||
416
|
||||
],
|
||||
"is_current_remainingforecast": false,
|
||||
"reconciliation_before_globalforecast": [
|
||||
"implemented/reusable vs remainingcode perlot",
|
||||
"reuseacceptedproofs;no duplicate sharedcomponentestimate",
|
||||
"documentarywait separately",
|
||||
"L1-L7residuals,integration/delivery,L15-L16 included"
|
||||
]
|
||||
},
|
||||
"L7_partial": true,
|
||||
"L8_final_still_not_implemented": true
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
{
|
||||
"date": "2026-10-27",
|
||||
"status": "prospecting_handoff_ready_and_Gurue_private_hypothesis_in_QA_not_installed",
|
||||
"branch": "codex/proactive-handoff-gurue-qa-20261027",
|
||||
"baseline": "a78abf06d0ca075b18156ae3fd99649b69202481",
|
||||
"technical_candidate_unchanged": "1afab4a2a71f182f260e4d2555d79242261a4d2a",
|
||||
"runtime_unchanged": "3439f35038f15c93224e6cf876bf559135824d13",
|
||||
"songo": {
|
||||
"case_id": "CB-METROLOGIA-20261027",
|
||||
"record_id": 401,
|
||||
"source_version": 3,
|
||||
"context_revision": 3,
|
||||
"unchanged": true,
|
||||
"state": "private_pending_external_commercial_responses",
|
||||
"external_messages_sent": 0,
|
||||
"commercial_responses_received": 0,
|
||||
"partner_quotes_received": 0,
|
||||
"resume_when": "Inventories/programmes/interest and partner quotations for comparable scope received;identify independent buying centres before aggregating demand"
|
||||
},
|
||||
"prospecting_form": {
|
||||
"path": "docs/investmoz/unification/prospeccao-apoio-metrologico-20261027.pdf",
|
||||
"pages": 2,
|
||||
"interactive_fields": 42,
|
||||
"canonical_fields_and_widgets_agree": true,
|
||||
"unique_names": true,
|
||||
"all_fields_in_page": true,
|
||||
"saved_values_recovered": true,
|
||||
"appearance_streams_present": true,
|
||||
"real_form_not_prefilled_with_test_values": true,
|
||||
"delivered_format": "fillable_PDF",
|
||||
"docx_not_delivered": true,
|
||||
"sha256": "abed1dc12a8f635bf4c3aa39ba5823114d2155aaca9b675a8ca1b9fb6248e989",
|
||||
"visual_review": "Both final pages inspected;sample retained values checked separately"
|
||||
},
|
||||
"gurue": {
|
||||
"case_id": "GUR-CHA-20261027",
|
||||
"record_id": 402,
|
||||
"dossier_id": "883c8ec3-59a3-4074-b91c-b7d4a5d88ff0",
|
||||
"source_version": 1,
|
||||
"context_revision": 1,
|
||||
"evidence_count": 5,
|
||||
"need_state": "hypothesis",
|
||||
"private_draft_not_published": true,
|
||||
"created_saved_recovered_through_existing_services": true,
|
||||
"preview_and_confirmation": true,
|
||||
"deliberate_title_preserved": true,
|
||||
"existing_geo_and_sector_reused": true,
|
||||
"no_new_grants_or_business_promoter": true,
|
||||
"QA_operator_1021_only": true,
|
||||
"Songo_record_401_version_3_unchanged": true,
|
||||
"Songo_context_revision_3_unchanged": true,
|
||||
"no_application_code_or_fiscal_changes": true,
|
||||
"accepted_proofs_reused": true,
|
||||
"no_contact_or_server_operations": true,
|
||||
"QA_database": "proactive_investment_20261027_test",
|
||||
"row_preservation": {
|
||||
"opportunities": {
|
||||
"old_rows_unchanged": 53,
|
||||
"new_rows": 1
|
||||
},
|
||||
"desk_cases": {
|
||||
"old_rows_unchanged": 18,
|
||||
"new_rows": 1
|
||||
},
|
||||
"projects": {
|
||||
"old_rows_unchanged": 19,
|
||||
"new_rows": 0
|
||||
},
|
||||
"geo_locations": {
|
||||
"old_rows_unchanged": 1921,
|
||||
"new_rows": 0
|
||||
},
|
||||
"sectors": {
|
||||
"old_rows_unchanged": 12,
|
||||
"new_rows": 0
|
||||
},
|
||||
"documents": {
|
||||
"old_rows_unchanged": 63,
|
||||
"new_rows": 0
|
||||
},
|
||||
"value_chains": {
|
||||
"old_rows_unchanged": 0,
|
||||
"new_rows": 0
|
||||
},
|
||||
"audit_events": {
|
||||
"old_rows_unchanged": 394,
|
||||
"new_rows": 5
|
||||
},
|
||||
"organizations": {
|
||||
"old_rows_unchanged": 3,
|
||||
"new_rows": 0
|
||||
},
|
||||
"users": {
|
||||
"old_rows_unchanged": 40,
|
||||
"new_rows": 0
|
||||
},
|
||||
"investor_journeys": {
|
||||
"old_rows_unchanged": 15,
|
||||
"new_rows": 1
|
||||
},
|
||||
"journey_steps": {
|
||||
"old_rows_unchanged": 285,
|
||||
"new_rows": 19
|
||||
}
|
||||
}
|
||||
},
|
||||
"report": {
|
||||
"record_id": 402,
|
||||
"evidence_rows": 5,
|
||||
"source_version": 1,
|
||||
"context_revision": 1,
|
||||
"source_recovered_without_loss": true,
|
||||
"hypothesis_and_historic_period_visible": true,
|
||||
"commercial_inputs_unknown": true,
|
||||
"existing_report_helper": true,
|
||||
"accepted_suites_not_repeated": true
|
||||
},
|
||||
"source_register": [
|
||||
{
|
||||
"file": "ine-gurue-2020-2024.pdf",
|
||||
"url": "https://ine.gov.mz/documents/20119/337384/2_Gurue-%20Final_Junho2025.pdf/602d05a3-be99-47a4-be68-5277c4ca4a2f?download=true&t=1751024727586&version=1.0",
|
||||
"bytes": 3038756,
|
||||
"sha256": "9f0d3b868cfd3401f8d4f2fcceae0e5be164ba6dab927d1210e247b1711093d4",
|
||||
"accessed": "2026-10-27",
|
||||
"use": "Private read-only source copy;not imported or published"
|
||||
},
|
||||
{
|
||||
"file": "magoma-primary.html",
|
||||
"url": "https://www.asianteagroup.com/foot-gurue.html",
|
||||
"bytes": 5590,
|
||||
"sha256": "5881a5ec9a4b223932508fd48896c8a467a01387fdc7923eda4c4cb192adad9d",
|
||||
"accessed": "2026-10-27",
|
||||
"use": "Private read-only source copy;not imported or published"
|
||||
},
|
||||
{
|
||||
"file": "igc-enterprise-map-2014.pdf",
|
||||
"url": "https://www.theigc.org/wp-content/uploads/2014/06/An-Enterprise-Map-of-Mozambique-English.pdf",
|
||||
"bytes": 1746681,
|
||||
"sha256": "2d02a47c9e806490ba8d0cc016ef23d34bf8818f1b1c2dde5a0806818fa35c67",
|
||||
"accessed": "2026-10-27",
|
||||
"use": "Private read-only source copy;not imported or published"
|
||||
}
|
||||
],
|
||||
"provided_private_workbook": {
|
||||
"sha256": "1b5087b464e39e88c42def39655c2391aaaf684b4c832d6a77ff274b98889f00",
|
||||
"historical_reference_dates": [
|
||||
"2021-09-30",
|
||||
"2023-11-09",
|
||||
"2022-03-17"
|
||||
],
|
||||
"no_personal_data_or_contacts_exported": true,
|
||||
"not_imported_or_published": true
|
||||
},
|
||||
"pilot_limits": [
|
||||
"Activity documented;current unmet need and commercial interest unconfirmed",
|
||||
"2014 source is historical;no current volumes/prices/capacity inferred",
|
||||
"No assumed external green-leaf buyer,new factory,land access or certification",
|
||||
"Beneficiaries are not automatically buyers or payers"
|
||||
],
|
||||
"preserved": {
|
||||
"L8": "14360748194f3658d91a7d7ae5615efd0fcbfbb7",
|
||||
"SGF_TEMPO": "untouched",
|
||||
"accepted_proofs": "reused_without_repeating_suites",
|
||||
"main_last_read": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5"
|
||||
},
|
||||
"installation": "No remote or deployment operation;capacity remains a precondition to next installation",
|
||||
"private_outputs": "outputs/proactive-handoff-gurue-20261027/",
|
||||
"new_application_code": false
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
{
|
||||
"status": "QA_complete_candidate_not_installed",
|
||||
"date": "2026-10-27",
|
||||
"runtime_commit": "3439f35038f15c93224e6cf876bf559135824d13",
|
||||
"baseline_main": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"branch": "codex/proactive-investment-first-qa-20261027",
|
||||
"QA_directory": "C:\\laragon\\www\\portal-investidor-proactive-qa-20261027",
|
||||
"root_checkout": "C:/laragon/www/portal-investidor",
|
||||
"unavailable_local_scope_commit": "fa02c70",
|
||||
"unavailable_commit_is_not_dependency": true,
|
||||
"L8_candidate_preserved": "14360748194f3658d91a7d7ae5615efd0fcbfbb7",
|
||||
"L8_not_integrated_or_modified": true,
|
||||
"server_or_SGF_operations": false,
|
||||
"scope": "territory/sector,evidence,need,structuredidea,existingencryptedDossier;manualeditorialpreparation beforeAI",
|
||||
"existing_models_reused": [
|
||||
"geo_locations",
|
||||
"sectors",
|
||||
"value_chains",
|
||||
"projects",
|
||||
"economic_clusters",
|
||||
"development_corridors",
|
||||
"investment_zones",
|
||||
"Opportunity.management_draft",
|
||||
"audit_events",
|
||||
"portal_resources",
|
||||
"documents",
|
||||
"opportunity_documents",
|
||||
"desk_cases",
|
||||
"InvestorContext",
|
||||
"InvestmentConsumerScope",
|
||||
"InvestorPath"
|
||||
],
|
||||
"new_tables_or_migrations": false,
|
||||
"new_organisational_approvers_or_roles": false,
|
||||
"auth_delta": "Existing internal assignment may prepare/edit proactive drafts with real promoter unknown;all other role and operational checks retained and tested",
|
||||
"checks": {
|
||||
"API_tests": 14,
|
||||
"API_assertions": 139,
|
||||
"frontend_report_tests": 7,
|
||||
"database": "proactive_investment_20261027_test",
|
||||
"clone_source": "simulator_fiscal_delta_20261021_test",
|
||||
"host": "127.0.0.1",
|
||||
"port": 55441,
|
||||
"guarded": true,
|
||||
"API_transaction_rollback": true,
|
||||
"UI_persistent_synthetic_data_only_in_clone": true,
|
||||
"normal_password_and_MFA_UI": true,
|
||||
"UI": {
|
||||
"actualLaravelHTTP": true,
|
||||
"normalPasswordAndMFA": true,
|
||||
"createSaveRecoverEdit": true,
|
||||
"hypothesisAndConfirmedHistory": true,
|
||||
"onlyApplicableGroupsShown": true,
|
||||
"selectedRelationshipsAndAssumptionsTransported": true,
|
||||
"privateRelationshipReferenceNotExposed": true,
|
||||
"noBudgetPromoterCoordinatesRequired": true,
|
||||
"existingTerritoryAndSector": true,
|
||||
"explicitPromotionPreviewConfirm": true,
|
||||
"anonymousOnlyAuthorisedPublicContent": true,
|
||||
"authReturnPreservesSource": true,
|
||||
"existingDossier": true,
|
||||
"deliberateTitlePreserved": true,
|
||||
"reloadAndResumeSession": true,
|
||||
"publicUrl": "http://127.0.0.1:18760/oportunidades/inv-mz-gen-5137141825128895?perspective=ideas§or=energia-especifica",
|
||||
"record_id": 383,
|
||||
"dossier_id": "139e5faf-4979-4e2c-9a92-3e1465431642",
|
||||
"errors": []
|
||||
},
|
||||
"Wayfinder_with_form": "passed",
|
||||
"TypeScript": "passed",
|
||||
"isolated_QA_build": "passed",
|
||||
"build_advisories": [
|
||||
"Existing chunk-size and plugin-timing diagnostics;no buildfailure"
|
||||
],
|
||||
"unaffected_accepted_suites_not_repeated": true
|
||||
},
|
||||
"preservation": {
|
||||
"baseline": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"tracked_files_before": 2830,
|
||||
"changed_existing_files": [
|
||||
"app/Http/Controllers/OpportunityManagementController.php",
|
||||
"app/Models/Opportunity.php",
|
||||
"app/Services/InvestmentCatalogue.php",
|
||||
"app/Services/InvestorContext.php",
|
||||
"app/Services/OpportunityManagement.php",
|
||||
"app/Services/OpportunityPromotion.php",
|
||||
"app/Services/PortalProfileAccess.php",
|
||||
"docs/investmoz/consolidated-review-matrix-2026-10-03.md",
|
||||
"docs/investmoz/unification/traceability-and-manual.md",
|
||||
"docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv",
|
||||
"resources/js/components/opportunity-search-filters.tsx",
|
||||
"resources/js/lib/project-dossier.ts",
|
||||
"resources/js/pages/investment/catalogue.tsx",
|
||||
"resources/js/pages/investment/detail.tsx",
|
||||
"resources/js/pages/investment/shared.tsx",
|
||||
"resources/js/pages/investor-path/show.tsx",
|
||||
"resources/js/pages/management/opportunity-draft.tsx",
|
||||
"resources/js/pages/management/opportunity-promotion.tsx"
|
||||
],
|
||||
"unchanged_existing_files": 2812,
|
||||
"fiscal_engines_unchanged": 89,
|
||||
"fiscal_originals_unchanged": 31,
|
||||
"Rwanda_originals_unchanged": true,
|
||||
"L8_candidate_14360748_unchanged": true,
|
||||
"auth_delta": "Existing internal assignment may prepare/edit proactive drafts with real promoter unknown;all other role and operational checks retained and tested",
|
||||
"source_Database_and_active_environment_not_written": true,
|
||||
"QA_database": "proactive_investment_20261027_test",
|
||||
"clone_source": "simulator_fiscal_delta_20261021_test",
|
||||
"port": 55441,
|
||||
"root_runtime_not_changed": true,
|
||||
"SGF_TEMPO_untouched": true,
|
||||
"accepted_unaffected_suites_not_repeated": true,
|
||||
"no_migrations_config_or_active_grant_changes": true,
|
||||
"QA_synthetic_grants_only_in_isolated_clone": true,
|
||||
"includes_documentation_delta": true
|
||||
},
|
||||
"Rwanda_methodology": {
|
||||
"status": "user_provided_sources_located_and_relevant_passages_read",
|
||||
"date": "2026-10-27",
|
||||
"purpose": "Internal methodology for QA editorial preparation;not local economic evidence",
|
||||
"originals_unchanged": true,
|
||||
"no_source_publication_or_import": true,
|
||||
"no_foreign_tax_or_institutional_rules_imported": true,
|
||||
"sources": [
|
||||
{
|
||||
"path": "c:\\Mac\\Home\\Documents\\Docs pessoais\\Backup\\Documentos – MacBook Pro de Macbook\\Docs\\Rwanda\\20070627_Rwanda_5d0cc43d-c990-4cf1-8ee9-ada71094918f.pdf",
|
||||
"sha256": "18b07a9379a1ad0baa33697d57d6237f15a6fec346db44bfee7506bf1fa27dee",
|
||||
"bytes": 335937,
|
||||
"title": "Creating a Competitive Rwanda",
|
||||
"author": "Professor Michael E. Porter, Harvard Business School",
|
||||
"edition": "Kigali,June2007 (cover)",
|
||||
"pages": 31,
|
||||
"visual_pages_inspected": [
|
||||
1,
|
||||
14,
|
||||
27
|
||||
],
|
||||
"passages": [
|
||||
{
|
||||
"page": 14,
|
||||
"heading": "Improving the Business Environment: The Diamond",
|
||||
"application_pt": "Inventariar factores de produção, condições de procura e fornecedores/actividades de apoio;cada afirmação local depende de fonte e cobertura próprias."
|
||||
},
|
||||
{
|
||||
"page": 27,
|
||||
"heading": "Role of the Private Sector in Economic Development",
|
||||
"application_pt": "Identificar fornecedores, infra-estruturas e competências como relações a investigar;proximidade não cria compromisso ou acesso."
|
||||
}
|
||||
],
|
||||
"extraction": "pypdf;selectedpages rendered withPyMuPDF and visually inspected"
|
||||
},
|
||||
{
|
||||
"path": "c:\\Mac\\Home\\Documents\\Docs pessoais\\Backup\\Documentos – MacBook Pro de Macbook\\Docs\\Rwanda\\Rwanda Competitiveness Briefing_Prof Porter_OTF.ppt",
|
||||
"sha256": "4a9325ad64278cb0ef3c60367a05ee2ed9262e2cd49a48d579061349914aa830",
|
||||
"bytes": 1755648,
|
||||
"title": "How Rwanda Competes Today — Rwanda National Innovation and Competitiveness Program",
|
||||
"edition": "July20,2008;Executive Briefing for Prof.MichaelPorter,slide1",
|
||||
"slides": 50,
|
||||
"native_PowerPoint_read_only": true,
|
||||
"visual_slides_inspected": [
|
||||
17
|
||||
],
|
||||
"passages": [
|
||||
{
|
||||
"slide": 17,
|
||||
"heading": "Tourism Cluster—What the market is telling us",
|
||||
"application_pt": "Conservar origem,período,cobertura e amostra das observações de procura;interesse declarado de um inquirido não equivale a contrato ou encomenda em Moçambique.",
|
||||
"source_note": "OTF Tourism Channel Partner Survey,January2007,n=90,scale1–7 visible in slide;figures not transferred to pilotcases."
|
||||
},
|
||||
{
|
||||
"slide": 20,
|
||||
"heading": "Tea Cluster—Persistent constraints",
|
||||
"application_pt": "Estruturar a análise por etapas de produção,recolha,transformação,transporte e comercialização;as limitações do Ruanda não são lacunas comprovadas do Gurué.",
|
||||
"inspection": "Text extracted in native slide order;not yet visually inspected."
|
||||
},
|
||||
{
|
||||
"slide": 24,
|
||||
"heading": "Mining Cluster – Situation analysis",
|
||||
"application_pt": "Perguntar por competências,informação,fornecedores e serviços relacionados;nenhuma necessidade de Montepuez é inferida desta lista estrangeira.",
|
||||
"inspection": "Native text extracted;not visualproof."
|
||||
}
|
||||
],
|
||||
"extraction": "Legacy OLE exploratoryextraction followed bynativePowerPointreadonly extraction;native50slideorder is authoritative. OldOLE91historicaltextgroups not used as slide count."
|
||||
}
|
||||
],
|
||||
"implementation_mapping": [
|
||||
"evidence.category+purpose+source+locator+period+scope+coverage+verified_on",
|
||||
"methodology evidence cannot by itself confirm localneed",
|
||||
"need.type quantity/quality/logistics/processing/coordination/support",
|
||||
"idea.chain_id+stage+documentedresources+relations",
|
||||
"hypothesis vs confirmedneed vs preparation vs actualavailability separated"
|
||||
],
|
||||
"limitations": [
|
||||
"No actualpilot demand,supply,market_size,profitability or investmentcosts validated",
|
||||
"No direct or indirect disclosure of privatecompanylists or originaldecks",
|
||||
"Copyright/proprietary notices preserved;excerpts and renders remain ignored QA evidence,not public app assets"
|
||||
]
|
||||
},
|
||||
"public_projection_rules": [
|
||||
"No automatic private-to-public field copy",
|
||||
"Only selected public evidence and publictarget relationships",
|
||||
"Private relationship reference omitted",
|
||||
"Internal document classification,rights,scan and ownership link retained",
|
||||
"Literal private evidence reuse blocked;indirect disclosure is explicitly reviewed by existing editor",
|
||||
"Analytical state and publication state separate",
|
||||
"No automatic contract,availability,land,power,viability or taxbenefit"
|
||||
],
|
||||
"pilots": [
|
||||
{
|
||||
"context": "Cahora Bassa",
|
||||
"sector": "Energia",
|
||||
"territory": "bcc9e3cb-2359-524c-af4e-0ebc6f141d3d",
|
||||
"status": "synthetic_QA_only"
|
||||
},
|
||||
{
|
||||
"context": "Montepuez",
|
||||
"sector": "Mineração",
|
||||
"territory": "d4fb92cc-d278-5f69-9490-a98e6dfef18d",
|
||||
"status": "synthetic_QA_only"
|
||||
},
|
||||
{
|
||||
"context": "Gurué",
|
||||
"sector": "Agronegócio/cadeia do chá",
|
||||
"territory": "87a8ba3d-b152-560c-a566-7db4531ad536",
|
||||
"status": "synthetic_QA_only"
|
||||
}
|
||||
],
|
||||
"remaining": {
|
||||
"implemented_demonstrated": "Editorial technical workflow and scoped continuity listed in manual",
|
||||
"partial": "Real local economic analysis and availability of actual participations,not claimed",
|
||||
"documentary_dependencies": "Local evidence,period,coverage,source and specific contract/access/availability claims;onlydependentcase blocked",
|
||||
"resolved_dependency": "Both Rwanda exemplars available and passages inspected",
|
||||
"future": "Automaticintelligence/prioritisation/indicators/AI and economic quantification when data exist;not required for firsteditorial increment",
|
||||
"active_installation": "Out of authorised scope;futurefreshcompatibility/capacity/backuprestore required"
|
||||
},
|
||||
"matrix_ids_updated": [
|
||||
"RF-CLU-003",
|
||||
"MASTER-471012ab-0010",
|
||||
"MASTER-9dee08d0-0067",
|
||||
"MASTER-471012ab-0067"
|
||||
],
|
||||
"documentation_append_only": true,
|
||||
"evidence_directory": "outputs/proactive-investment-20261027/",
|
||||
"no_economic_validation": true,
|
||||
"no_actual_publication_or_homologation_installation": true
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
{
|
||||
"status": "private_opportunity_hypothesis_updated_dossier_v2_technical_delivery_independent",
|
||||
"date": "2026-10-27",
|
||||
"user_direction": "A ideia não é gerir concursos mas sim as oportunidades que geram.",
|
||||
"case_id": "CB-METROLOGIA-20261027",
|
||||
"baseline": "4f9450a71dcc03f17abe953c956956249798d4c0",
|
||||
"technical_candidate_preserved": "1afab4a2a71f182f260e4d2555d79242261a4d2a",
|
||||
"runtime_unchanged": "3439f35038f15c93224e6cf876bf559135824d13",
|
||||
"branch": "codex/proactive-opportunity-model-qa-20261027",
|
||||
"proof": {
|
||||
"case_id": "CB-METROLOGIA-20261027",
|
||||
"record_id": 401,
|
||||
"dossier_id": "894343c7-c33d-452e-a6a5-b6675f77ee23",
|
||||
"previous_source_version": 1,
|
||||
"new_source_version": 2,
|
||||
"before_context_revision": 1,
|
||||
"after_context_revision": 2,
|
||||
"direction": "Investment opportunity generated by demand;not tender management",
|
||||
"need_state": "hypothesis",
|
||||
"evidence_count": 7,
|
||||
"private_draft_not_published": true,
|
||||
"dossier_source_refreshed_through_preview_and_confirmation": true,
|
||||
"deliberate_dossier_fields_unchanged": true,
|
||||
"previous_audit_rows_unchanged": true,
|
||||
"no_new_entities_or_grants": true,
|
||||
"no_new_application_code": true,
|
||||
"accepted_technical_proofs_reused": true,
|
||||
"no_contact_or_server_operations": true,
|
||||
"QA_database": "proactive_investment_20261027_test",
|
||||
"row_preservation": {
|
||||
"opportunities": {
|
||||
"old_rows_unchanged": 52,
|
||||
"updated_case_rows_only": [
|
||||
"401"
|
||||
],
|
||||
"new_rows": 0
|
||||
},
|
||||
"desk_cases": {
|
||||
"old_rows_unchanged": 17,
|
||||
"updated_case_rows_only": [
|
||||
"894343c7-c33d-452e-a6a5-b6675f77ee23"
|
||||
],
|
||||
"new_rows": 0
|
||||
},
|
||||
"projects": {
|
||||
"old_rows_unchanged": 19,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"geo_locations": {
|
||||
"old_rows_unchanged": 1921,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"sectors": {
|
||||
"old_rows_unchanged": 12,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"documents": {
|
||||
"old_rows_unchanged": 63,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"value_chains": {
|
||||
"old_rows_unchanged": 0,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"audit_events": {
|
||||
"old_rows_unchanged": 388,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 3
|
||||
}
|
||||
}
|
||||
},
|
||||
"focus": "Recurring complementary service generated by documented demand;customer problem,value,partners and resources",
|
||||
"new_sources": [
|
||||
{
|
||||
"title": "Anúncio HCB17/08/2026,051/2026",
|
||||
"url": "https://www.diarioeconomico.co.mz/wp-content/uploads/2026/08/concurso-hcb-tender-document-docu-mo-ambique-2026-1.pdf",
|
||||
"sha256": "bb4c33064e5d49504d8a85ac88ad1b847cfa6c69e1016e3ab588ff785b205c1f",
|
||||
"pages": 2,
|
||||
"visually_read": [
|
||||
1,
|
||||
2
|
||||
],
|
||||
"role": "Demand evidence and scope;not a new tender workflow"
|
||||
},
|
||||
{
|
||||
"title": "IPAC M0100 INNOQ–LM",
|
||||
"url": "https://www.ipac.pt/pesquisa/ficha_lac.asp?ID=M0100",
|
||||
"consulted": "2026-10-27",
|
||||
"technical_annex": "2026-02-17",
|
||||
"binary_snapshot": null,
|
||||
"binary_download_error": "Connection reset;web reading available",
|
||||
"role": "Potential national laboratory capability by scope;no partnership or full HCB eligibility granted"
|
||||
}
|
||||
],
|
||||
"commercial_questions": [
|
||||
"Que problema operacional recorrente existe no ciclo dos instrumentos e como é resolvido actualmente?",
|
||||
"Quais as famílias/modelos/gamas,quantidades,pontos e periodicidades?Que critérios de aceitação e prazo de devolução?",
|
||||
"O ciclo actual já está coberto?Que necessidade futura permanece e quando?",
|
||||
"Aceitaria serviço local associado?Que parte pode ser prestada fora do laboratório e com que responsabilidades?",
|
||||
"Qual o custo e tempo totais da solução actual e que melhoria justificaria pagar por apoio local?"
|
||||
],
|
||||
"partner_questions": [
|
||||
"Que instrumentos,gamas,pontos,incertezas,locais e prazos consegue cobrir hoje?",
|
||||
"Qual o âmbito acreditado/competência aplicável e que serviços ficam fora dele?",
|
||||
"Tem equipa,meios,disponibilidade e interesse em associação para apoio no Songo?",
|
||||
"Quais as responsabilidades,preços,transporte/embalagem/seguro e condições de custódia e rastreabilidade?"
|
||||
],
|
||||
"decision_paths": [
|
||||
{
|
||||
"condition": "Customer confirms recurring need,actual problem and willingness to consider service",
|
||||
"action": "Match partners and equivalent quotes;quantify business model before qualifying opportunity"
|
||||
},
|
||||
{
|
||||
"condition": "Past purchase satisfied current cycle;documented future need remains",
|
||||
"action": "Prepare future service horizon with actual timing,volume and conditions;do not reopen past tender"
|
||||
},
|
||||
{
|
||||
"condition": "Customer confirms current need fulfilled and no future/recurring need for proposed service",
|
||||
"action": "Archive hypothesis with dated buyer evidence and retain dossier history;do not treat missing information as no demand"
|
||||
},
|
||||
{
|
||||
"condition": "Data insufficient",
|
||||
"action": "Keep private hypothesis;affects only this business case,not technical delivery"
|
||||
}
|
||||
],
|
||||
"economic_comparison": {
|
||||
"basis": "Same instruments,quantity,frequency,quality,place and period;current solution vs proposed associated service",
|
||||
"current_solution_total": null,
|
||||
"proposed_service_total": null,
|
||||
"quantity": null,
|
||||
"period": null,
|
||||
"net_advantage": null,
|
||||
"missing_is_not_zero": true,
|
||||
"inputs": [
|
||||
"Laboratory service quotes",
|
||||
"Total transport/packing/insurance and return",
|
||||
"Local support cost",
|
||||
"Nonduplicated incremental fixed costs for same period",
|
||||
"Instrument turnaround days and substantiated operational impact"
|
||||
],
|
||||
"decision": "No positive advantage assumed;compare cost and time separately until both are measured. No generic wage,distance,tax or downtime assumptions."
|
||||
},
|
||||
"public_search_scope_limit": "No identifiable award/execution or2027commitment located in consulted public sources;absence of result is not proof of no contract. Supplier portal timed out via web and local TLS issuer verification failed;not bypassed. No further repeated search planned without new document or buyer input.",
|
||||
"not_a_tender_management_increment": true,
|
||||
"technical_release_independent_of_commercial_case": true,
|
||||
"no_installation_publication_or_external_messages": true,
|
||||
"L8_preserved": "14360748194f3658d91a7d7ae5615efd0fcbfbb7",
|
||||
"SGF_untouched": true,
|
||||
"evidence_directory": "outputs/proactive-commercial-followup-20261027",
|
||||
"matrix_ids": [
|
||||
"RF-CLU-003",
|
||||
"MASTER-471012ab-0010",
|
||||
"MASTER-9dee08d0-0067",
|
||||
"MASTER-471012ab-0067"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
{
|
||||
"status": "real_source_preliminary_case_demonstrated_private_QA_not_published",
|
||||
"date": "2026-10-27",
|
||||
"case_id": "CB-METROLOGIA-20261027",
|
||||
"baseline_candidate": "1afab4a2a71f182f260e4d2555d79242261a4d2a",
|
||||
"runtime_unchanged": "3439f35038f15c93224e6cf876bf559135824d13",
|
||||
"branch": "codex/proactive-real-pilot-qa-20261027",
|
||||
"new_application_code": false,
|
||||
"QA_database": "proactive_investment_20261027_test",
|
||||
"proof": {
|
||||
"case_id": "CB-METROLOGIA-20261027",
|
||||
"record_id": 401,
|
||||
"dossier_id": "894343c7-c33d-452e-a6a5-b6675f77ee23",
|
||||
"QA_only": true,
|
||||
"real_primary_sources": true,
|
||||
"synthetic_operator_only": true,
|
||||
"created_saved_recovered_via_existing_UI": true,
|
||||
"existing_private_dossier": true,
|
||||
"need_state": "hypothesis",
|
||||
"past_procurement_dates_explicit": true,
|
||||
"client_potential_not_committed": true,
|
||||
"all_five_evidence_entries_retained": true,
|
||||
"internal_workbook_reference_retained_privately": true,
|
||||
"territory_preserved": true,
|
||||
"no_economic_numbers_invented": true,
|
||||
"no_publication_action": true,
|
||||
"no_external_messages": true,
|
||||
"anonymous_dossier_denied": true,
|
||||
"accepted_technical_suites_not_repeated": true,
|
||||
"errors": []
|
||||
},
|
||||
"private_record": {
|
||||
"record_id": 401,
|
||||
"status": "draft",
|
||||
"not_published": true,
|
||||
"unknown_amount_preserved": true,
|
||||
"unknown_real_promoter_preserved": true,
|
||||
"QA_database": "proactive_investment_20261027_test"
|
||||
},
|
||||
"selection": {
|
||||
"selected": "Cahora Bassa",
|
||||
"reason": "Acervo empresarial interno com referências locais + relatório primário HCB2024 + plano primário compras2026 com serviço delimitado. É a combinação de fontes mais directamente utilizável nesta leitura dirigida.",
|
||||
"alternatives": [
|
||||
{
|
||||
"pilot": "Montepuez",
|
||||
"available": "Registos empresariais internos e documentação pública mineira; não se seleccionou um procedimento primário e necessidade tão delimitados nesta ronda.",
|
||||
"limitation": "Não equivale a falta de actividade ou inexistência de necessidades. Sem ranking económico."
|
||||
},
|
||||
{
|
||||
"pilot": "Gurué",
|
||||
"available": "Registos internos com actividades ligadas ao chá e referências públicas territoriais; as fontes de constrangimentos localizadas são antigas ou não delimitam uma procura actual específica.",
|
||||
"limitation": "O piloto continua válido para estudo posterior; não se presume que os constrangimentos antigos persistem."
|
||||
}
|
||||
]
|
||||
},
|
||||
"idea": "Associação de apoio local no Songo com laboratório qualificado para apoio metrológico à HCB; hipótese comercial.",
|
||||
"known_vs_unknown": {
|
||||
"known": "Actividade HCB e necessidade planeada de calibração2026; referências empresariais históricas internas.",
|
||||
"unknown": "Estado/recorrência da contratação,procura por satisfazer,volume,requisitos,oferta e parceiros actuais,preços,meios e viabilidade.",
|
||||
"not_inferred": "Concurso aberto,adjudicação,ausência de oferta,disponibilidade comercial,contrato,acesso,terra,energia ou benefício fiscal."
|
||||
},
|
||||
"source_manifest": [
|
||||
{
|
||||
"alias": "companies.xlsx",
|
||||
"original": "C:\\Mac\\Home\\Documents\\TEMPO\\Portal Tempo\\Dados de empresas\\EMPRESAS_LIST 2014-2022.xlsx",
|
||||
"bytes": 26586267,
|
||||
"sha256": "1ba4c4114b16b407e7746712d00d4f681246bbbc1b42351e96a31f7129acad30",
|
||||
"use": "private analytical read-only working copy; original unchanged"
|
||||
},
|
||||
{
|
||||
"alias": "licensed.xlsx",
|
||||
"original": "C:\\Mac\\Home\\Documents\\TEMPO\\Portal Tempo\\Servicos Tempo\\Relatorios\\novos\\docs\\Empresas Licenciadas.xlsx",
|
||||
"bytes": 34940776,
|
||||
"sha256": "1b5087b464e39e88c42def39655c2391aaaf684b4c832d6a77ff274b98889f00",
|
||||
"use": "private analytical read-only working copy; original unchanged"
|
||||
},
|
||||
{
|
||||
"alias": "tourism.xlsx",
|
||||
"original": "C:\\Mac\\Home\\Documents\\TEMPO\\Portal Tempo\\Servicos Tempo\\Relatorios\\novos\\docs\\CADASTRO DE EMPREENDIMENTOS TURISTICOS 3, 4 E 5 ESTRELAS 30.10.24 18,00h.xlsx",
|
||||
"bytes": 73955,
|
||||
"sha256": "f02e086ed4973ef17234aa6cc54b98fbb7a6952ffb16ec4dc4f7d0c72af6400c",
|
||||
"use": "private analytical read-only working copy; original unchanged"
|
||||
},
|
||||
{
|
||||
"alias": "hcb-concession.pdf",
|
||||
"original": "C:\\Mac\\Home\\Documents\\TEMPO\\Portal Tempo\\Legislacao\\MIREME\\HCB-TERMOS-DO-CONTRATO-DE-CONCESSAO.pdf",
|
||||
"bytes": 142063,
|
||||
"sha256": "f4afc62f140d197cae3bf395674adce2eba37f0436261d52d7eb554f6230a073",
|
||||
"use": "private analytical read-only working copy; original unchanged"
|
||||
},
|
||||
{
|
||||
"alias": "hcb-plan-2026.pdf",
|
||||
"url": "https://igepe.org.mz/wp-content/uploads/2026/06/HCB-Plano-Anual-de-Aquisicoes-2026.pdf",
|
||||
"bytes": 319956,
|
||||
"sha256": "cbc93102fea61a712c193d1c1815e7ec19e7d570ee2703c1b1390d4c05e5bd8e",
|
||||
"accessed": "2026-10-27",
|
||||
"use": "read-only primary source; no portal publication/import"
|
||||
},
|
||||
{
|
||||
"alias": "hcb-report-2024.pdf",
|
||||
"url": "https://hcbadm.mzbusiness.com/wp-content/uploads/2025/08/Relatorio-e-Contas-2024-Bilingue-VF-1.pdf",
|
||||
"bytes": 8215895,
|
||||
"sha256": "d0fed6af0e40fffd6f7f385152fdbfff2a10cae0b66c9d7a59a0a99658758080",
|
||||
"accessed": "2026-10-27",
|
||||
"use": "read-only primary source; no portal publication/import"
|
||||
},
|
||||
{
|
||||
"alias": "hcb-hidroelectricidade.html",
|
||||
"url": "https://www.hcb.co.mz/hidroelectricidade",
|
||||
"bytes": 52772,
|
||||
"sha256": "c5de0e6204909c6cdaea7b249c79897f1cc8539c4f58e4704e4d5844f9542a49",
|
||||
"accessed": "2026-10-27",
|
||||
"use": "read-only primary source; no portal publication/import"
|
||||
},
|
||||
{
|
||||
"alias": "cae.xlsx",
|
||||
"original": "C:/Mac/Home/Documents/TEMPO/Portal Tempo/Dados de empresas/CAE eBAU.xlsx",
|
||||
"bytes": 75018,
|
||||
"sha256": "83b4f1200988e99834c2ae3915346fbf237d128308554b67b5a080d4956bf506",
|
||||
"use": "read-only supplied code labels B857/F857 and B859/F859; not current official-version inference"
|
||||
}
|
||||
],
|
||||
"originals_unchanged": [
|
||||
{
|
||||
"alias": "companies.xlsx",
|
||||
"original_unchanged": true,
|
||||
"sha256": "1ba4c4114b16b407e7746712d00d4f681246bbbc1b42351e96a31f7129acad30"
|
||||
},
|
||||
{
|
||||
"alias": "licensed.xlsx",
|
||||
"original_unchanged": true,
|
||||
"sha256": "1b5087b464e39e88c42def39655c2391aaaf684b4c832d6a77ff274b98889f00"
|
||||
},
|
||||
{
|
||||
"alias": "tourism.xlsx",
|
||||
"original_unchanged": true,
|
||||
"sha256": "f02e086ed4973ef17234aa6cc54b98fbb7a6952ffb16ec4dc4f7d0c72af6400c"
|
||||
},
|
||||
{
|
||||
"alias": "hcb-concession.pdf",
|
||||
"original_unchanged": true,
|
||||
"sha256": "f4afc62f140d197cae3bf395674adce2eba37f0436261d52d7eb554f6230a073"
|
||||
},
|
||||
{
|
||||
"alias": "cae.xlsx",
|
||||
"original_unchanged": true,
|
||||
"sha256": "83b4f1200988e99834c2ae3915346fbf237d128308554b67b5a080d4956bf506"
|
||||
}
|
||||
],
|
||||
"old_QA_rows_unchanged": {
|
||||
"opportunities": {
|
||||
"old_rows_unchanged": 52,
|
||||
"new_rows": 1
|
||||
},
|
||||
"desk_cases": {
|
||||
"old_rows_unchanged": 17,
|
||||
"new_rows": 1
|
||||
},
|
||||
"projects": {
|
||||
"old_rows_unchanged": 19,
|
||||
"new_rows": 0
|
||||
},
|
||||
"geo_locations": {
|
||||
"old_rows_unchanged": 1921,
|
||||
"new_rows": 0
|
||||
},
|
||||
"sectors": {
|
||||
"old_rows_unchanged": 12,
|
||||
"new_rows": 0
|
||||
},
|
||||
"documents": {
|
||||
"old_rows_unchanged": 63,
|
||||
"new_rows": 0
|
||||
},
|
||||
"value_chains": {
|
||||
"old_rows_unchanged": 0,
|
||||
"new_rows": 0
|
||||
}
|
||||
},
|
||||
"technical_accepted_tests_not_repeated": true,
|
||||
"economic_payload_and_recovered_context_private_only": true,
|
||||
"new_publication": false,
|
||||
"external_contact": false,
|
||||
"server_operations": false,
|
||||
"SGF_changes": false,
|
||||
"L8_preserved": "14360748194f3658d91a7d7ae5615efd0fcbfbb7",
|
||||
"matrix_ids": [
|
||||
"RF-CLU-003",
|
||||
"MASTER-471012ab-0010",
|
||||
"MASTER-9dee08d0-0067",
|
||||
"MASTER-471012ab-0067"
|
||||
],
|
||||
"local_proof_directory": "outputs/proactive-real-pilot-20261027",
|
||||
"private_report": "outputs/proactive-real-pilot-20261027/real-case-private-report.html",
|
||||
"next_action": "Preparar reunião exploratória com as perguntas de estado/recorrência,âmbito técnico,oferta,associação e vantagem;nenhuma mensagem enviada."
|
||||
}
|
||||
@@ -0,0 +1,243 @@
|
||||
{
|
||||
"status": "private_regional_opportunity_hypothesis_v3_sustainability_not_demonstrated",
|
||||
"date": "2026-10-27",
|
||||
"baseline": "52f54655d2827e97da2f15d14033e9a2713dddf1",
|
||||
"branch": "codex/proactive-regional-clients-qa-20261027",
|
||||
"runtime_unchanged": "3439f35038f15c93224e6cf876bf559135824d13",
|
||||
"case_id": "CB-METROLOGIA-20261027",
|
||||
"proof": {
|
||||
"case_id": "CB-METROLOGIA-20261027",
|
||||
"record_id": 401,
|
||||
"dossier_id": "894343c7-c33d-452e-a6a5-b6675f77ee23",
|
||||
"previous_source_version": 2,
|
||||
"new_source_version": 3,
|
||||
"before_context_revision": 2,
|
||||
"after_context_revision": 3,
|
||||
"direction": "Regional complementary investment opportunity;three additional prospects,commercial data missing",
|
||||
"need_state": "hypothesis",
|
||||
"evidence_count": 11,
|
||||
"private_draft_not_published": true,
|
||||
"dossier_source_refreshed_through_preview_and_confirmation": true,
|
||||
"deliberate_dossier_fields_unchanged": true,
|
||||
"previous_audit_rows_unchanged": true,
|
||||
"no_new_entities_or_grants": true,
|
||||
"no_new_application_code": true,
|
||||
"accepted_technical_proofs_reused": true,
|
||||
"no_contact_or_server_operations": true,
|
||||
"QA_database": "proactive_investment_20261027_test",
|
||||
"row_preservation": {
|
||||
"opportunities": {
|
||||
"old_rows_unchanged": 52,
|
||||
"updated_case_rows_only": [
|
||||
"401"
|
||||
],
|
||||
"new_rows": 0
|
||||
},
|
||||
"desk_cases": {
|
||||
"old_rows_unchanged": 17,
|
||||
"updated_case_rows_only": [
|
||||
"894343c7-c33d-452e-a6a5-b6675f77ee23"
|
||||
],
|
||||
"new_rows": 0
|
||||
},
|
||||
"projects": {
|
||||
"old_rows_unchanged": 19,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"geo_locations": {
|
||||
"old_rows_unchanged": 1921,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"sectors": {
|
||||
"old_rows_unchanged": 12,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"documents": {
|
||||
"old_rows_unchanged": 63,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"value_chains": {
|
||||
"old_rows_unchanged": 0,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 0
|
||||
},
|
||||
"audit_events": {
|
||||
"old_rows_unchanged": 391,
|
||||
"updated_case_rows_only": [],
|
||||
"new_rows": 3
|
||||
}
|
||||
}
|
||||
},
|
||||
"commercial_data_statement": {
|
||||
"source": "User reply",
|
||||
"date": "2026-10-27",
|
||||
"text": "Ainda não há dados comerciais"
|
||||
},
|
||||
"assessment": "Compatibilidade técnica regional justifica prospecção adicional;procura recorrente,custos,capacidade disponível e sustentabilidade ainda não demonstrados.",
|
||||
"prospects": [
|
||||
{
|
||||
"entity": "HCB",
|
||||
"area": "Songo/Cahora Bassa",
|
||||
"known": "Necessidade metrológica documentada em2026",
|
||||
"status": "Cliente potencial inicial;procura actual/recorrente por confirmar",
|
||||
"quantity": null,
|
||||
"frequency": null,
|
||||
"price": null,
|
||||
"confirmed_order": null,
|
||||
"source": "Fundamento anterior preservado"
|
||||
},
|
||||
{
|
||||
"entity": "Vulcan Mozambique",
|
||||
"area": "Moatize",
|
||||
"known": "Mina,processamento e equipamentos de produção descritos pela própria empresa",
|
||||
"hypothesis": "Instrumentação de processo/manutenção pode beneficiar de apoio metrológico",
|
||||
"status": "Prospecto,não cliente confirmado",
|
||||
"quantity": null,
|
||||
"frequency": null,
|
||||
"price": null,
|
||||
"confirmed_order": null,
|
||||
"related_entity": "Nacala Logistics",
|
||||
"independent_purchase_confirmed": null,
|
||||
"source": "https://www.vulcaninternational.com/products-services/"
|
||||
},
|
||||
{
|
||||
"entity": "EDM",
|
||||
"area": "Tete/Moatize;unidade compradora por identificar",
|
||||
"known": "Plano2025,p68:calibração/teste a nível empresarial;activos deTete/Moatize referenciados",
|
||||
"hypothesis": "Verificar inventário regional e interesse em apoio associado",
|
||||
"status": "Prospecto;sem volume regional atribuído",
|
||||
"quantity": null,
|
||||
"frequency": null,
|
||||
"price": null,
|
||||
"confirmed_order": null,
|
||||
"source": "https://cdn.edm.co.mz/website/imprensa/Plano_Actividades_Orcamento_2025.pdf"
|
||||
},
|
||||
{
|
||||
"entity": "Nacala Logistics",
|
||||
"legal_buyer": null,
|
||||
"area": "Segmento Moatize",
|
||||
"known": "Operação ferroviária/manutenção;concessionárias indicam Vulcan como accionista",
|
||||
"hypothesis": "Verificar instrumentos de manutenção,localização e decisão de compra",
|
||||
"status": "Prospecto ligado àVulcan;diversificação independente não demonstrada",
|
||||
"quantity": null,
|
||||
"frequency": null,
|
||||
"price": null,
|
||||
"confirmed_order": null,
|
||||
"related_entity": "Vulcan Mozambique",
|
||||
"independent_purchase_confirmed": null,
|
||||
"source": "https://www.nacalalogistics.com/quem-somos/"
|
||||
}
|
||||
],
|
||||
"future_excluded_from_base": [
|
||||
{
|
||||
"entity": "Mphanda Nkuwa/GMNK",
|
||||
"status": "Projecto em desenvolvimento",
|
||||
"reason": "Necessidade e datas de operação futuras não demonstradas;sem receitas ou volume na base",
|
||||
"source": "https://www.gmnk.co.mz/en/about-us/project-description/"
|
||||
}
|
||||
],
|
||||
"buyer_data_needed": [
|
||||
"Entidade e centro de decisão/compra;relação com outros prospectos",
|
||||
"Inventário por família/modelo/gama/pontos/critério de aceitação",
|
||||
"Quantidade por janela e periodicidade efectiva de cada instrumento;sem anualizar por defeito",
|
||||
"Solução actual,prestador,prazo fora de serviço,custo total e necessidade ainda não satisfeita",
|
||||
"Interesse e condições de compra para lote/missão ou avença;horizonte de procura"
|
||||
],
|
||||
"partner_capacity_needed": [
|
||||
"Âmbito técnico e local permitido de execução por instrumento,com rastreabilidade",
|
||||
"Capacidade efectivamente disponível e prazo para cada janela;equipa e meios",
|
||||
"Preços por âmbito/lote,embalagem,transporte/seguro,custódia e responsabilidades",
|
||||
"Comprovar capacidade actual dos prestadores locais históricos;licença/CAE não é acreditação de calibração"
|
||||
],
|
||||
"frequency": {
|
||||
"confirmed_programs": null,
|
||||
"confirmed_annual_events": null,
|
||||
"rule": "Usar inventário e programa do proprietário;frequência por família/risco/uso e condições do serviço,não prazo do anúncio nem regra anual presumida."
|
||||
},
|
||||
"economics": {
|
||||
"analysis_unit": "Missão/lote comparável,com famílias e quantidades explícitas;período de análise comum",
|
||||
"mission_contribution": "Receita acordada da missão menos serviço laboratorial,apoio directo,transporte de ida/retorno,embalagem/seguro e outros custos incrementais da mesma missão.",
|
||||
"period_operating_balance": "Soma das contribuições de missões confirmadas menos custos fixos incrementais do mesmo período.",
|
||||
"double_count_prevention": "Transporte partilhado contado uma vez por missão;custos fixos não entram também na contribuição se subtraídos no período. Não somar volumes nacionais à carteira regional ou activos comuns duas vezes.",
|
||||
"sustainability_condition": "Cobertura operacional não basta:avaliar investimento,reposição,fundo de maneio e prazos de recebimento;testar concentração e perda de cliente antes de declarar serviço sustentável.",
|
||||
"numeric_inputs": {
|
||||
"missions": null,
|
||||
"instruments": null,
|
||||
"period": null,
|
||||
"prices": null,
|
||||
"laboratory_cost": null,
|
||||
"local_support_cost": null,
|
||||
"route_cost": null,
|
||||
"fixed_cost": null,
|
||||
"investment": null,
|
||||
"working_capital": null,
|
||||
"net_advantage": null,
|
||||
"break_even": null
|
||||
},
|
||||
"missing_is_not_zero": true,
|
||||
"scenarios_to_compare": [
|
||||
"Atendimento individual no Songo",
|
||||
"Missões agrupadas Songo–Tete/Moatize,apenas com janelas compatíveis",
|
||||
"Organização de apoio em Tete/Moatize com deslocação ao Songo;sem mudança canónica presumida"
|
||||
],
|
||||
"not_used_as_price": "Orçamento2025daEDM,capacidade de produção da mina,tarifas ferroviárias ou preços fictícios."
|
||||
},
|
||||
"source_register": [
|
||||
{
|
||||
"file": "vulcan.html",
|
||||
"url": "https://www.vulcaninternational.com/products-services/",
|
||||
"sha256": "44c92a7a405e7b84f51a6602a487ee4cbcb5e9d3ed42d6c9b2a47f55ba01800e",
|
||||
"bytes": 64512,
|
||||
"accessed": "2026-10-27",
|
||||
"use": "Private source copy;no automatic portal import/publication"
|
||||
},
|
||||
{
|
||||
"file": "nacala-company.html",
|
||||
"url": "https://www.nacalalogistics.com/quem-somos/",
|
||||
"sha256": "4c8c2f98a94f013ab463937c1ac343e26af2ea5fe82226764168b766dfea2c55",
|
||||
"bytes": 246823,
|
||||
"accessed": "2026-10-27",
|
||||
"use": "Private source copy;no automatic portal import/publication"
|
||||
},
|
||||
{
|
||||
"file": "nacala-operations.html",
|
||||
"url": "https://www.nacalalogistics.com/faq/",
|
||||
"sha256": "21f70dbbb8a9ea99f0ca3af728aa3b6a888e361994d78dae5292813437acdd9f",
|
||||
"bytes": 214596,
|
||||
"accessed": "2026-10-27",
|
||||
"use": "Private source copy;no automatic portal import/publication"
|
||||
},
|
||||
{
|
||||
"file": "edm-plan-2025.pdf",
|
||||
"url": "https://cdn.edm.co.mz/website/imprensa/Plano_Actividades_Orcamento_2025.pdf",
|
||||
"sha256": "8e25e3070062e6cad4a39449cb6d494263671506ff7bc71ce100787ae1bd80f1",
|
||||
"bytes": 25468134,
|
||||
"accessed": "2026-10-27",
|
||||
"use": "Private source copy;no automatic portal import/publication"
|
||||
},
|
||||
{
|
||||
"file": "gmnk-project.html",
|
||||
"url": "https://www.gmnk.co.mz/en/about-us/project-description/",
|
||||
"sha256": "705afaaba50074812aaf0884cd8757cfaba1e32dd83f90726d8755869b72d5f8",
|
||||
"bytes": 188060,
|
||||
"accessed": "2026-10-27",
|
||||
"use": "Private source copy;no automatic portal import/publication"
|
||||
}
|
||||
],
|
||||
"technical_delivery_independent": true,
|
||||
"no_publication_installation_or_external_messages": true,
|
||||
"accepted_proofs_reused": true,
|
||||
"L8_preserved": "14360748194f3658d91a7d7ae5615efd0fcbfbb7",
|
||||
"SGF_untouched": true,
|
||||
"evidence_directory": "outputs/proactive-regional-clients-20261027",
|
||||
"matrix_ids": [
|
||||
"RF-CLU-003",
|
||||
"MASTER-471012ab-0010",
|
||||
"MASTER-9dee08d0-0067",
|
||||
"MASTER-471012ab-0067"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
{
|
||||
"date": "2026-10-27",
|
||||
"status": "team_UI_delta_demonstrated_consolidated_candidate_not_installed",
|
||||
"branch": "codex/proactive-team-autonomy-qa-20261027",
|
||||
"runtime_commit": "51d536b7ba0d525323200418155459620ec07e41",
|
||||
"previous_candidate": "403c444a3e14e0ed83276ca318ad95083195708f",
|
||||
"accepted_technical_candidate": "1afab4a2a71f182f260e4d2555d79242261a4d2a",
|
||||
"main_checked": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"main_ancestor": true,
|
||||
"delta": "InvestmentComplements:authorised private preparation returns no public offers;public complements and access checks preserved",
|
||||
"new_tests": {
|
||||
"count": 2,
|
||||
"assertions": 18,
|
||||
"result": "passed",
|
||||
"scope": "private complement lookup,mixed public/private sources,unauthorised access",
|
||||
"transaction_rollback": true
|
||||
},
|
||||
"proof": {
|
||||
"record_id": 403,
|
||||
"dossier_id": "5bc28554-a2d1-4e60-9181-93ba0ecede59",
|
||||
"source_version": 4,
|
||||
"previous_context_revision": 1,
|
||||
"context_revision": 2,
|
||||
"same_dossier_continued": true,
|
||||
"private_source": true,
|
||||
"need_state": "hypothesis",
|
||||
"document_id": "19abe9ce-4c3f-4d53-b960-7ce0fc00435e",
|
||||
"resource_id": "d2c76068-3856-420c-8d2d-272684e92b70",
|
||||
"response_sha256": "b6cb6a7b7230a75bf5f4d56a7a2c1ac0dec7bb0fae0b85381eda56e53f0977c5",
|
||||
"scan": "clean",
|
||||
"scan_engine": "ClamAV",
|
||||
"download_matches_original": true,
|
||||
"response_reference_recovered_in_analysis_and_dossier": true,
|
||||
"deliberate_title_preserved": true,
|
||||
"old_source_snapshot_preserved": true,
|
||||
"new_UI_workflow": "normal login/MFA;create private draft;upload/recover original;associate response;revise idea;private dossier preview/confirm;edit again;continue same dossier;preview/confirm/reload",
|
||||
"no_service_or_SQL_writes_for_demonstration": true,
|
||||
"read_only_verification": true,
|
||||
"no_actual_team_training_session_claimed": true,
|
||||
"row_preservation": {
|
||||
"opportunities": {
|
||||
"old_rows_unchanged": 54,
|
||||
"new_rows": 1
|
||||
},
|
||||
"desk_cases": {
|
||||
"old_rows_unchanged": 19,
|
||||
"new_rows": 1
|
||||
},
|
||||
"documents": {
|
||||
"old_rows_unchanged": 63,
|
||||
"new_rows": 1
|
||||
},
|
||||
"opportunity_documents": {
|
||||
"old_rows_unchanged": 0,
|
||||
"new_rows": 1
|
||||
},
|
||||
"projects": {
|
||||
"old_rows_unchanged": 19,
|
||||
"new_rows": 0
|
||||
},
|
||||
"geo_locations": {
|
||||
"old_rows_unchanged": 1921,
|
||||
"new_rows": 0
|
||||
},
|
||||
"sectors": {
|
||||
"old_rows_unchanged": 12,
|
||||
"new_rows": 0
|
||||
},
|
||||
"value_chains": {
|
||||
"old_rows_unchanged": 0,
|
||||
"new_rows": 0
|
||||
},
|
||||
"organizations": {
|
||||
"old_rows_unchanged": 3,
|
||||
"new_rows": 0
|
||||
},
|
||||
"audit_events": {
|
||||
"old_rows_unchanged": 399,
|
||||
"new_rows": 10
|
||||
}
|
||||
},
|
||||
"Songo401_and_Gurue402_unchanged": true,
|
||||
"new_masters_or_grants": false,
|
||||
"publication_or_contact_external": false,
|
||||
"accepted_unaffected_suites_reused": true
|
||||
},
|
||||
"accepted_proofs_reused": [
|
||||
"14 API/139 assertions",
|
||||
"7 frontend report tests",
|
||||
"normal login/MFA and create/edit/history",
|
||||
"explicit publication/anonymous access controls",
|
||||
"Wayfinder --with-form",
|
||||
"TypeScript",
|
||||
"isolated QA frontend build"
|
||||
],
|
||||
"frontend_changed": false,
|
||||
"schema_or_configuration_changed": false,
|
||||
"no_new_roles_or_grants": true,
|
||||
"pilots_not_published_or_modified": [
|
||||
401,
|
||||
402
|
||||
],
|
||||
"commercial_outreach": false,
|
||||
"human_team_training_claimed": false,
|
||||
"L8_preserved": "14360748194f3658d91a7d7ae5615efd0fcbfbb7",
|
||||
"server_operations": false,
|
||||
"installation_conditions": [
|
||||
"fresh capacity/inodes measurement against build and backup requirements",
|
||||
"recheck current main",
|
||||
"fresh backup/restore",
|
||||
"keep active release until new ready",
|
||||
"verify served revision and installed delta only"
|
||||
],
|
||||
"private_outputs": "outputs/proactive-team-autonomy-20261027/"
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"date": "2026-10-27",
|
||||
"status": "authorised_prepared_not_installed_SSH_session_unavailable",
|
||||
"authorization": "User explicitly authorised both deliveries,first L8 then proactive,no new authorisation required",
|
||||
"stage1": {
|
||||
"candidate": "c85e772d2fd2be5182eb4d768ddd34d43962bf59",
|
||||
"includes": "14360748194f3658d91a7d7ae5615efd0fcbfbb7",
|
||||
"runtime": "11a6cee981f0a425b0fceefb6ed85485bb298245",
|
||||
"capacity_notes_reconciled": "c85e772d changes documentation only;historical suspension superseded by current explicit authorisation;capacity must be freshly measured",
|
||||
"runtime_delta_files": [
|
||||
"resources/js/components/simulation-form.tsx",
|
||||
"resources/js/components/simulation-irpc-annual.tsx",
|
||||
"resources/js/lib/irpc-annual-settlement.ts",
|
||||
"resources/js/lib/project-dossier-report.ts",
|
||||
"resources/js/lib/project-dossier.ts"
|
||||
]
|
||||
},
|
||||
"stage2": {
|
||||
"runtime_merge_commit": "74f7f93a750cfb88f9816512ee7add6473a3e34f",
|
||||
"branch": "codex/sequential-delivery-20261027",
|
||||
"includes_proactive_candidate": "0ff402a11dbf8d41c499dccd39184fdc20c833f4",
|
||||
"L8_is_ancestor": true,
|
||||
"shared_report_conflict": "Both imports and both row providers retained",
|
||||
"L8_other_runtime_files_byte_identical": [
|
||||
"resources/js/components/simulation-form.tsx",
|
||||
"resources/js/components/simulation-irpc-annual.tsx",
|
||||
"resources/js/lib/irpc-annual-settlement.ts",
|
||||
"resources/js/lib/project-dossier-report.ts"
|
||||
],
|
||||
"proactive_other_runtime_files_byte_identical": true
|
||||
},
|
||||
"local_verification": {
|
||||
"TypeScript": "passed",
|
||||
"isolated_build": "passed",
|
||||
"shared_report_delta": {
|
||||
"scope": "Only shared dossier report merge integration;accepted business-rule suites reused",
|
||||
"annual_rows": 6,
|
||||
"proactive_rows": 10,
|
||||
"annual_report_preserved": true,
|
||||
"private_idea_report_preserved": true,
|
||||
"inputs_unchanged": true,
|
||||
"no_cross_inference": true,
|
||||
"no_QA_data_written_or_published": true
|
||||
},
|
||||
"accepted_suites": "reused,not repeated",
|
||||
"no_database_or_fixture_operations": true
|
||||
},
|
||||
"server": {
|
||||
"SSH_bridge_state": "closed",
|
||||
"key_authentication": "denied with registered host key verified",
|
||||
"fresh_capacity": "not measured in this passage",
|
||||
"fresh_backup": false,
|
||||
"fresh_restore": false,
|
||||
"installation": false,
|
||||
"public_served_revision_read": {
|
||||
"checked_at_UTC": "2026-10-27T10:14:16.489135+00:00",
|
||||
"http_status": 200,
|
||||
"revision": {
|
||||
"commit": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"branch": "main",
|
||||
"built_at": "2026-10-26T14:26:51.629481+00:00",
|
||||
"manifest_sha256": "367be71b25b56a83571d610e211ea11beae2af87989d62ef6cc7b9c54eabf580"
|
||||
},
|
||||
"method": "Public revision read only;no SSH,backup or installation executed"
|
||||
}
|
||||
},
|
||||
"main_at_preparation": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
|
||||
"main_push_executed": false,
|
||||
"required_execution_controls": [
|
||||
"Use existing authenticated local SSH session;do not request authorisation again",
|
||||
"Fresh capacity/inodes,backup and restore per existing procedure;keep active release until candidate ready",
|
||||
"Refresh preparation candidate/base/hashes per stage;do not reuse old dated receipts",
|
||||
"Stage1 only,L8;verify actual served revision and onlyL8 delta",
|
||||
"Only after stage1 confirmed,stage2;fresh guards and verify proactive delta and L8 preservation",
|
||||
"Exclude QA fixtures/outputs/test data from deployment inputs;no seed/import;preserve private pilots",
|
||||
"Return actual installed/served hashes and fresh receipt paths;do not label this local preparation as installation"
|
||||
],
|
||||
"actual_remote_changes": 0
|
||||
}
|
||||
@@ -2522,9 +2522,9 @@ As estimativas são **horas de trabalho técnico**, não calendário nem mediç
|
||||
| L3 — IVA: saldo e fecho do Modelo A | Totais14–18 quando todas as parcelas estão determinadas | Campos19–27 aplicáveis, transporte de crédito, rectificações/substituição, imposto a entregar e pedido de reembolso; estados documentados e relação com tesouraria; via de restituição de bebidas13(2), identificada porG4D e ainda não apurada, conforme procedimento próprio | Execuções mensais, parcelas L1/L2, documentos e histórico | L1/L2 para apuramento integral; saldo anterior identificado e procedimento de reembolso aplicável. Pedido não significa deferimento/recebimento | 48–80 h |
|
||||
| L4 — ISPC: elegibilidade e apuramento | Campos de enquadramento e motor genérico | Regime/actividade/volume elegível, opções/exclusões, escalões/taxas aplicáveis, mínimo, trimestre e retenções específicas; comparação só entre regimes admissíveis | Vendas por actividade, custos, NUIT, natureza jurídica e residência confirmada | Lei9/2025 e regulamentação/período; distinguir receita anual, trimestre e excesso | 40–64 h |
|
||||
| L5 — retenções IRPC e guias | Documentos de compras/vendas e guia M/39 como exemplar | Rendimento pago/recebido, entidade que retém, residente/não residente/EP, evento temporal, excepções e casos digitais/e-money; guia e comprovativo ligados à operação | Contrapartes, facturas, pagamentos, período, moeda, oportunidade | Artigos aplicáveis por rendimento, taxa/convenção se invocada; corrigir remissões do exemplar. Sem submissão electrónica AT presumida | 32–56 h |
|
||||
| L6 — IRPC anual: regime normal | Disponível2f684e59:resultado financeiro→ajustamentos demonstrados→lucro6700→base4400→colecta1408,com provas/persistência/histórico | Saldo concreto:outros ajustamentos ordinários,juros financeiros,amortizações,variações/periodização,perda actual,âmbitos normais adicionais,representação fiscal e correspondênciaM20/M22;ver secção «saldo concreto deL6» | Plano financeiro,dados comuns,activos/livros e histórico;retenções/pagamentos/créditos anuais reservadosL8 | CódigoIRPC/período/caso;benefícios e tratamentos especiais anuaisL7;sem dependência genérica do fechoL8 | Estimativa inicial48–80h;saldo não reestimado |
|
||||
| L7 — IRPC: tratamentos específicos | Contexto sectorial/territorial e fontes cadastradas | Casos identificados: tributação autónoma de despesas e mais-valias, taxas reduzidas/cooperativas, isenções/benefícios e operações especiais com condições rastreadas | Base L6, despesas, activos, relação territorial documentada | Disposição e período por tratamento; localização por si só não concede benefício. Lista de tratamentos aplicáveis explicitada no lote | 48–80 h |
|
||||
| L8 — IRPC: liquidação e pagamentos | Parcelas L5–L7 e formulários originais | PPC/PEC, deduções/créditos, dupla tributação quando aplicável, saldo anual a pagar/recuperar; calendário e reconciliação com pagamentos | Retenções, colecta, saldos anteriores, pagamentos/comprovativos | Base anterior para PPC/PEC, regras de limitação/transporte; não usar cinco anos ou compensação automática sem cotejo específico | 32–56 h |
|
||||
| L6 — IRPC anual: regime normal | Disponível5aaf1a56:percurso normal demonstrado atécolecta,períodos/moedas e preparação parcialM20/M22 | Operacional no âmbito demonstrado por decisãoTempo26/10;limitações explícitas;5grupos código+5documentais preservados;sem conclusão integral | Plano financeiro,dados comuns,activos/livros e histórico;retenções/pagamentos/créditos anuaisL8 | Pendências bloqueiam só os casos dependentes;L7/L8 próprios | Estimativa inicial48–80h;saldo não reestimado |
|
||||
| L7 — IRPC: tratamentos específicos | f8d57bdd instalado;632dc069 e a7434cd2 preservados no percurso | Cumulações demonstradas disponíveis;7famílias de saldo e documentos por caso discriminados;L7parcial | Activos/períodos/saldos/benefícios reutilizados;ordem,limites e incompatibilidades explícitos | Outras combinações/específicos/mistos/transporte próprios;L8delimitado separadamente | Inicial48–80h;saldo não reestimado |
|
||||
| L8 — IRPC: liquidação e pagamentos | Primeiro incremento delimitado,não implementado:colecta válida→retenções recebidas por conta/PPC comprovados→saldo simulado | Residente geral,ano2026/MZN;ausências documentadas dePEC/créditos/autónomos fora do recorte;gravação/recuperação/relatório a demonstrar | Reutiliza colectaL6/L7,L5received/effective/on_account ecomprovativos do próprio sujeito/período | Não abater retenções por conta de terceiros;PEC/créditos/limites próprios;regra de mínimo/versionamento a aplicar;camposM20M22 só bloqueiam transporte afectado | Inicial32–56h;não é previsão actual do recorte |
|
||||
| L9 — INSS: contribuição social | Massa salarial agregada e referência TCO3%+4% | Trabalhadores, remuneração/base contributiva, exclusões, empregador/trabalhador, TCO/TCP, declaração e encargos por período | Equipa/custos, entidade e calendário; cadastro de pessoa partilhado com L10 | Regulamento e alterações aplicáveis, natureza do vínculo; confirmar base antes da taxa. Contribuição social, distinta dos impostos | 24–40 h |
|
||||
| L10 — IRPS: retenção mensal e líquido | Entrada IRPS, custos salariais e escalões anuais documentais | Tabela mensal própria, remunerações/benefícios, situação pessoal relevante, retenção, salário líquido e contribuição ligada a L9 | Mesmo trabalhador/folha salarial, pagamentos e retenções | Tabela mensal do período, residência e condições familiares necessárias; não dividir escalões anuais por12 | 40–64 h |
|
||||
| L11 — IRPS: apuramento anual e outras categorias | Escalões anuais e exemplares M/19/M/20/anexos | Categorias aplicáveis aos rendimentos documentados, actividade independente, capitais/prediais/mais-valias, englobamento/tratamento autónomo, deduções, retenções e saldo | Dados pessoais autorizados, rendimentos/despesas, activos e L10 | Código IRPS/Lei11/2025, âmbito/categoria/período e deduções pessoais; diferenças de edição dos anexos. Não copiar regras IRPC | 48–80 h |
|
||||
@@ -6075,3 +6075,852 @@ Actualização de **AUD-SIM-INT02**, na matriz existente. O percurso instalado e
|
||||
**Provas apenas do delta:** 14 testes frontend; API privada1 teste/78 asserções com transacção revertida na base QA127.0.0.1:55441; geração de routes/actions pelo procedimento existente, TypeScript e build; interface real com edição, taxa/categoria incompatível, falta de juros, gravação/recuperação, download e perda corrente; relatórios/dossier construídos a partir dos dados recuperados. Recibo `docs/investmoz/simulations/irpc-l6-compatible-sets-qa-20261025.json`; pacote/bundle em `outputs/irpc-l6-sets`. Sem alteração de schema, API, configuração, permissões ou dependências.
|
||||
|
||||
**Âmbitos próprios preservados:** L7 conserva benefícios, isenções, taxas reduzidas, tributações autónomas e operações especiais; L8 conserva retenções, pagamentos, créditos e saldo final. M22 campo302 não é preenchido só com a parcela normal300, nem os campos309–316 são preenchidos com zeros presumidos. As dez dúvidas deL5 continuam na mesma matriz, sem nova pesquisa e bloqueando apenas dependências efectivas. L6 continua parcial exclusivamente pelas pendências concretas da tabela; nenhum desses pontos reabre o percurso instalado.
|
||||
|
||||
## 25/10/2026 — conjunto L6 a2de7259 entregue pelo Git
|
||||
|
||||
Instalado `a2de725901c308fb2ac2bc3d72181ab50ef46b7a` sobre `2f684e59`, pelo procedimento Git existente, sem força, migrações ou importações. Backup fresco `2026-10-25T20:34:03Z` e restauro isolado sem rede/porta55441: **174tabelas** conferidas por contagem/checksum; **369ficheiros/configuração** preservados. Conferidos **8ficheiros do delta,38protegidos e31originais**; schema,roles/grants e permissões iguais. Tabelas de negócio preservadas; cache/sessões reconciliadas com os eventos operacionais da entrega. `2f684e59` permanece como versão anterior. Dependências de5versões antigas arquivadas e verificadas para espaço, sem modificar as versões actual/anterior, fontes, dados ou backups.
|
||||
|
||||
Revisão/manifest público,10marcadores compilados e simuladorHTTP200 conferidos. Pipeline normal concluído; as provas QA aceites foram reutilizadas, sem nova ronda manual. **Disponível no âmbito demonstrado: lucro6980 → base4680 → colecta1497,60MZN. O saldo final a pagar/recuperar continua indeterminado emL8.** Também preservados o caso de perda corrente e as distinções conhecido/ausência/falta de informação, os períodos/EP demonstrados e a preparação parcialM20/M22. Recibo:`docs/investmoz/simulations/irpc-l6-sets-delivery-20261025.json`.
|
||||
|
||||
O estado «QA sem instalação» da nota anterior é histórico para este conjunto. **L6 continua parcial pelos seis grupos concretos da secção seguinte**, cada um com condição de resolução e bloqueio delimitado. L7 eL8 mantêm os seus âmbitos.
|
||||
|
||||
|
||||
## 25/10/2026 — saldo curto de L6 após o conjunto a2de7259
|
||||
|
||||
Actualização de **AUD-SIM-INT02 na mesma matriz**, sem novo lote ou backlog. O percurso financeiro → ajustamentos documentados → lucro tributável → matéria colectável → colecta está demonstrado; no caso novo,6980 →4680 →1497,60MZN. A colecta não é saldo final a pagar. As pendências abaixo substituem a enumeração genérica anterior para o saldo actual deL6; não revogam as provas aceites.
|
||||
|
||||
| Caso ou correspondência pendente | Condição concreta de resolução | Limite do bloqueio |
|
||||
|---|---|---|
|
||||
| Custos com limites36(1)e/f/h/i/n, provisões28/29, obras plurianuais19 e componentes de exercícios anteriores18(2). | Implementar a regra de cada categoria a partir do diploma aplicável: parcela contabilizada, limite/base próprios, documentação e exercício de imputação; demonstrar o efeito com sinal nos totais. Nos exercícios anteriores, distinguir o que era imprevisível/manifestamente desconhecido no encerramento. | Só a categoria ou parcela ainda sem regra; os acréscimos36a/b/c/g, juros ordinários e periodização corrente/seguinte demonstrados permanecem utilizáveis. Eventual tributação autónoma pertence aL7. |
|
||||
| Amortizações além dos itensII/3/9 e9.1: restantes tabelas, quotas inferiores, duodécimos, quotas decrescentes, bens usados/reavaliados/intangíveis e recuperação de quotas anteriormente tributadas. | Corresponder categoria/tabela prevalecente, método, entrada em uso, vida útil, base depreciável e quotas contabilizadas/fiscais acumuladas; implementar o cálculo e a reconciliação que impeçam dupla dedução. | Só os activos/métodos afectados. Computadores25% e servidores20% no recorte anual constante e a perda corrente já demonstrada não são reabertos. |
|
||||
| Períodos curtos, transição/liquidação e reconciliação fiscal anual de plano noutra moeda. | Ligar os meses e factos de início/cessação/transição ao período fiscal; implementar os efeitos sobre quotas e contagem das perdas. Para outra moeda, identificar os eventos/datas e a regra de conversão anual aplicável, reutilizando o motor cambial aceite. | Só o período ou origem cambial sem reconciliação. Os períodos anuais emMZN e oEP com imputação documentada conservam o cálculo demonstrado. |
|
||||
| Representação fiscal de fracções de unidade/cêntimo. | Identificar a instrução de representação/arredondamento da edição/campo aplicável ou obter esclarecimento específico daAT; então implementar essa regra conservando o valor racional original. O exemplarM20A.1 pede meticais sem centavos, mas isso não determina sozinho como arredondar uma fracção. | Só a transcrição do valor não exactamente representável. Os cálculos racionais e os valores exactamente representáveis permanecem disponíveis; não é necessária nova validação genérica das fontes. |
|
||||
| M20A.1: discriminação de vendas/serviços, fornecimentos/outros gastos, imposto sobre o rendimento e resultado líquido; M22: campo200 e detalhe dos restantes ajustamentos. | Reutilizar a origem financeira, recolhendo apenas a classificação em falta e o imposto contabilizado; reconciliar resultado antes/depois de imposto e cada ajustamento com a edição aplicável. Não usar a colecta simulada como imposto contabilizado. Completar as correspondências por campo e demonstrar a recuperação/exportação. | Só os campos sem correspondência. M20A.1/Q4 contas6.1.1/6.2/6.5/6.9 e M22 campos259/260,269/270,276/277/278 e300 conservam a preparação parcial demonstrada. |
|
||||
| Transporte de resultado entre ediçõesM20/M22: XLSXM20A.1 remete para201/quadro8; PDFM22 inventariado usa200/quadro10. | Identificar a edição do formulário de destino e corresponder explicitamente o resultado líquido a essa edição; registar a remissão corrigida sem substituir os exemplares ou reutilizar fórmulas antigas por aproximação. | Só esse transporte entre edições; não bloqueia os cálculos independentes nem os outros campos já correspondidos. |
|
||||
|
||||
**L6 continua parcial por estes casos concretos.** Documento ou parâmetro em falta dentro de regra implementada é uma pendência do caso, não outra tarefa genérica deL6. Juros capitalizáveis, relações especiais e tratamentos especiais conservam o enquadramento próprio, sem presumir que satisfazem o recorte de juros ordinários.
|
||||
|
||||
**L7** mantém benefícios, isenções, taxas reduzidas, tributações autónomas e operações especiais. **L8** mantém retenções, pagamentos, créditos e saldo final a pagar/recuperar. A ausência desses tratamentos não reabre o percurso normal entregue nem justifica, por si, «L6 parcial». A divergência documental não autoriza preencher M22 campo302 ou309–316 com zeros presumidos. As dez dúvidas deL5 permanecem válidas e bloqueiam apenas os casos efectivamente dependentes; sem nova pesquisa ou repetição das provas aceites.
|
||||
|
||||
## 26/10/2026 — L6: custos com limites, provisões e periodização em QA
|
||||
|
||||
Actualização de **AUD-SIM-INT02 na mesma matriz**, sobre o conjunto instalado `a2de7259`. **Novo incremento em QA, sem instalação.** O percurso e as provas já aceites deL6/L3/ISPC/câmbio/L5 foram reutilizados; não foram novamente executados os testes funcionais anteriores. A fotografia5 continua actual sem activar os novos campos; a fotografia6 guarda estes mapas e conserva o resultado anterior no histórico.
|
||||
|
||||
**Reutilização e resultado demonstrado:** resultado financeiro6240MZN, acréscimos anteriores220 e mapas anteriores520 conservados; novos ajustamentos de custos/provisões/periodização+350 e obra−600 → **lucro tributável6730MZN**. Dedução expressa das perdas anteriores2300 → **matéria colectável4430MZN**; taxa normal32% → **colecta1417,60MZN**. Não é saldo final a pagar. Nenhum saldo oficial de provisões/perdas é consumido, nem é alterada declaração ou história anterior.
|
||||
|
||||
| Categoria e condição no exercício anual com termo em2026 | Parcela aceite, limite e ajustamento demonstrados | Informação insuficiente ou caso separado |
|
||||
|---|---|---|
|
||||
| Ajudas de custo/deslocação em viatura própria36(1)e: parcelas facturadas e tributadas emIRPS identificadas sem sobreposição. Representação36(1)f/36(3) ordinária documentada. | Ajudas100:facturadas20,tributadas e não facturadas20;remanescente60 →30 acrescido/70 aceite. Representação50 →40 acrescido/10 aceite. Zero conhecido nos parâmetros é distinto de campo vazio. | Parcela facturada/tributada em falta impede a aceitação dependente; não presumir ausência deIRPS. Eventual tributação autónoma continuaL7. |
|
||||
| Publicidade ordinária36(1)n,Lei20/2009: receita declarada reconciliada com vendas normais e completude anual das parcelas. | Um limite anual partilhado de1% de12000=120. Caso com duas parcelas100+100:aceites60+60,acréscimo80. A repartição proporcional é apenas aritmética de simulação, não uma ordem fiscal obrigatória. | Campanha de lançamento com horizonte superior a um ano não recebe este tratamento por aproximação: periodização36-A e articulação do limite permanecem por implementar. |
|
||||
| Encargos com viaturas36(4), combustível36i e aluguer sem condutor36h, distinguindo categoria/serviço público/locação na actividade normal. | Outros encargos100 de passageiros sem excepção:aceite50/acréscimo50. Combustível50 não sujeito a36(4),com40 comprovados no activo/locação e consumo normal:aceite40/acréscimo10. Renda100 no caso documentado de excepção36(4),quota não aceite36h de20:aceite80/acréscimo20; a quota é reutilizada do suporte e não apurada automaticamente. | Se há simultaneamente parcela excluída porh/i e aplicação dos50% de36(4), a combinação fica pendente. Exemplo:fuel100,comprovado80,passageiro sem excepção; não somar nem repartir correcções por presunção. Resolver a regra de articulação dos trechos aplicáveis ou esclarecer esse exemplo especificamente comAT. Apuramento automático da quota36h permanece no saldo de amortizações; só bloqueia esse caso. |
|
||||
| Provisão/perda por imparidade de créditos28a/29: regime ordinário identificado, créditos normais finais e provisão fiscal anterior conhecidos. | Base10000:limite anual1,5%=150,acumulado6%=600. Saldo anterior550 deixa50;provisão contabilística200 →50 aceite/150 acrescido. Duas parcelas100+100 partilham25+25; não repetem os limites nem consomem o saldo oficial. | Saldo anterior vazio não é zero; anterior superior ao tecto pede reconciliação/reversão28(2). Provisões sujeitas a supervisão financeira/seguradora28d ou reforços financeiros28(3) exigem correspondência própria, sem aplicar29 por aproximação. |
|
||||
| Existências28b:perda efectivamente observada. Processo judicial28c:em curso e obrigação subjacente fiscalmente dedutível. | Existências:parcela60,perda total40,provisão anterior10 →30 aceite/30 acrescido. Judicial:parcela90,obrigação100,anterior20 →80 aceite/10 acrescido. Perda não observada ou processo que não esteja em curso são condições negativas conhecidas:acréscimo integral, sem zero presumido como dedução. | Falta de prova do evento,obrigação,perda ou saldo anterior fica indeterminada. Objecto/saldo repetido entre documentos impede reutilizar a cobertura; agregar/reconciliar as parcelas do mesmo objecto. |
|
||||
| Reversões28(2) e provisões anteriormente tributadas:mesmo objecto e tratamento fiscal anterior comprovados. | Provisão antes deduzida:reversão50 já incluída no resultado não acrescenta novamente;omitida dos proveitos acrescenta50. Reversão contabilística50 de provisão antes tributada comprovada é excluída por50. | Não inferir o tratamento anterior do saldo contabilístico. Quantia superior à parcela fiscal demonstrada,evento que continua a subsistir ou objecto duplicado ficam pendentes. Sem alteração retrospectiva ou consumo do saldo oficial. |
|
||||
| Componentes de exercícios anteriores18(2):conhecimento/imprevisibilidade no encerramento anterior documentados. | Custo80 conhecido no fecho2025,incluído no resultado actual →acréscimo80. Se imprevisível/manifestamente desconhecido à data daquele fecho →sem acréscimo por periodização. Proveito50 conhecido no fecho anterior →excluído do actual por50;se imprevisível/desconhecido →considerado no actual. | Conhecimento no fecho em falta impede apenas a imputação da parcela. Nenhuma rectificação de declaração anterior é executada. Periodizações específicas18(6–10) não passam a estar cobertas por este recorte18(2). |
|
||||
| Obras plurianuais19 e perdas meramente estimadas36m:critério uniforme,preço,custo incorporado/custo total e acumulados fiscais anteriores documentados. | Percentagem:preço2000,custo total1000,incorrido500;proveito fiscal acumulado1000 menos anterior600=400 corrente;custo500 menos anterior300=200 corrente. Proveito contabilizado1000/custo200 →ajustamento−600. Encerramento tem caso separado;facturação parcial com acabamento correspondente/entregas fraccionadas impõem percentagem;95% com preço conhecido ou recepção provisória pública determina conclusão. Perda meramente estimada50 de obra em curso →acréscimo50. | Acumulados incoerentes ou método incompatível bloqueiam essa obra. Receita antecipada19(5) positiva e mudança de critério com autorização19(6) ficam por corresponder; o caso demonstrado declara expressamente zero de receita antecipada e método mantido, sem presumir essas condições. |
|
||||
|
||||
**Percurso demonstrado:** cálculo → gravação → recuperação pela API privada → relatório/dossier/exportação em cinco casos:conjunto calculado,informação insuficiente,categorias adicionais,limites partilhados e encerramento de obra. Só os novos casos foram testados: **22 testes frontend,1 testeAPI/83asserções**, transacção revertida na base QA127.0.0.1:55441; routes/actions gerados pelo procedimento existente,TypeScript/build e interface real passaram. Interface permite reutilizar a parcela livre da origem e o saldo financeiro de créditos quando conhecido; alterações às somas dos temas são revistas antes de aplicar e não apagam escolhas ou históricos. Fonte ausente ou saldo não acompanhado nunca cria zero. Valores racionais são conservados, apresentações decimais aproximadas são identificadas e uma perda inferior a um cêntimo não é truncada para zero.
|
||||
|
||||
**Preservação:**6ficheiros de runtime no delta,42protegidos e31originais conferidos; sem schema/API/configuração/permissões/dependências alterados, sem escrita no activo. Recibo:`docs/investmoz/simulations/irpc-l6-costs-provisions-timing-qa-20261026.json`;bundle/pacote em `outputs/irpc-l6-costs`. DivergênciaM20/M22 permanece limitada ao transporte201/quadro8 versus200/quadro10; não é uma condição destes cálculos. Não foram criadas correspondências oficiais de campos para estes novos ajustamentos por presunção.
|
||||
|
||||
**Saldo deL6 após estes casos QA:**combinação36h/i+36(4);quota36h automática e restantes amortizações;campanhas36-A e sua articulação com1%;provisões reguladas/reforços financeiros e periodizações específicas não cobertas;receita antecipada positiva/mudança autorizada do método de obra;períodos curtos/conversão fiscal anual;representação fiscal de fracções e restantes correspondênciasM20/M22. Cada pendência afecta o caso/campo dependente, não o conjunto independente demonstrado. Benefícios,isenções,taxas reduzidas e operações especiais mantêm âmbitoL7;retenções,pagamentos,créditos e saldo anual mantêm âmbitoL8. **L6 continua parcial.** As dez dúvidas deL5 não foram reabertas.
|
||||
|
||||
## 26/10/2026 — conjunto L6 043dd35d entregue pelo Git
|
||||
|
||||
Instalado `043dd35d8ee247123b3a32f1fc10fd2ede81e9f4` sobre `a2de7259`, pelo procedimento Git existente, sem força, migrações ou importações. Backup fresco `2026-10-26T06:35:29Z` e restauro isolado sem rede/porta55441: **174tabelas** conferidas por contagem/checksum; **369ficheiros/configuração** preservados. Conferidos **6ficheiros do delta,42protegidos e31originais**; schema,roles/grants e permissões iguais. Tabelas de negócio preservadas; cache/sessões reconciliadas com os eventos operacionais da entrega. `a2de7259` permanece como versão anterior. Dependências de4versões antigas arquivadas e verificadas para espaço, sem modificar as versões actual/anterior, fontes, dados ou backups.
|
||||
|
||||
Revisão/manifest público,11marcadores compilados e simuladorHTTP200 conferidos. Pipeline normal concluído; as provas QA aceites foram reutilizadas, sem nova ronda manual. **Disponível no âmbito demonstrado: lucro6730 → base4430 → colecta1417,60MZN. O saldo final a pagar/recuperar continua indeterminado emL8.** Também preservados o caso de perda corrente e as distinções conhecido/ausência/falta de informação, os períodos/EP demonstrados e a preparação parcialM20/M22. Recibo:`docs/investmoz/simulations/irpc-l6-costs-delivery-20261026.json`.
|
||||
|
||||
O estado «QA sem instalação» da nota anterior é histórico para este conjunto. **L6 continua parcial pelos seis grupos concretos da secção seguinte**, cada um com condição de resolução e bloqueio delimitado. L7 eL8 mantêm os seus âmbitos.
|
||||
|
||||
|
||||
## 26/10/2026 — saldo de L6 após a entrega043dd35d
|
||||
|
||||
Mesma matriz AUD-SIM-INT02. Custos/provisões/periodização demonstrados entregues; trabalho seguinte:amortizações. Provas aceites reutilizadas.
|
||||
|
||||
| Caso ou correspondência pendente | Condição concreta de resolução | Limite do bloqueio |
|
||||
|---|---|---|
|
||||
| Combinação36h/i com36(4) | Corresponder a regra de articulação dos trechos aplicáveis ou esclarecer comAT o exemplo combustível100/comprovado80/passageiro sem excepção;sem somar ou repartir correcções por presunção. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Quota36h automática e amortizações restantes | Reconciliar tabela/método/entrada emuso/quotas contabilísticas e fiscais anteriores;prioridade seguinte deL6. A parcela36h documentada continua reutilizável nos casos independentes. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Campanhas plurianuais36-A e limite1% | Implementar a periodização por três exercícios e a sua articulação com36n; não tratar a campanha como publicidade ordinária. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Provisões reguladas28d e reforços financeiros28(3) | Corresponder a regra sectorial/supervisão ou o reforço financeiro e os saldos documentados; não usar os limites ordinários29 por aproximação. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Receita antecipada19(5) positiva e mudança autorizada19(6) | Corresponder os custos futuros/receita antecipada e o transporte entre exercícios ou a autorização da mudança de método;os casos zero conhecido/método mantido permanecem executáveis. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
| Outras periodizações,âmbitos eM20/M22 | Tratar apenas os casos específicos18(6–10),períodos curtos/conversão anual,representação fiscal e campos ainda sem correspondência,com os parâmetros da edição/caso;divergência201/Q8 versus200/Q10 só afecta o transporte indicado. | Apenas o caso/campo dependente; cálculos independentes preservados. |
|
||||
|
||||
L6 continua parcial. L7 mantém benefícios/casos especiais;L8 mantém retenções/pagamentos/créditos/saldo final. As dez dúvidasL5 não foram reabertas.
|
||||
|
||||
## 26/10/2026 — L6: amortizações em QA, sem instalação
|
||||
|
||||
O portal mantém `043dd35d` instalado: colecta demonstrada1417,60MZN, sem saldo finalL8. O novo conjunto optativo `IRPC-normal-adjustments/7` reutiliza os activos e o resultado financeiro já declarados. Versões1–6 e históricos permanecem intactos; activar o novo mapa substitui o efeito fiscal anterior das amortizações, sem o somar novamente. Ausência declarada de quotas anteriores é distinta de informação em falta e exige referência.
|
||||
|
||||
Cobertura delimitada ao exercício anual2026/MZN e bens novos ao custo histórico: tabelaII/3/9 computadores25%,3/9.1 servidores20%,3/23 segurança20%,3/22 máquinas não especificadas10%,5/7 mobiliário10%,1/2.2 edifícios comerciais/administrativos2%,4/9.2 veículos ligeiros/mistos25%,5/8 software25%; tabelaI/84.2/B decoração hoteleira20% e84.3/A máquinas de lavandaria12,5%. A tabelaI prevalece quando aplicável; não se presume que esta lista cobre todo o catálogo. Fonte: Decreto72/2013, artigos3–10/17 e tabelas, exemplar original anteriormente aceite e hash preservado; CIRPC27e para limite800000MZN de viaturas e exclusão de terrenos.
|
||||
|
||||
Método constante com taxa expressamente escolhida no recorte metade–máximo; degressivo apenas para bens elegíveis novos, factores máximos1,5/2/2,5 segundo vida útil. Opção8(2) demonstrada apenas em ano civil/início1Janeiro, com quotas anteriores completas documentadas. Duodécimos incluem mês de entrada e excluem mês de saída, respeitando vida máxima. Software exige direitos onerosos/exclusivos e duração limitada; art17 exige bem individual até20000 e opção documentada. Quotas anteriores recuperáveis têm prova contabilística/fiscal e são limitadas à parte elegível: quotas nunca contabilizadas ou permanentemente excluídas não se tornam dedutíveis. Nenhum saldo oficial é consumido.
|
||||
|
||||
| Novo caso | Efeito demonstrado em MZN: lucro → matéria colectável → colecta |
|
||||
|---|---|
|
||||
| Computador em uso desdeJulho: quota fiscal50, ajustamento70, substituindo anterior20 | 6780 →4480 →1433,60 |
|
||||
| Mesmo activo, saída15Outubro:3meses/quota25 | Colecta1441,60; entrada/saída identificadas no relatório |
|
||||
| Degressivo elegível: quota200, ajustamento40 | 6630 →4330 →1385,60 |
|
||||
| Quota anterior documentada:20 recuperados,20 restantes; ajustamento−20 | 6730 →4430 →1417,60 |
|
||||
| Máquina de lavandariaI/84.3/A: quota62,50, ajustamento57,50 | 6767,50 →4467,50 →1429,60 |
|
||||
| Quota contabilística anterior em falta | Lucro/base/colecta indeterminados; ajustamentos independentes conhecidos continuam discriminados |
|
||||
|
||||
Cálculo → gravação → recuperação pela API privada → relatório/dossier demonstrado em cinco casos. **18novos testes frontend;1testeAPI/84asserções**, rollback na baseQA127.0.0.1:55441; routes/actions gerados, TypeScript/build e interface real passaram, incluindo edição, reutilização, ausência declarada, falta de informação, recuperação e exportação. Provas aceites reutilizadas. **7ficheiros de runtime no delta,43protegidos e31originais conferidos**; sem migração/API/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
| Saldo concreto das amortizações | Condição de retoma |
|
||||
|---|---|
|
||||
| Outros códigos/taxas, por exemploII/3/3 ar condicionado12,5% | Acrescentar correspondência verificada, elegibilidade e prova apenas desse delta; sem aprovação genérica adicional |
|
||||
| Bens usados, abertura de escrita, grandes reparações/benfeitorias7(2)/(4), reavaliações15 e transição anterior2014 | Documentar vida esperada, bases/quotas anteriores e implementar a regra específica aplicável |
|
||||
| Uso intensivo11, concessões12, peças14, intangíveis específicos16 e eventos de transferência/relocação | Corresponder condições legais e histórico do evento; desenvolvimento/goodwill não herdam taxa do software |
|
||||
| Mudança de método10, excepções, taxas fora do recorte, vida máxima anual terminada a meio do período e opção8(2) fora do caso demonstrado | Histórico concreto e regra/excepção correspondente; autorização apenas quando a norma a exigir |
|
||||
| Restantes custos/provisões/periodizações da entrega043dd35d; períodos curtos, conversão anual, representação fiscal e correspondênciasM20/M22 | Mantêm os critérios concretos já registados na matriz; este incremento não os encerra |
|
||||
|
||||
A divergência201/quadro8 versus200/quadro10 bloqueia apenas o transporte afectado. Não foram presumidas correspondências oficiais para estes novos campos. **L6 continua parcial;L7 eL8 mantêm os seus âmbitos.** As dez dúvidasL5 não foram reabertas. Recibo: `docs/investmoz/simulations/irpc-l6-depreciation-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — amortizações e9fe1022 entregues pelo Git
|
||||
|
||||
Instalado `e9fe102259c183a9d9bf7e39f246a8c3860839c6` sobre `043dd35d`, preservado como versão anterior. Backup fresco `2026-10-26T07:31:29Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **7ficheiros do delta,43protegidos e31originais** verificados; schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup. Cache:reinício da fila,contadores/timers e renovação da validade do mesmo valor de cache da página inicial. Sessões:expiração individual comprovada pelo prazo configurado120minutos,novas consultas da entrega e acessos anónimos correlacionados por agente/data no nginx;sem perda de dados de negócio. Dependências de5versões antigas arquivadas/verificadas para a margem do pipeline,preservando versões actual/anterior,fontes,dados e backups.
|
||||
|
||||
Revisão/manifest público,5marcadores compilados,4assets e simuladorHTTP200 conferidos. Pipeline normal concluído; provas QA18frontend/API1-84/UI/tipos/build reutilizadas,sem nova ronda manual. **Exemplo disponível: lucro6780 → matéria colectável4480 → colecta1433,60MZN. Saldo final a pagar/recuperar indeterminado emL8.** Históricos1–6 preservados; versão7 apenas por activação do novo mapa,substituindo o efeito anterior sem duplicação. Recibo:`docs/investmoz/simulations/irpc-l6-depreciation-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de e9fe1022 é histórico. Mantêm-se explícitos os outros códigos de tabela;usados/abertura de escrita/reparações/reavaliação/transição;uso intensivo/concessões/peças/intangíveis específicos/eventos;mudanças/excepções de método e opções fora do recorte. Retoma por correspondência da regra específica,base/vida/quotas e prova do delta,sem autorização genérica adicional. Períodos curtos e planos noutra moeda são o próximo incrementoQA,reutilizando o mecanismo cambial. Restantes custos/períodos/representação/camposM20-M22 conservam critérios próprios;divergência201/Q8 versus200/Q10 restringe apenas o transporte afectado. **L6 parcial;L7/L8 próprios;dez dúvidasL5 não reabertas.**
|
||||
|
||||
## 26/10/2026 — L6: períodos curtos e planos noutra moeda em QA
|
||||
|
||||
`e9fe1022` está instalado, com o âmbito de amortizações já demonstrado e os restantes casos de tabela/método explícitos acima. Este novo conjunto optativo `IRPC-normal-adjustments/8` está **emQA,sem instalação**. Reutiliza os meses e montantes do plano,os mapas fiscais emMZN e o mecanismo cambial entregue. Os históricos1–7 e o plano original não são reescritos.
|
||||
|
||||
Períodos de meses completos com termo em2026: início7(4)a,cessação7(4)b,início/fim de sujeição7(4)c e transição7(4)d,mediante identificação do evento/datas/suporte; plano com6meses ou selecção explícita de6dos12meses,sem anualizar receita,resultado,base ou taxa. Primeiro mês civil do plano é declarado,não inferido do mês orçamental. Anual diferente do ano civil conserva a correspondência do período autorizado/comunicado existente. Duodécimos ordinários do art9(3) do Decreto72/2013 aplicam o número de meses de utilização;art17 integral em período curto e restantes excepções não se tornam suportados por aproximação. Elemento conhecido como não amortizável mantém acréscimo integral,sem exigir método irrelevante.
|
||||
|
||||
Planos em outra moeda: cada mês seleccionado reutiliza ou confirma selecção cambial pelo procedimento existente,coluna/data/boletim/sentido e vínculo à origem. Moeda e valores originais permanecem no relatório. Não se adopta taxa actual,única ou de outro mês por defeito. **A conversão mensal para simulação exige pressuposto documentado;não confirma automaticamente uma regra fiscal de conversão anual.** Os mapas/activos/quotas/perdas existentes continuam emMZN e são reconciliados expressamente;nenhuma segunda conversão automática. Saldos patrimoniais de créditos em moeda estrangeira não são apresentados comoMZN pela conversão dos fluxos do plano;correspondência de saldo/data/taxa continua separada.
|
||||
|
||||
| Caso novo | Efeito demonstrado emMZN |
|
||||
|---|---|
|
||||
| Início1Julho–31Dezembro,meses7–12: resultado3120;quota fiscal50 e ajustamento10 | Lucro3130 → matéria colectável3130 → colecta1001,60,à taxa32%;ausência de perdas/benefícios declarada |
|
||||
| Mesmo recorte emUSD,pressuposto sintético64MZN/USD identificado em cada mês;mapasMZN reconciliados | Resultado199680;ajustamento640;lucro/base200320 → colecta64102,40. Taxa64 é pressupostoQA,não boletimBM real ou parâmetro fiscal confirmado |
|
||||
| Anual emUSD;plano de6meses iniciado emJulho;cessação e sujeição no mesmo ano | Novos testes próprios;respectivamente colecta128204,80 e1001,60nos casos correspondidos,sem anualização do semestre |
|
||||
| Falta de selecção de um mês,moeda incompatível ou taxa editada sem confirmação | Valores originais e conversões independentes visíveis;resultado/lucro/base/colecta dependentes indeterminados |
|
||||
| Perdas reportadas propostas num período curto | Lucro3130conhecido;dedução/base/colecta pendentes da sequência de períodos. Art41(5) exclui da contagem o período de transição7(4)d inferior a6meses;não autoriza agregar todos os períodos curtos |
|
||||
|
||||
Cálculo → gravação → recuperaçãoAPI → relatório/dossier demonstrado em4casos. **13testes novos frontend,API1teste/58asserções**, rollback na baseQA127.0.0.1:55441;routes/actions pelo procedimento existente,TypeScript/build e interface real passaram. Interface demonstrou alteração de datas e taxa,confirmação cambial,recuperação e exportação. Mudança na origem cambial invalida a actualidade do novo resultado,conservando o histórico. Provas aceites reutilizadas,sem repetição manual. Delta:**9ficheiros de runtime,43protegidos e31originais**;sem API/schema/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
| Pendência concreta | Condição de retoma e bloqueio |
|
||||
|---|---|
|
||||
| Datas parciais,períodos superiores a12meses/liquidação e curtos fora do recorte2026 | Corresponder datas/evento,parcelas de dias e regra aplicável;apenas esse período depende da implementação |
|
||||
| Dedução de perdas em sequência com períodos curtos/transição | Declarar sequência efectiva de períodos posteriores e aplicar41(5) ao caso7(4)d inferior a6meses;sem prazo presumido só por ano civil. Lucro independente continua calculável |
|
||||
| Limites anuais de publicidade e provisão de créditos em período curto | Corresponder expressamente a base/limite do período e regra de proporcionalização,se aplicável;sem anualização ou rateio presumidos. Outros custos e períodos anuais não bloqueados |
|
||||
| Quota integral art17 em período curto,opções/métodos/tabelas e casos de amortização ainda não suportados | Implementar combinação específica e provar só o novo efeito;condições restantes do conjuntoe9fe1022 continuam válidas |
|
||||
| Conversão fiscal anual confirmada,saldos em moeda estrangeira e fracções de cêntimo da conversão | Identificar regra fiscal/data/base,taxa e âmbito;para saldos,conversão própria em vez de somar fluxos;para fracções,regra de representação. Até lá,pressupostos de simulação explícitos e total indeterminado quando não representável neste recorte |
|
||||
| Restantes custos/periodizações e correspondênciasM20/M22 | Mantêm os critérios já registados. Divergência201/Q8 versus200/Q10 limita só o transporte afectado |
|
||||
|
||||
Fontes primárias reutilizadas: CIRPC Lei34/2007 PDF4/p768(58),art7(4)/(7),ePDF12/p768(66),art41(5);Decreto72/2013 PDF3/p1074(7),art9(3). Exemplar e originais/hash preservados;sem importação/publicação documental. **L6 continua parcial. Colecta não é saldo final a pagar;L7 eL8 mantêm âmbitos próprios.** As dez dúvidasL5 não foram reabertas. Recibo:`docs/investmoz/simulations/irpc-l6-periods-fx-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — períodos curtos e planos noutra moeda56475acb entregues pelo Git
|
||||
|
||||
Instalado `56475acb2f39e58cb51664913f7fb499f58eb7ab` sobre `e9fe1022`,preservado como versão anterior. Backup fresco `2026-10-26T08:17:39Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **9ficheiros do delta,43protegidos e31originais** verificados;schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup. Cache/sessões reconciliadas com os eventos operacionais e acessos anónimos registados;expiração,quando aplicável,comprovada individualmente pelo prazo configurado. Dependências de5versões antigas arquivadas/verificadas,preservando versões actual/anterior,fontes,dados e backups.
|
||||
|
||||
Revisão/manifest público,6marcadores compilados,4assets e simuladorHTTP200 conferidos. Pipeline normal concluído;provasQA13frontend/API1-58/UI/tipos/build reutilizadas,sem nova ronda manual. **Semestre demonstrado: lucro3130 → matéria colectável3130 → colecta1001,60MZN.** PlanoUSD:pressuposto sintético64MZN/USD por mês identificado,originais conservados e mapasMZN reconciliados;lucro/base200320 → colecta64102,40MZN. **Não confirma regra fiscal de conversão anual nem boletimBM real. Saldo final a pagar/recuperar continua indeterminado emL8.** Históricos1–7 preservados;versão8 optativa,sem anualizar resultados ou usar taxa actual por defeito. Recibo:`docs/investmoz/simulations/irpc-l6-periods-fx-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de56475acb é histórico. Permanecem explícitos os casos de datas parciais/liquidação,sequência de perdas41(5),limites anuais em período curto,art17 curto/restantes amortizações,conversão fiscal anual/saldos em outra moeda/fracções e demais custos/periodizações. Condições de retoma continuam na mesma matriz. Próximo incrementoQA:representação de valores e camposM20/M22 por corresponder;divergência201/Q8 versus200/Q10 limitada ao transporte do resultado afectado,sem reabrir cálculos demonstrados. **L6 parcial;L7/L8 próprios;dez dúvidasL5 não reabertas.**
|
||||
|
||||
## 26/10/2026 — L6: representação dos valores e campos M20/M22 em QA
|
||||
|
||||
`56475acb` está instalado. Este novo conjunto optativo `IRPC-normal-adjustments/9` está **em QA, sem instalação** e acrescenta preparação dos valores/campos, sem alterar fórmulas de lucro tributável, matéria colectável ou colecta. Históricos1–8, plano original, pressupostos cambiais e demais livros preservados. A falta de uma correspondência documental afecta o campo e a sua reconciliação, mantendo os totais fiscais existentes.
|
||||
|
||||
**Representação:** valor racional exacto conservado, apresentação aproximada identificada por«≈» e fracção original; zero conhecido, informação em falta e campo sem aplicação distintos. M20A.1/quadro4/M12 pede meticais sem centavos: valores inteiros são representáveis, fracções ficam por corresponder, sem arredondamento/truncagem. Preparação M22 já aceite com valores exactos ao cêntimo preservada; fracções de cêntimo continuam explícitas e pendentes da regra fiscal aplicável. Resultado líquido negativo M20 é apresentado entre parêntesis; M22 separa campo de lucro do de prejuízo, sem colocar perda no lucro ou criar matéria colectável negativa.
|
||||
|
||||
**M20:** reutiliza as quatro correspondências directas de custos das vendas,pessoal,depreciação e juros. Discrimina as receitas e despesas operacionais por conta com suporte e reconciliação exacta ao plano do período/moeda. Demonstra prestação de serviços7.2,fornecimentos/serviços6.3,outros gastos6.8 e imposto contabilizado8.5, além das contas directas6.1.1/6.2/6.5/6.9. Rótulos das demais contas são estrutura disponível; não constituem novas regras fiscais nem provam a qualificação de uma parcela. Uma origem incompleta não apaga as contas directas independentes.
|
||||
|
||||
O imposto contabilizado tem valor/ausência e suporte próprios, e localização já incluída ou exterior ao plano. Colecta não é despesa contabilística presumida. Valor já incluído não é subtraído novamente; contradição com o mapa de imposto próprio ou coexistência das duas localizações fica identificada. O resultado líquido é apurado para preparação; o transporte automático entre edições continua impedido só no resultado afectado.
|
||||
|
||||
**M22 PDF:** correspondências de variações patrimoniais201/202,resultado203,amortizações não aceites206,provisões/imparidade209,impostos de outrem213,multas/juros compensatórios215,ajudas219,representação220,publicidade221,despesas não documentadas223,aluguer224,combustíveis225,viaturas226 e reposição de provisões tributadas239. Reutiliza os ajustamentos demonstrados; não reaplica as percentagens impressas. A representação já calculada usa80%,compatível com220. Campo213 é apenas de outrem: imposto próprio36(1)a continua **sem campo presumido**. Efeitos positivos de amortização vão a206; recuperações negativas de quotas anteriores ficam separadas até correspondência própria, sem compensação no mesmo campo.
|
||||
|
||||
Somas238/258 e lucro reconstruído apenas quando todas as parcelas têm correspondência e reconciliam; campos259/260/269/270/276/277/278/300 reutilizam o cálculo existente, mesmo havendo uma parcela sem campo. Colecta total302 só é preparada com ausência de parcela de taxa reduzida declarada com suporte;caso conhecido mantém âmbitoL7 e não apaga300. Campos309–316/saldo final permanecem emL8.
|
||||
|
||||
| Caso novo | Resultado e limite de aplicação |
|
||||
|---|---|
|
||||
| Correspondência no semestre demonstrado, ausência de imposto contabilizado e taxa reduzida declaradas | Resultado líquido3120;203=3120;206=10;238=3130;258=0;lucro/base3130;colecta normal300 e total302=1001,60MZN. Reconciliação aritmética exacta, sem transporte automático entre edições |
|
||||
| Fornecimentos300,50 e outros gastos299,50, origem600 | Parcela300,50 conserva601/2;M20 em meticais inteiros pendente só nas parcelas fraccionárias;resultado e colecta1001,60inalterados |
|
||||
| Imposto contabilizado em falta | Resultado líquido/campo200 e somas dependentes indeterminados;lucro/base3130 e colecta1001,60mantidos |
|
||||
| Recuperação de quota anterior:ajustamento−26 | Efeito fiscal e colecta1001,60preservados;sem código de dedução inventado,somas238/258 pendentes;260/278/300 conhecidos |
|
||||
| Imposto próprio320 contabilizado exterior ao plano | Resultado líquido2800 conhecido;campo de acréscimo próprio por corresponder,sem usar213 de outrem;lucro/base3130 e colecta1001,60preservados |
|
||||
|
||||
Percurso cálculo → gravação → recuperação privada → relatório/dossier demonstrado em **5casos**. **15testes novos frontend;API1teste/97asserções**, transacção revertida na baseQA127.0.0.1:55441;routes/actions gerados pelo procedimento existente,TypeScript/build e interface real passaram. Interface demonstrou edição de parcelas,imposto em falta sem apagar valor anterior,recuperação/exportação e pendências apenas dependentes. Provas aceites reutilizadas;sem repetir suites anteriores. **4ficheiros de runtime no delta,50protegidos e31originais** conferidos;sem API/schema/configuração/permissões/dependências ou escrita no activo.
|
||||
|
||||
Fontes: PDF M22 SHA2564b61bd83d1fbcfd3b7b5c5523cea5923f7d0f65dc4c004eff58e5db38f763c88,3páginas já aceites reutilizadas;M20A.1 SHA2561ceca6f4c6d77853c1b2b445876599b42093175fa89eecf40590180956d83a9e,M12/D13–D35. Inventariados os20ficheiros acessíveis deModelos/Notas,incluindo temporários;originais/hash preservados. Só rótulos genéricos necessários extraídos do XLSX;sem valores privados,fórmulas/cache do exemplar,importação ou publicação documental.
|
||||
|
||||
| Saldo concreto da preparação M20/M22 | Condição de retoma e alcance |
|
||||
|---|---|
|
||||
| Transporte do resultado M20A.1/D35→M22 | Exemplar compatível ou instrução que resolva201/quadro8 versus200/quadro10. Só esse transporte fica impedido;valor líquido próprio e demais campos continuam visíveis |
|
||||
| Imposto próprio36(1)a,quota anterior recuperada e restantes efeitos de periodização/obras/reversões sem campo | Corresponder rótulo,edição/período e regra específica do campo. Efeito/valor conservados sem código provisório;apenas somas/campos dependentes aguardam |
|
||||
| Fracções M20 e subcentavos M22 | Identificar regra de representação do caso;preservar fracção e apresentar aproximação identificada até então. InteirosM20 e cêntimos exactosM22 não bloqueados |
|
||||
| Imposto contabilizado simultaneamente incluído e exterior ao plano | Discriminar ambas as componentes/referências e conciliar8.5/acréscimo próprio sem repetir gasto;sem inferir o valor da colecta |
|
||||
| Contas/quadros e anexos restantes fora das seis linhas financeiras demonstradas | Reutilizar dados existentes,classificar componentes com suporte e acrescentar correspondência específica;sem tomar campos preenchidos do exemplar como dados do investidor |
|
||||
|
||||
L7 mantém benefícios/casos especiais/taxas reduzidas eL8 mantém retenções,pagamentos,créditos e saldo final. Restantes regras deL6 e as dez dúvidasL5 conservam o saldo e as condições já documentadas. **L6 continua parcial;colecta não é saldo final a pagar.** Recibo:`docs/investmoz/simulations/irpc-l6-values-forms-qa-20261026.json`.
|
||||
|
||||
## 26/10/2026 — representação dos valores e campos M20/M22 5aaf1a56 entregues pelo Git
|
||||
|
||||
Instalado `5aaf1a56f9d928331364fcc8b0d1528e51dba327` sobre `56475acb`,preservado como versão anterior. Backup fresco `2026-10-26T08:57:09Z` e restauro isolado sem rede/porta55441: **174tabelas** por contagem/checksum e **369ficheiros/configuração** conferidos. **4ficheiros do delta,50protegidos e31originais** verificados;schema,roles/grants e permissões iguais. As172tabelas de negócio mantêm os valores do backup;cache/sessões reconciliadas com eventos operacionais/acessos anónimos,sem alteração de dados de negócio. Revisão/manifest público,7marcadores compilados,4assets e simuladorHTTP200 conferidos. Sem migrações,importações ou escrita privada sintética no activo.
|
||||
|
||||
Pipeline normal concluído;provasQA15frontend/API1-97/UI/tipos/build reutilizadas,sem nova ronda manual. **Disponível no âmbito demonstrado: resultado líquido3120 + ajustamento10 → lucro/base3130 → colecta1001,60MZN.** Representação exacta,ausência/informação em falta/campo sem aplicação e valores ainda sem correspondência conservados. M20 mantém fracções sem arredondamento presumido;M22 mantém preparação exacta ao cêntimo já aceite. Imposto próprio320 exterior produz resultado líquido2800,mas campo de acréscimo próprio continua pendente,sem usar213 de outrem. Divergência201/Q8 versus200/Q10 só limita o transporte afectado. Históricos e cálculos anteriores,pressupostos cambiais e âmbitosL3/ISPC/câmbio/L5 preservados. **Colecta não é saldo finalL8.** Recibo:`docs/investmoz/simulations/irpc-l6-values-forms-delivery-20261026.json`.
|
||||
|
||||
O estado anterior «QA sem instalação» de5aaf1a56 é histórico. O saldo seguinte separa desenvolvimento de esclarecimento documental,com exemplo e condição de retoma,para decidir o fecho operacional delimitado. **L6 não está integralmente concluído;L7 eL8 mantêm os seus âmbitos.** Não foi executada pesquisa nova nem repetição dos testes aceites para esta consolidação.
|
||||
|
||||
## 26/10/2026 — saldo consolidado de L6 para decisão de fecho operacional delimitado
|
||||
|
||||
Referência actual após a entrega `5aaf1a56`: percurso normal demonstrado até à **colecta**, com períodos/moedas/ajustamentos e preparação parcialM20/M22 documentados. Colecta não é saldo final a pagar ou recuperar;L8 conserva esse fecho. Esta lista consolida o saldo das notas anteriores,sem reabrir o que já foi demonstrado. Os pormenores e exemplares continuam nas mesmas secções/recibos;nenhuma nova matriz ou backlog é criado.
|
||||
|
||||
**Código ainda por implementar.** São extensões não demonstradas;as fontes já aceites permitem iniciar os casos correspondidos. Dados de um investidor em falta dentro de regra já implementada são uma pendência desse caso, não outra tarefa genérica deL6.
|
||||
|
||||
| Trabalho | Exemplo | Condição de retoma / alcance |
|
||||
|---|---|---|
|
||||
| Amortizações e quota de aluguer36h restantes | Ar condicionadoII/3/3,12,5%,fora dos10códigos implementados;bem usado com vida esperada e quotas anteriores documentadas. | Acrescentar catálogo e variantes previstas nas fontes aceites:usados/abertura/reparações/reavaliação,uso intensivo/concessões/peças/intangíveis,transição e excepções de método/vida útil,art17 em período curto e quota36h automática. Implementar só o caso escolhido e provar o delta;sem aguardar validação genérica daAT. Só activo,método ou quota ainda não suportados;amortizações demonstradas preservadas. |
|
||||
| Custos e periodizações específicos | Campanha de lançamento300 com imputação por3exercícios;obra com receita antecipada positiva em vez do zero demonstrado. | Implementar36-A e articulação com36n,reforços financeiros28(3),19(5)/19(6) e18(6–10),com saldos/condições do caso. Autorização de mudança de método apenas quando a disposição aplicável a exigir. Provisões sectoriais dependem primeiro da norma específica indicada abaixo. Só campanha,obra ou periodização específica;limites/provisões ordinários e casos já demonstrados mantidos. |
|
||||
| Períodos e sequência de perdas | Transição de4meses seguida dos períodos posteriores:aplicar a exclusão de contagem de41(5) ao período7(4)d,sem contar apenas anos civis. | Representar a sequência efectiva de períodos/perdas e acrescentar datas parciais,liquidação/períodos superiores a12meses e outros exercícios com regra/taxa aplicável. Não há nova pesquisa necessária para repetir o recorte de meses completos2026 já entregue. Só período ou utilização de perda dependente;lucro independente e semestres demonstrados preservados. |
|
||||
| Desdobramentos contabilísticos e quadros/anexos M20/M22 restantes | Imposto próprio200 já incluído no plano e320 exterior:discriminar as duas componentes sem duplicar gasto;contas fora das6linhas financeiras ainda não transportadas. | Acrescentar o desdobramento e as correspondências dos quadros/anexos escolhidos,reutilizando dados existentes. Campos sem correspondência aguardam a referência concreta abaixo;os outros componentes podem ser implementados/provados separadamente. Só componente/conta/campo ainda não suportado;valores e campos correspondidos preservados. |
|
||||
| Saldos em moeda estrangeira | Crédito final100USD não é soma das receitas convertidas por mês. | Implementar reconciliação de saldo e conversão pela data/regra que vier identificada,usando o motor cambial já entregue. A selecção mensal para simulação continua disponível;esta tarefa não cria outro mecanismo cambial. Só saldo/conversão fiscal dependente da regra;plano e pressupostos mensais permanecem disponíveis. |
|
||||
|
||||
**Esclarecimentos documentais aguardados.** Cada ponto abaixo exige apenas a referência/resposta específica indicada. A ausência dessa informação não significa revogação das fontes aceites,nem autoriza transformar a dúvida numa validação genérica deL6. Não se presume que um pedido já tenha sido enviado àAT;estes são pontos delimitados para o esclarecimento aplicável.
|
||||
|
||||
| Informação em falta | Exemplo da dúvida | Condição de retoma / alcance |
|
||||
|---|---|---|
|
||||
| Edição e campos M20/M22 | M20A.1/D35 remete201/quadro8;PDF M22 usa200/quadro10. Imposto próprio320 não pertence ao213 de outrem;quota recuperada−26 não tem campo de dedução confirmado. | Obter exemplar compatível ou instrução que identifique edição/período,campo e sentido do transporte. Para periodização/obras/reversões ainda sem campo,identificar a correspondência específica. Até informação nova,manter valores/efeitos sem código presumido e não repetir pesquisa. Só transporte,campo e somas dependentes;resultado líquido próprio,260/278/300 e demais campos conhecidos mantidos. |
|
||||
| Representação fiscal de fracções | M20:300,50=601/2MZN,num exemplar que pede meticais sem centavos;M22:1/300MZN não é um número exacto de cêntimos. | Identificar instrução de representação/arredondamento da edição/campo ou esclarecimento específico. Conservar a fracção até lá;não deduzir regra de arredondamento apenas do rótulo «sem centavos». Só transcrição não exactamente representável;inteirosM20,cêntimos exactosM22 e cálculo racional preservados. |
|
||||
| Articulação de limites em combinações não demonstradas | Combustível100,comprovado80,viatura de passageiros sem excepção:36h/i com36(4). Provisão de créditos200 num período curto de3meses:limite anual por corresponder. | Esclarecer especificamente a articulação h/i/36(4) e a base/limite dos períodos curtos de publicidade/créditos,se houver proporcionalização aplicável. Não somar exclusões,anualizar ou repartir por presunção. Retomar só perante referência/resposta concreta para o exemplo. Só combinação ou limite do período;casos independentes com regra já aplicada mantidos. |
|
||||
| Regra fiscal de conversão anual | PlanoUSD com64MZN/USD por mês é pressuposto sintético de simulação,não confirmação da data/taxa fiscal anual ou da cotação do saldo final. | Identificar disposição/âmbito,data,base e taxa/boletim aplicáveis ao resultado e,quando necessário,ao saldo. Reutilizar o motor existente e demonstrar só a correspondência nova;sem taxa actual por defeito ou nova ronda da pesquisa anterior. Só confirmação fiscal anual e saldo dependente;conversões mensais documentadas de simulação mantidas com os avisos. |
|
||||
| Norma sectorial de provisões reguladas | Provisão200 de uma entidade financeira sujeita ao28d não herda os1,5%/6% do regime ordinário29. | Identificar sector,regulador,norma de supervisão aplicável e saldos/condições necessários,antes da implementação específica. A fonte oficial fornecida é aceite;falta a regra concreta do caso,não certificação genérica da fonte. Só provisão regulada respectiva;provisões ordinárias demonstradas preservadas. |
|
||||
|
||||
**Base da decisão operacional:** o âmbito demonstrado e as suas limitações permanecem disponíveis na interface e nas exportações;as provas aceites mantêm validade. Um fecho operacional delimitado pode referir esse âmbito,com estas extensões/documentos fora da cobertura e retoma por caso. Esta consolidação **não declara L6 integralmente concluído nem regista uma decisão de fecho ainda não tomada**. Permite preparar o avanço paraL7 sem condicionar os casos independentes à resolução de todo este saldo. Benefícios/isenções/taxas reduzidas/tributações autónomas e operações especiais mantêm âmbitoL7;retenções,pagamentos,créditos e saldo anual mantêm âmbitoL8. As dez dúvidasL5 só afectam dependências efectivas e não foram pesquisadas novamente.
|
||||
|
||||
## 26/10/2026 — L6 operacional no âmbito demonstrado e delimitação de L7
|
||||
|
||||
**Decisão expressa da Tempo:** L6 fica operacional no âmbito demonstrado disponível em `5aaf1a56`, com limitações explícitas. Não é conclusão integral de L6 ou do IRPC. Os cinco grupos de código e cinco grupos documentais da secção «saldo consolidado de L6» permanecem separados, com exemplos e condições de retoma. As notas anteriores que deixavam a decisão operacional por tomar conservam o seu valor histórico; esta decisão é posterior. As provas aceites são reutilizadas. As pendências de L5/L6 só impedem tratamentos que dependam delas.
|
||||
|
||||
**Estado deste incremento:** delimitação documental de L7, sem novo cálculo, instalação, migração, importação ou alteração de dados activos. A colecta normal entregue mantém-se distinta do saldo a pagar/recuperar. Retenções, pagamentos, aplicação anual de créditos e liquidação final permanecem em L8. Recibo: `simulations/irpc-l7-scope-20261026.json` (relativo a `docs/investmoz/`).
|
||||
|
||||
### Dados existentes e fronteiras de integração
|
||||
|
||||
| Reutilização | Contrato para L7 e limite |
|
||||
| --- | --- |
|
||||
| Oportunidade/dossier: `context_opportunity`, `context_opportunity_snapshot`, `context_applicability_snapshot`, `context_reuse` | Conservar origem e data, selecção de campos compatíveis e edições deliberadas; `context-inheritance.ts` e `dossier-prefill.tsx` já sustentam esta reutilização. Associação documental a oportunidade/âncora não confirma implantação ou incentivo. |
|
||||
| `sector_id`, `province_id`, `district_id`, `admin_post_id`, `locality_id` e respectivas designações | Servem para identificar candidatos e pedir apenas elementos em falta. Confirmar actividade efectivamente exercida, estabelecimento/projecto e parcela abrangida por documentos do caso. Localização, polígono, DUAT ou código sectorial isolados não concedem benefício. |
|
||||
| Sujeito, NUIT, residência/EP, período, início de actividade/exploração e dados do plano | Reutilizar valores declarados e respectivas provas. Data prevista no dossier não substitui início efectivo quando esse for o termo inicial da norma. Distinguir conhecido, ausência declarada e desconhecido. |
|
||||
| `business_plan_snapshot`, livro `modelo_a_snapshot.irpcNormal` e versões L6 | Receber lucro/base/colecta e parcelas identificadas, com chave e versão de origem. Só alterar o ponto previsto pela norma: ajustamento ao lucro, dedução à base, taxa por parcela ou tributação autónoma separada. Não alterar nem recalcular silenciosamente históricos. |
|
||||
| Activos, quotas anteriores e despesas já registadas | Reutilizar os mesmos identificadores e montantes; calcular apenas o efeito adicional permitido. Não repetir o acréscimo de uma despesa nem deduzir duas vezes a amortização do mesmo activo. Um caso dependente de regra L6 não implementada conserva essa dependência específica. |
|
||||
| Preparação M20/M22 e aritmética racional existentes | Conservar montante exacto, unidade/moeda e parcela. Transporte só com correspondência demonstrada para a edição; campo desconhecido, fracção não representável ou divergência editorial não invalida o cálculo independente. Não arredondar por conveniência. |
|
||||
|
||||
O motor actual de matéria colectável não subtrai benefícios positivos livres: exige regra, condições, limite e ordem. A colecta normal cobre a taxa geral no recorte demonstrado; escolher «outro tratamento» não implementa uma taxa especial. A presença de campos ou de fontes no portal não equivale a execução de L7.
|
||||
|
||||
### Famílias de tratamentos a implementar por casos compatíveis
|
||||
|
||||
As referências seguintes delimitam a regra e o ponto de integração; **não constituem benefícios concedidos nem cobertura executável nova**. O exercício do caso, alterações aplicáveis e duração individual ficam associados à versão da regra. Não se transportam taxas temporárias para outro período.
|
||||
|
||||
| Família / fonte identificada | Condições e período a guardar | Efeito e exemplo de dúvida delimitada / condição de retoma |
|
||||
| --- | --- | --- |
|
||||
| **Despesas com tributação autónoma** — CIRPC, Lei34/2007, art.61(4), com art.36(1)g; PDF17/p768(71) | Natureza legal documentada da despesa não devidamente documentada, confidencial ou ilícita; valor e exercício; taxa de 35% da disposição e versão aplicável ao período. Não classificar pela simples falta de ficheiro anexado. | Parcela autónoma separada da colecta normal; reutilizar o acréscimo36g já feito, sem duplicação. Ex.: despesa100 já acrescida em L6 → parcela autónoma35 no caso qualificado; não é saldo final. Se só falta anexo, pedir a caracterização/prova da despesa e manter indeterminado apenas este tratamento. |
|
||||
| **Mais-valias autónomas** — Lei12/2025, art.2, CIRPC61-A; art.3 revoga39/47; art.6 vigora em01/01/2026; PDF20/p2180(20) | Alienação, activo, datas, realização/valor fiscal, origem contabilística, período e parcela identificados; taxa32% do61-A. Separar eventos anteriores a2026. | Apurar parcela autónoma, reconciliando o que já integra o resultado L6, sem dupla incidência ordinária/autónoma nem compensação presumida de perdas. Ex.: ganho100 incluído no resultado exige identificar a sua parcela antes de integrar a colecta autónoma32. Retoma: implementar essa reconciliação e a regra de apuramento aplicável ao activo; não bloqueia despesas autónomas ou benefícios independentes. |
|
||||
| **Isenções e redução por natureza da entidade** — CIRPC9–14; cooperativas no art.12, PDF5/p768(59), e taxa geral61(1) | Tipo efectivo da entidade, rendimentos elegíveis/excluídos, destino dos rendimentos, constituição e reconhecimento apenas onde exigido pela disposição; exercício e norma aplicável. Art.12 refere cooperativas agrárias, de artesanato e culturais e redução de50% da taxa geral; não todas as cooperativas. Arts.12(2)/14 separam rendimentos sujeitos a retenção. | Isenção ou taxa reduzida apenas na parcela coberta; actividade comercial acessória não se torna isenta por designação da entidade. Ex.: cooperativa com actividade elegível e outra não abrangida exige separar rendimentos e custos. Retoma: classificação documental e segregação da parcela, sem transportar a dispensa para retenções L5 ou liquidar créditos L8. |
|
||||
| **Amortização acelerada** — CBF, Lei4/2009, art.16; compilaçãoAPIEX p72 | Imóveis novos usados no projecto; imóveis reabilitados e máquinas/equipamentos industriais/agro-industriais nas condições da disposição; enquadramento CBF3/9/10 quando aplicável, entrada em uso, taxa normal, base, quota contabilizada e quotas anteriores. Incremento de50% sobre a taxa normal, não cinquenta pontos percentuais. | Efeito no ajustamento ao lucro e, através da cadeia L6, na base/colecta. Ex.: taxa normal10% → taxa acelerada15%, antes das restantes condições/limites; não autoriza uma segunda dedução integral. Retoma por activo com classificação/documentos e conciliação de quotas/custo disponíveis; tabelas L6 em falta bloqueiam só o activo dependente. |
|
||||
| **Deduções e majorações de despesas/investimentos** — CBF17–19; compilaçãoAPIEX pp73–74 | Tecnologia de ponta, formação de trabalhadores moçambicanos e despesas elegíveis de utilidade pública: natureza, base, exercício inicial, janela dos primeiros cinco anos/exercícios conforme artigo, limites, exclusões, ordem e não cumulaçãoCBF4. Distinguir dedução à matéria colectável de majoração de custo. | Efeito no ponto exacto previsto pela disposição. Ex.: formação sem prova do tipo não permite escolher entre o limite5% e o ramo10% para novas tecnologias do art.18. Retoma: identificar tipo/base de limite e conciliar a despesa já contabilizada; não converter percentagem em dedução livre. |
|
||||
| **Crédito fiscal por investimento** — CBF15; compilaçãoAPIEX pp71–72 | Investimento novo elegível, exclusões, início, Maputo/outras províncias como uma das condições, parcela da colecta atribuível ao projecto e prazo de utilização/transporte de cinco exercícios. Taxas5%/10% distinguem os ramos da disposição, sem direito automático por localização. | **L7 identifica origem, elegibilidade e crédito potencial; L8 aplica o crédito anual, limites/saldos e liquidação.** Ex.: projecto situado fora de Maputo, sem discriminação do investimento elegível, não gera automaticamente10% de crédito. Retoma: base elegível e calendário documentados; utilização anual aguarda o mecanismo L8. |
|
||||
| **Tratamentos sectoriais/territoriais CBF** — infra-estruturas20–22; agricultura/pescas27–29; turismo30–33; parques de ciência34–35; grandes projectos36–38; zonas de rápido desenvolvimento39–44; ZFI45–46; ZEE47–48 | Seleccionar a disposição de IRPC efectivamente pertinente, actividade/projecto, delimitação/estabelecimento e estatuto comprovados, data de autorização/início quando exigidos, escalões, duração, cumulação e cessaçãoCBF49–52. ZFI46 e ZEE48 são os artigos de impostos sobre rendimento. Não tratar benefícios exclusivamente aduaneiros como benefícios IRPC. | Isenção, redução ou dedução por parcela e intervalo próprio, em vez de taxa comum ao sector/localização. Ex.: endereço numa ZEE sem estatuto documentado deixa o ramo ZEE pendente; o cálculo normal independente continua. CIRPC61(2) na Lei20/2022 tem termo31/12/2025: não presumir prorrogação para2026. Retoma de cada ramo: condições e cronologia da disposição específica preenchidas, com regra versionada; não exigir pesquisa repetida de todos os sectores. |
|
||||
| **Operações e regimes especiais** — CIRPC54–56 (entradas de activos, fusões/cisões e sócios), transferência de perdas41-A; regimes sectoriais específicos do acervo | Tipo de operação, intervenientes, residência, datas, activos/passivos/valores fiscais e continuidade; identificar diploma sectorial/artigo e regra aplicável antes de escolher tratamento. Não inferir neutralidade por chamar «fusão» à operação nem aplicar regime mineiro/petrolífero por rótulo sectorial. | Continuidade/ajustamento/tributação diferida ou parcela própria conforme norma, mantendo bases históricas. Ex.: perda recebida de outra sociedade não é perda própria ordinária41 de L6. Retoma: correspondência específica41-A e operação documentada; regras sectoriais sem artigo correspondido ficam candidatas, sem taxa provisória. Não há bloqueio transversal de L7. |
|
||||
|
||||
### Registo por tratamento e demonstração a exigir ao código novo
|
||||
|
||||
Cada tratamento terá: identificador estável; sujeito/NUIT; oportunidade/projecto/estabelecimento e parcela; contexto herdado e divergências; fonte/exemplar/hash/artigo/versão; intervalo de vigência e período do caso; facto que inicia/termina a duração; condições individualizadas em «sim/não/desconhecido» com prova ou ausência declarada; título/reconhecimento somente quando a regra o exige; base elegível, taxa, limite, ordem e compatibilidade com outros tratamentos; resultado normal de origem; efeito adicional e ponto da cadeia; moeda/conversão e pressupostos; montante exacto; motivos de exclusão/informação em falta; versão/histórico e dependência concreta.
|
||||
|
||||
Os estados «candidato», «não aplicável», «informação em falta» e «calculado por regra implementada» não se confundem. Ausência declarada pode produzir efeito zero justificado; desconhecido não produz benefício zero nem benefício presumido. Uma condição negativa exclui o tratamento e conserva o percurso normal quando os seus dados são suficientes. Com potencial benefício ainda indeterminado, apresentar o cenário normal de referência e a parcela pendente sem declarar total fiscal definitivo. Mudança de sector/localização/documento invalida apenas a correspondência dependente e pede confirmação de reutilização; conserva o original e as edições deliberadas.
|
||||
|
||||
**Primeiro incremento delimitado para implementação:** qualificação comum e segregação de efeitos, acompanhadas do caso35% do61(4), com despesa já ajustada36g e caso de informação insuficiente. É independente de transporte M20/M22 não correspondido e de amortizações L6 em falta. **Incremento compatível seguinte:** cooperativa abrangida pelo12 com parcela elegível separada e amortização acelerada16 para activo já suportado em L6; cada caso só acompanha a entrega se demonstrado. Mais-valias61-A, deduções17–19, ramos sectoriais e operações especiais seguem separadamente quando as respectivas parcelas/regras estiverem correspondidas. Crédito15 prepara direito potencial em L7 e contrato de passagem para L8, sem antecipar liquidação anual.
|
||||
|
||||
Para cada nova regra: condição satisfeita, negativa, informação em falta, período incompatível/benefício expirado, sobreposição com ajustamento existente e alteração de contexto. Demonstrar apenas o delta: cálculo → gravação → recuperação → relatório, incluindo fonte, período, condições, efeito no lucro/base/colecta ou parcela autónoma e saldo final L8 por determinar. Recuperar históricos anteriores sem os alterar; não duplicar ajustamentos ao voltar a guardar. Reutilizar as provas aceites; não reabrir L3, ISPC, câmbio ou percursos L5/L6 independentes.
|
||||
|
||||
### Fontes consultadas e pendências delimitadas
|
||||
|
||||
Reutilizado o inventário autorizado de **8143ficheiros**, sem nova varredura de pastas. Para delimitação foram consultados os originais CIRPC/alterações já arquivados, a Lei4/2009 local e a compilação oficial [APIEX — Legislação de Investimentos em Moçambique](https://pt.apiex.gov.mz/wp-content/uploads/2025/02/LEGISLACAO-DE-INVESTIMENTOS-EM-MOCAMBIQUE.pdf), que reúne Lei8/2023, Decreto8/2024 e CBF4/2009. Disponibilidade, situação documental/jurídica e uso no cálculo continuam estados independentes. O acesso actual à cópia CBF supera a indisponibilidade assinalada em notas antigas; não activa regra nem apaga a nota histórica. Artigos, páginas, hashes e limites no recibo. A compilação não dispensa o período/alterações de cada tratamento, nem cria validação jurídica genérica adicional.
|
||||
|
||||
**Código por implementar em L7:** qualificação e persistência específicas; efeitos segregados; regras das famílias acima, por parcelas; conciliação sem duplicação; relatório/exportação correspondente. **Documentação por caso:** estatuto/reconhecimento ou enquadramento individual quando a fonte o exige; identificação de parcela/limite/cronologia; norma sectorial ainda sem correspondência; edição/campo de transporte afectado. Cada uma conserva exemplo e condição de retoma na linha correspondente. Não é necessário resolver todos os documentos para começar o primeiro incremento independente. L6 operacional não elimina este desenvolvimento; L7 delimitado não é L7 implementado; L8 conserva a liquidação final.
|
||||
|
||||
## 26/10/2026 — L7: qualificação, despesas autónomas e casos compatíveis em QA
|
||||
|
||||
**QA, sem instalação.** Base instalada preservada `5aaf1a56`; delimitação `d37fffb2`; ramo `codex/irpc-l7-common-autonomous-qa-20261026`, fotografia opcional `IRPC-normal-adjustments/10`. L6 continua operacional no âmbito demonstrado, com os cinco grupos de código e cinco documentais preservados. A implementação abaixo acrescenta apenas os tratamentos demonstrados; não conclui L7 nem o IRPC. Saldo final, retenções, pagamentos e aplicação anual de créditos permanecem em L8.
|
||||
|
||||
**Qualificação comum executável:** reutiliza sujeito/NUIT, âmbito, período, origem da oportunidade/dossier, sector e território; guarda condições, prova, fonte/artigo e período por tratamento. «Informação em falta», «ausência declarada», «não aplicável/condição negativa» e «calculado» têm resultados distintos. Desconhecido não vira zero. Período incompatível, identidade por reconciliar ou contradição afectam só o resultado dependente. A localização não escolhe taxa nem activa benefício. Os snapshots de origem ficam internos; o relatório apresenta contexto legível e as condições documentadas.
|
||||
|
||||
**Despesas61(4):** cada parcela aponta para uma linha `undocumented` do mapa36(1)g de L6, com acréscimo integral já calculado. Montante, documento e linha são reutilizados; L7 não introduz outro acréscimo nem outra despesa. A classificação legal e incidência são declaradas com prova própria; falta de anexo não classifica uma despesa. O imposto autónomo usa35% apenas nos casos qualificados. Duplicação da referência, parcela não correspondida, ausência contraditória ou informação insuficiente deixam o imposto reconciliado indeterminado; as parcelas conhecidas permanecem discriminadas. Condição negativa documentada conserva o ajustamentoL6 e não aplica imposto autónomo à parcela.
|
||||
|
||||
**Cooperativas12/14:** agrárias, artesanato ou culturais, residentes, com base ordinária integralmente elegível e ausência documentada de rendimentos sujeitos a retenção, aplicam redução de50% à taxa geral32%, ou16%. Não depende de seleccionar um sector semelhante. A qualificação especial pode coexistir com a opção «outro tratamento» da colectaL6: não exige fingir que a taxa reduzida é regime geral. Parcela mista, rendimentos retidos, outra entidade ou ausência contraditória conservam pendência própria; não recebem redução global presumida. O imposto autónomo de despesas não é reduzido por esta taxa.
|
||||
|
||||
**CBF16:** reutiliza identificadores e valores dos activosL6 suportados; imóvel novo do projecto ou máquinas industriais/agro-industriais das categorias correspondidas, com enquadramentoCBF3/9 e reconhecimento10 quando exigido (ou excepção identificada). Recorte inicial: primeiro exercício anual civil2026, método constante pela taxa normal máxima da tabela, activo desde01/01/2026, custo histórico novo, sem quotas anteriores/saída e sem cumulação de outros benefícios. Incrementa a taxa normal em50% e reutiliza limites de contabilização/saldo fiscal. Deduz apenas a diferença entre o mapa normal e o acelerado, sem alterar o activo de origem, os documentos ou os saldos oficiais. Quotas constantes gerais e demais cálculosL6 conservam o comportamento anterior quandoL7 está ausente.
|
||||
|
||||
| Caso sintético recuperado da API QA | Lucro/base e colecta de referênciaL6 | EfeitoL7 demonstrado | Resultado e limite |
|
||||
| --- | --- | --- | --- |
|
||||
| Despesa100 já acrescida36g | Lucro/base3230;colecta1033,60MZN | Novo ajustamento ao lucro0;imposto autónomo35 | Colecta combinada1068,60MZN;saldo finalL8indeterminado |
|
||||
| Classificação da mesma despesa em falta | Lucro/base3230;colecta1033,60MZN preservados | Imposto autónomo indeterminado | Colecta combinada indeterminada;sem perda dos cálculos independentes |
|
||||
| Condição negativa documentada na parcela | Ajustamento36g100 preservado | Parcela não aplicável;imposto autónomo0 justificado | Não confunde condição negativa com informação em falta |
|
||||
| Ausência declarada de despesas autónomas | Lucro/base3130;colecta1001,60MZN | Ausência com suporte;imposto autónomo0 | Ausência contraditória com despesa36g fica pendente |
|
||||
| Cooperativa integralmente abrangida | Base3130;colecta geral1001,60MZN | Taxa16%;colecta500,80MZN | Base/proveitos não alterados;sem retenções/créditos abatidos |
|
||||
| Máquina industrial existente:base1000,taxa10%,quota contabilística120 | Quota normal100;lucro/base6260;colecta2003,20MZN | Quota acelerada150,mas dedução limitada120;diferença adicional20 | Lucro/base6240;colecta1996,80MZN;sem deduzir50 nem150 outra vez |
|
||||
|
||||
**Cálculo → gravação → recuperação → relatório:** fotografia10 opcional no mesmo livro/snapshot, chave com entradas/contexto e histórico imutável anterior. SemL7, a fotografia9 aceite e a sua chave/totais permanecem iguais. Recalcular não acumula imposto nem duplica o acréscimo. HTML e dossier financeiro mostram referênciaL6, efeitosL7, parcelas autónomas, fonte, condições, período e limitações; recuperação e download demonstrados no componente real. Uma mudança de origem/entradas torna a fotografia anterior histórica; não altera o registo anterior. M20/M22 conservam a preparaçãoL6 de referência: **este incremento não transporta efeitosL7 para campos oficiais por aproximação**, nem resolve as divergências documentais existentes.
|
||||
|
||||
**Provas novas:** Wayfinder `--with-form` gerou routes/actions pelo wrapper QA; TypeScript e build QA passaram. Dezanove testes dirigidos novos passaram, incluindo comparação exacta com a fotografia9 aceite, duplicação, período curto, opção especial de cooperativa, ausência contraditória, dados em falta e contexto apresentado sem despejar snapshots internos. API privada:1teste/108asserções, `simulator_fiscal_delta_20261021_test`,127.0.0.1:55441, transacção com rollback e guarda de identidade/base; seis casos recuperados com plano/livro/históricos idênticos. UI do componente real: alteração de classificação, informação em falta, ausência, cooperativa mista, cumulação pendente, gravação/recuperação local e exportação; sem erros de página. A prova local é distinta da API. Não houve testes/escrita no activo nem repetição das suites funcionais aceites de L3, ISPC, câmbio ou L5/L6.
|
||||
|
||||
**Entrega agrupada preparada:** qualificação + despesas autónomas, cooperativa integralmente elegível e amortizaçãoCBF16 no recorte acima. Despesa autónoma e cooperativa também foram demonstradas juntas:parcela35 sem redução,colecta sobre a base516,80 e combinada551,80MZN no exemplo de base3230. Isto não autoriza cumulação cooperativa+CBF16: essa combinação mantém resultado dependente indeterminado. A futura instalação segue o procedimento Git existente, com backup/restauro fresco e conferência do delta; não foi executada nesta passagem.
|
||||
|
||||
**SaldoL7 na mesma matriz:**
|
||||
|
||||
| Natureza | Ainda fora da cobertura / exemplo | Condição concreta de retoma |
|
||||
| --- | --- | --- |
|
||||
| Código | Despesa autónoma fora de linha36g calculada ou parcela ainda não segregada | Implementar origem/segregação correspondente e prova da incidência;não copiar montante para uma segunda despesa |
|
||||
| Código | Cooperativa com actividade abrangida e outra não abrangida,ou rendimento sujeito a retenção | Segregar proveitos/custos/base e aplicar o tratamento apenas à parcela elegível;L5 conserva a retenção |
|
||||
| Código | CBF16 em imóvel reabilitado,outra categoria,quota inferior à máxima,método degressivo,duodécimos,quotas anteriores ou exercício posterior | Corresponder regra e cronologia respectivas e reutilizar o activo/quotas existentes;pendênciaL6 limita apenas o activo dependente |
|
||||
| Código/documento por caso | Cooperativa+CBF16 ou outro benefício positivo a cumular | Identificar compatibilidade,ordem e limites específicos;implementar a combinação,sem presumir soma de benefícios |
|
||||
| Código | Mais-valias61-A,demais isenções/deduçõesCBF17–19,regimes sectoriais/territoriais e operações especiais | Implementar a família/parcelas já delimitadas na secção anterior;período e fonte específicos,sem nova pesquisa transversal |
|
||||
| Documento por caso | Estatuto/título/excepçãoCBF ou prova das condições em falta;endereçoZEE sem estatuto | Juntar o elemento que a disposição exige ou registar condição negativa;localização isolada permanece insuficiente |
|
||||
| Transporte/documento | CampoM20/M22 para efeitoL7,edição divergente ou representação não correspondida | Correspondência do campo/edição e regra de representação demonstradas;preservar o cálculo independente exacto |
|
||||
| ÂmbitoL8 | Direito potencial ao créditoCBF15,aplicação anual de créditos,retenções,pagamentos e saldo final | Executar o mecanismo próprioL8;nenhuma dedução/compensação anual é presumida neste lote |
|
||||
|
||||
Fontes reutilizadas: inventário autorizado8143ficheiros; originaisCIRPC/alterações e CBF/compilaçãoAPIEX já identificados na delimitação,com hashes conservados. Sem activação por consulta ou revalidação jurídica genérica. Recibo: `docs/investmoz/simulations/irpc-l7-common-qa-20261026.json`. Provas locais: `outputs/irpc-l7-common/`; reprodução dirigida: `node --test tests/frontend/irpc-special.test.mjs`, `php tools/irpc-special-qa.php routes`, `php tools/irpc-special-qa.php test`, `tsc --noEmit`, build com `INVESTMOZ_QA_BUILD=1`.
|
||||
|
||||
## 26/10/2026 — preparação da entrega L7 e preservação do main concorrente
|
||||
|
||||
A entrega do âmbito QA `ab2ff2fd` integra o `main` concorrente `a2122dc3`, sem substituir as alterações de apresentação/navegação. Os seis ficheiros de execução L7 conservam exactamente o código QA;os oito ficheiros concorrentes conservam exactamente o código do main. Reutilizadas as provas19testes/API108/UI/tipos/build de L7. O conflito documental foi resolvido recuperando586linhas de histórico do manual que tinham sido removidas no merge concorrente,sem apagar a sua notaV2-01 no CSV. As3555linhas mantêm-se,com o único delta fiscal emAUD-SIM-INT02. O registo de instalação só será actualizado após backup/restauro fresco,conferência do destino e conclusão da entrega Git;esta nota não a antecipa.
|
||||
|
||||
## 26/10/2026 — primeira entrega agrupada L7 instalada pelo Git
|
||||
|
||||
Instalada `e07f89da3d59d06aa1b8c50c22a478b7b167bfdd` (integração do código QA `ab2ff2fdbcbe6fb94f03e4bc4cc7ccbd647d94fc` com o main concorrente`a2122dc3`),com `5aaf1a56f9d928331364fcc8b0d1528e51dba327` preservado como versão anterior. Os seis ficheiros de execução L7 são exactamente os da prova QA aceite;as sete alterações concorrentes de apresentação/navegação e o respectivo teste foram preservados. Recuperadas586linhas de histórico do manual removidas no merge concorrente;notaV2-01 conservada,sem alterar o seu conteúdo.
|
||||
|
||||
Backup fresco `2026-10-26T10:55:59Z`;restauro isolado sem rede/55441 verificou174tabelas por contagem/checksum e369ficheiros/configuração. Conferidos13ficheiros de execução do delta,50protegidos e31originais. Schema,roles/grants e permissões mantêm-se;172tabelas de negócio iguais ao backup. Cache/sessões reconciliadas por eventos operacionais e acessos públicos,sem inferir perda por RLS. A versão activa e a anterior foram preservadas durante o arquivo conferido de dependências antigas para recuperar espaço;nenhum dado,original ou backup foi eliminado.
|
||||
|
||||
Revisão/manifest público,marcadoresL7/L6/câmbio,assets e simuladorHTTP200 conferidos. Procedimento Git concluído;provas funcionais aceites19testes/API108/UI/tipos/build reutilizadas. Os controlos automáticos obrigatórios da instalação ficaram registados no recibo,sem nova ronda manual dos casos aceites. Sem migrações,importações,recálculo de históricos ou escrita privada sintética no activo.
|
||||
|
||||
Disponíveis apenas qualificação e tratamentos demonstrados:despesas61(4) sobre36g já ajustado,cooperativas12 integralmente abrangidas eCBF16 no recorte documentado. L6 permanece operacional no âmbito aceite;as suas pendências condicionam só dependentes. L7/IRPC não estão integralmente concluídos;localização não concede benefício;saldo final permaneceL8. O estado anterior deQA sem instalação é histórico. Recibo:`docs/investmoz/simulations/irpc-l7-common-delivery-20261026.json`.
|
||||
|
||||
## 26/10/2026 — saldo concreto de L7 após a primeira entrega agrupada
|
||||
|
||||
O âmbito demonstrado compreende qualificação comum, imposto autónomo61(4) sobre parcelas36g já calculadas emL6, cooperativas12 integralmente abrangidas e amortizaçãoCBF16 nos activos/período/método expressamente suportados. L7 permanece parcial. Este saldo distingue implementação de prova documental por caso; não cria outra matriz nem exige revalidação genérica das fontes aceites. L6 mantém o estado operacional delimitado e as suas pendências; só condiciona tratamentos que efectivamente dependam delas.
|
||||
|
||||
### Código ainda por implementar
|
||||
|
||||
| Tratamento / caso fora da cobertura | Exemplo | Condição concreta de retoma |
|
||||
| --- | --- | --- |
|
||||
| Despesas autónomas fora de parcela36g calculada e segregações adicionais | Despesa100 com apenas60 correspondidos no mapa de origem,ou encargo não incluído no resultado de partida | Implementar origem/parcela e reconciliação próprias,documentar incidência61(4) e impedir nova contabilização/acréscimo da mesma despesa. O ramo já entregue36g não é reaberto. |
|
||||
| Cooperativas com rendimentos mistos/retidos;demais isenções por natureza da entidade,CIRPC9–14 | Cooperativa com actividade agrária e serviços não abrangidos;associação com rendimentos comerciais acessórios | Segregar proveitos,custos e base elegível e implementar o artigo específico. Não reduzir a base inteira nem estender a redução às retençõesL5. |
|
||||
| ExtensõesCBF16 e combinações de benefícios | Imóvel reabilitado,método degressivo,quota inferior à máxima,duodécimos,quotas anteriores,ano posterior,cooperativa+CBF16 | Corresponder a regra temporal/método/contabilização e a compatibilidade/ordem/limite da combinação;reutilizar activo e quotas. Tabela ou casoL6 em falta impede apenas o activo dependente. |
|
||||
| Mais-valias autónomas61-A e operações especiais | Ganho100 já incluído no resultado em2026;entrada de activos/fusão;perda transferida de outra sociedade | Implementar apuramento/parcela e reconciliação com resultadoL6,sem dupla incidência ou compensação de perdas presumida;para operações,aplicar54–56/41-A e preservar valores históricos. |
|
||||
| Deduções/majoraçõesCBF17–19 e crédito potencialCBF15 | Formação sem ramo/base de limite;investimento novo com activos elegíveis e excluídos | Implementar elegibilidade,base,limite,ordem,janela temporal e não cumulação. CBF15 emL7 delimita direito/origem/crédito potencial;utilização anual,limitação por créditos/saldos e liquidação ficam emL8. |
|
||||
| Regimes sectoriais/territoriais e disposições especiais | Projecto emZEE sem tratamentoIRPC correspondido;actividade mineira/petrolífera com regime próprio | Implementar a disposição/versão/período aplicáveis ao projecto e à parcela (CBF20–48 ou diploma específico). Endereço/código sectorial só identifica candidato;benefício aduaneiro não se transforma em benefícioIRPC. |
|
||||
| Transporte de efeitosL7 paraM20/M22 | Imposto autónomo ou redução calculados mas sem campo/edição correspondente | Implementar apenas a correspondência demonstrada e a representação aplicável;conservar os montantes exactos e a preparaçãoL6 de referência,sem campo/taxa provisórios. |
|
||||
|
||||
### Dependências documentais que condicionam apenas o caso afectado
|
||||
|
||||
| Elemento em falta / dúvida concreta | Exemplo | Condição de retoma |
|
||||
| --- | --- | --- |
|
||||
| Classificação/incidência,parcela e período da operação | Há uma despesa36g e falta qualificar61(4);ou há actividade elegível e outra não abrangida | Associar prova/declaração da natureza e parcela ao exercício correcto. Informação em falta continua indeterminada;condição negativa e ausência declarada têm suporte próprio. Não inferir pela falta de anexo. |
|
||||
| Estatuto e reconhecimento exigidos pela disposição | Endereço numaZEE sem estatuto do projecto;CBF16 sem instrumento10 ou norma de excepção | Juntar o elemento concreto exigido ou documentar a condição negativa/excepção aplicável. Não pedir aprovador ou parecer jurídico genérico adicional. |
|
||||
| Norma/período/compatibilidade específicos ainda não correspondidos | Redução com termo31/12/2025 pretendida em2026;cumulação cooperativa+CBF16 | Disposição de vigência/prorrogação efectiva ou correspondência da combinação e seus limites. Sem informação nova,não repetir pesquisa transversal;prosseguir com os restantes casos. |
|
||||
| Edição,campo ou representação do formulário | EfectoL7 com campoM20/M22 não identificado ou fracção sem regra de representação | Identificar exemplar/edição,instrução/campo e forma de representar o valor;limitar a pendência ao transporte afectado. O cálculo independente mantém-se disponível. |
|
||||
|
||||
**Limites conservados:** localização não concede benefícios automaticamente;benefício desconhecido não é zero;colecta normal,L7 e imposto autónomo permanecem discriminados. Retenções,pagamentos,aplicação anual de créditos e saldo final a pagar/recuperar continuam emL8. As provas aceites não são invalidadas por esta lista nem por uma dúvida documental num caso independente.
|
||||
|
||||
## 26/10/2026 — reconciliação do estado servido L7 e capacidade do instalador
|
||||
|
||||
Conferência autenticada por leitura em `2026-10-26T13:56:51.412248+02:00` (Africa/Johannesburg):o portal,o registo do instalador e o main actual coincidem em `e07f89da3d59d06aa1b8c50c22a478b7b167bfdd`. **L7 já está instalado no âmbito demonstrado**,com origemQA`ab2ff2fd`;o estado «ainda emQA,sem instalação» é histórico/desactualizado. A instalação terminou em26/10/2026 às13:02:35 locais;backup anterior às12:55:59 e restauro174tabelas/369ficheiros permanecem comprovados pelo recibo de entrega. Nesta passagem,o dump e o arquivo de ficheiros ainda coincidem com os hashes desse backup e a prova de restauro refere o mesmo dump. Não foi apresentado um novo backup/restauro como executado,nem repetida a instalação da revisão já activa.
|
||||
|
||||
**Partição do instalador e backup:**`/dev/md2 / ext4`;release,state,backup,tmp eDocker no mesmo dispositivo. Livres5.52GiB e21448231inodes de29089792. O código do instalador mantém o limiar5GiB;os ficheiros do backup observado ocupam0.164GiB. A leitura satisfaz5GiB+um backup desse tamanho,com margem0.35GiB. A release actual tem28674ficheiros e2503directórios sem seguir links,como referência de escala,não um novo limite arbitrário de inodes. Futuras entregas devem voltar a medir a capacidade imediatamente antes da operação;estes números não garantem uma carga futura diferente. Nenhuma limpeza local/remota foi executada;SGF TEMPO não foi afectado.
|
||||
|
||||
**Só o delta L7:**seis hashes de código correspondem à provaQA;revisão/manifest,sete marcadoresL7,quatroassets e entrada do simuladorHTTP200 conferidos. Reutilizadas as provas19testes/API108/UI/tipos/build e as provas anteriores de preservaçãoL6/L3/ISPC/câmbio;sem nova ronda funcional,escrita privada sintética,migração ou importação. A revisão activa e a anterior permanecem preservadas.
|
||||
|
||||
**Próximo conjunto delimitado para implementaçãoQA:CBF16 com duodécimos.** Reutilizar activos,tabela/taxa normal máxima,método constante,qualificaçãoCBF e periodizaçãoL6 existentes. Primeiro caso:exercício anual civil2026 com entrada em uso durante o ano;imóvel novo do projecto ou máquina industrial/agro-industrial já suportada;sem quotas anteriores,saída ou cumulação de outros benefícios. Ligar a quota mensalL6 ao incrementoCBF16,limitando ao contabilizado/saldo fiscal e mostrando apenas a diferença adicional. Demonstrar condição satisfeita,negativa,informação em falta e ausência declarada,cálculo→gravação→recuperação→relatório,efeitos no lucro/base/colecta e conservação dos históricos. Este conjunto está apenas delimitado:não é novo cálculo instalado.
|
||||
|
||||
Degressivo,reabilitados/usados/reavaliados,quotas anteriores e cumulação cooperativa+CBF16 continuam nos casos próprios. O saldo anterior de sete grupos de código e quatro dependências documentais permanece na mesma matriz,com exemplos/condições de retoma;nenhuma pendência foi apagada. Documento individual em falta limita só o activo/caso dependente. Localização não concede benefício. **L6 operacional delimitado;L7 parcial;retenções,pagamentos,créditos anuais e saldo final emL8.** Recibo:`docs/investmoz/simulations/irpc-l7-server-state-20261026.json`.
|
||||
|
||||
## 26/10/2026 — CBF16 com duodécimos demonstrado em QA
|
||||
|
||||
**QA preparado, sem instalação.** O portal mantém `e07f89da`, incluindo o primeiro conjuntoL7 `ab2ff2fd`. Este incremento implementa a ligação CBF16–duodécimos delimitada no recibo `irpc-l7-server-state-20261026.json`. L6 permanece operacional no âmbito aceite;L7 continua parcial;L8 conserva retenções,pagamentos,aplicação anual de créditos e saldo final a pagar/recuperar. SGF TEMPO não foi afectado.
|
||||
|
||||
**Reutilização e condições:** a opção «Preparar CBF16 com duodécimos» é explícita e conserva os activos,datas,valores e restantes escolhas. O utilizador confirma a reutilização dos meses e da opção mensal do mapaL6. Sem essa opção,os livros/resultados entregues permanecem na fotografia10,com a mesma chave e valores. Com ela,a fotografia11 guarda a preparação,o cálculo e o histórico10 anterior. É possível manter a preparação anual sem alterar automaticamente activos ou apagar resultados anteriores.
|
||||
|
||||
Recorte demonstrado:exercício anual civil2026,activo novo já suportado emL6,imóvel novo afecto ao projecto ou máquina industrial/agro-industrial das categorias correspondidas,método constante pela taxa normal máxima,entrada emuso durante2026,sem saída,quotas anteriores ou cumulação de outros benefícios. Mantêm-se prova das condiçõesCBF3/9,reconhecimento10 quando exigido (ou excepção identificada),afectação e período. Localização/sector não activam benefício. Os meses calculados por L6 incluem o mês da entrada emuso;não se introduz cálculo diário nem uma segunda agenda de amortização.
|
||||
|
||||
**Cálculo:** usa o motor de amortizaçõesL6 existente,com taxa normal×1,5 e os mesmos duodécimos/12. Mantém base depreciável,terreno/residual,limite contabilístico e saldo fiscal. L7 aplica apenas a diferença entre a dedução fiscal normal e a acelerada;não cria outro activo ou uma segunda depreciação contabilística. Os outros activos do mapa conservam a quota normal. O resultado de referênciaL6 e o resultado apósL7 são apresentados separadamente.
|
||||
|
||||
| Caso sintético | Valores demonstrados |
|
||||
| --- | --- |
|
||||
| Máquina existente:base1000,taxa normal10%,entrada15/07/2026,6duodécimos,contabilizado60 | Quota normal50;quotaCBF16 75;dedução limitada60;diferença adicional10MZN. Lucro/base de referência6310 e colecta2019,20;apósL7 lucro/base6300 e colecta2016,00MZN. Saldo finalL8indeterminado. |
|
||||
| Entrada emOutubro,3duodécimos | Quota normal25;quotaCBF16 37,50;diferença12,50 quando o contabilizado a suporta. |
|
||||
| Entrada emDezembro,1duodécimo | Quota normal25/3,quotaCBF16 25/2;diferença exacta25/6MZN,sem arredondamento fiscal presumido. Aproximação de apresentação e valor exacto permanecem distintos. |
|
||||
| Imóvel novo já classificado emL6 | Terreno/residual e base são reutilizados;taxa e meses aplicam-se à mesma base. O exemplo confirma quota40→60,limitada50,com diferença10. |
|
||||
| Falta de suporte da opção/datas/condições | CBF16 fica indeterminado;entradas e referênciaL6 conhecidas conservadas. Não substituir desconhecido por zero. |
|
||||
| Condição negativa / ausência declarada | Estados distintos e documentados;nenhuma taxaCBF16 aplicada à parcela negativa;ausência produz efeito zero justificado. |
|
||||
|
||||
**Demonstração executada:**15testes dirigidos novos,com comparação exacta dos três livros10 aceites (despesa autónoma,cooperativa e amortização anual),sem repetir as suas suites funcionais. API privada:1teste/89asserções,cinco casos mensal/fracção/falta/negativa/ausência,em `simulator_fiscal_delta_20261021_test`,127.0.0.1:55441,guarda de identidade/base e transacção com rollback. Cálculo→gravação→recuperação→HTML e dossier financeiro conferidos a partir dos casos recuperados,com plano/activos/históricos conservados. Recalcular não acumula a diferença adicional. Alterar a data invalida a fotografia corrente sem alterar a anterior.
|
||||
|
||||
UI do componente real:opção explícita/cancelamento,alteração das datas e opção mensal no activoL6,informação em falta,6→3duodécimos,limite75→60,diferença10,fracção25/6,gravação/recuperação local e download do relatório;sem erros de página. Esta prova local é distinta da API. Wayfinder`--with-form`,TypeScript e buildQA passaram. Não houve escrita no activo,migração,importação,activação por consulta de fonte ou nova ronda das provas não afectadas deL3/ISPC/câmbio/L5/L6. O motor de amortizaçõesL6 não foi alterado.
|
||||
|
||||
**Saldo e condição de retoma:** este recorte cobre duodécimos em exercício anual civil2026;períodos fiscais curtos/autorizados distintos,saídas,anos posteriores,quotas anteriores,quota escolhida inferior à máxima,degressivo,reabilitados/usados/reavaliados e cumulações mantêm correspondência própria. Retomar cada caso quando a respectiva regra/período/contabilização e compatibilidade estiverem ligados ao activo/documentos já existentes,e demonstrar só o seu efeito novo. Uma pendênciaL6 afecta apenas o activo dependente. Os restantes grupos do saldoL7 e os camposM20/M22 ainda sem correspondência mantêm-se;este lote não preenche campos oficiais por aproximação nem conclui o IRPC.
|
||||
|
||||
**Entrega agrupada:** os casos compatíveis mensal/fracção/negativa/ausência/informação insuficiente acompanham o mesmo candidato. A capacidade remota de5,52GiB/21448231inodes observada às13:56:51 de26/10 é histórica,não confirmação para nova instalação. Antes da próxima entrega,medir outra vez espaço/inodes na partição de release+backup+temporários,confrontar com o limiar existente5GiB e o backup/carga dessa execução,conferir o main então actual e executar backup/restauro fresco. Manter a versão activa até a nova ficar pronta. Não executar limpeza local ou doSGF para substituir esse controlo remoto.
|
||||
|
||||
Fontes e inventário8143 reutilizados dos cotejos aceitesCBF16 eDecreto72/2013art9;originais preservados,sem pesquisa transversal repetida. Recibo:`docs/investmoz/simulations/irpc-l7-months-qa-20261026.json`;provas locais:`outputs/irpc-l7-months/`. Reprodução dirigida: `node --test tests/frontend/irpc-special-months.test.mjs`; `php tools/irpc-special-months-qa.php routes`; `php tools/irpc-special-months-qa.php test`; `tsc --noEmit`; build com `INVESTMOZ_QA_BUILD=1`.
|
||||
|
||||
## 26/10/2026 — CBF16 com duodécimos instalado pelo Git
|
||||
|
||||
Instalado `0bd5d495505d512088887efd3dc5c61f645b1647`,com `e07f89da3d59d06aa1b8c50c22a478b7b167bfdd` preservado como versão anterior. O main não apresentava divergência;integração por fast-forward sem alterações de código à candidataQA. Backup fresco `2026-10-26T12:34:42Z` e restauro isolado sem rede/55441:174tabelas e369ficheiros/configuração conferidos. Capacidade medida imediatamente antes:5.50GiB e21448052inodes;depois do backup:5.33GiB,acima do limiar existente5GiB,com inodes disponíveis confrontados com a carga observada. Sem limpeza local/remota ou intervençãoSGF.
|
||||
|
||||
Conferidos3ficheiros do delta,60ficheiros de execução protegidos e31originais. Schema,roles/grants e permissões iguais;172tabelas de negócio mantêm o backup,cache/sessões reconciliadas com eventos operacionais/acessos públicos. Revisão/manifest,marcadoresCBF16 e suporte10,assets e simuladorHTTP200 conferidos. Sem migrações,importações,recálculo de históricos ou escrita privada sintética no activo. Reutilizadas as provasQA15testes/API89/UI/tipos/build;apenas os controlos automáticos obrigatórios do procedimentoGit e a conferência do delta instalado.
|
||||
|
||||
O exemplo mantém quota normal50,quotaCBF16 75 limitada ao contabilizado60:dedução adicional**60−50=10MZN**,não75 nem uma segunda amortização. Lucro/base apósL7 6300 e**colecta simulada2016MZN**;saldo final a pagar/recuperar por determinar emL8. Os tratamentos de despesas autónomas,cooperativas abrangidas e amortizações anuais anteriores permanecem disponíveis,com fotografias/históricos conservados. O estadoQAsem instalação é histórico para este incremento.
|
||||
|
||||
**SaldoL7:**CBF16 anual com duodécimos entregue;continuam fora deste recorte períodos curtos/não civis,saídas,anos/quotas anteriores,métodos/categorias não correspondidos,cumulações e restantes famílias/transportesM20M22 já discriminados na mesma matriz. Retoma por regra/período/contabilização e compatibilidade do caso;documentos em falta só limitam o dependente. O próximo conjunto a executar emQA é**CBF16 em período curto por início de actividade de residente em2026**,reutilizando tipo/período e mesesL6,sem anualizar base ou taxa. Cessação,transição e outras extensões conservam âmbito próprio. L6operacional delimitado;L7parcial;localização não concede benefício;L8conserva liquidação final. Recibo:`docs/investmoz/simulations/irpc-l7-months-delivery-20261026.json`.
|
||||
|
||||
## 26/10/2026 — CBF16 no início de actividade demonstrado em QA
|
||||
|
||||
**QA preparado, sem instalação.** O portal mantém `0bd5d495`, com duodécimos anuais e os tratamentos anteriores preservados. Este incremento cobre apenas CBF16 num período curto por início de actividade de residente em2026,com meses completos até31/12. Reutiliza período,tipo,suporte e activosL6,sem anualizar resultados. Não altera o motor cambial/de amortizaçõesL6 nem volta a pesquisar fontes/provas aceites.
|
||||
|
||||
A preparação é explícita dentro dos duodécimosCBF16. Pode reutilizar o suporte já declarado emL6 por acção do utilizador,sem modificar datas,activos ou qualificação. Exige condiçõesCBF3/9,reconhecimento10 quando aplicável ou excepção identificada,afectação do activo e suporte do período. Activo novo já correspondido,entrada emuso no período,método constante pela taxa normal máxima,sem quotas anteriores,saída ou cumulação. A localização não activa benefícios. Sem a nova opção,as fotografias10/11 mantêm chaves e resultados;com ela,a fotografia12 conserva o resultado11 e todo o histórico anterior.
|
||||
|
||||
| Caso novo | Efeito demonstrado |
|
||||
| --- | --- |
|
||||
| Início1Julho;máquina com entrada15Julho,base1000,taxa10%,contabilizado60 | 6mesesL6;quota normal50,acelerada75,limitada60:dedução adicional10MZN. Lucro/baseL6 3130→L7 3120;colecta simulada1001,60→998,40MZN. Saldo finalL8indeterminado. |
|
||||
| InícioOutubro / Dezembro | 3 /1meses efectivos;sem anualização. Dedução adicional5 /5/3MZN,com fracção exacta e aproximação de apresentação separadas. |
|
||||
| Suporte em falta | SóCBF16 fica indeterminado;referênciaL6 conhecida e entradas conservadas. |
|
||||
| Condição negativa / ausência declarada | Estados distintos e justificados;efeito zero identificado,sem taxa acelerada aplicada à parcela negativa. |
|
||||
|
||||
Provas novas dirigidas:9testes;API privada1teste/97asserções emQA isolada127.0.0.1:55441/base `simulator_fiscal_delta_20261021_test`,com guarda e transacção/rollback. Cinco casos passaram cálculo→gravação→recuperação→HTML e dossier financeiro. Comparação exacta do resultado11 aceite e conservação de todo o histórico,plano,activos e outros livros;recalcular não acumula deduções. Interface real demonstrou preparar/cancelar,reutilizar suporteL6,pendência,limites,fracções,guardar/recuperar e exportar,sem erros. Wayfinder`--with-form`,TypeScript e buildQA passaram. Conferidos584ficheiros protegidos e31originais sem alteração;nenhuma migração/importação/escrita privada no activo. SGF TEMPO separado.
|
||||
|
||||
**Saldo concretoL7 — código:**(1)outras origens/parcelas de despesas autónomas;(2)cooperativas mistas/retidas e demais entidades9–14;(3)CBF16 cessação/transição/períodos não civis,saídas,quotas/anos anteriores,quota inferior,métodos/categorias e cumulações;(4)mais-valias61-A/operações54–56/41-A;(5)CBF17–19 e direito potencial15;(6)regimes sectoriais/territoriais;(7)transporteL7M20/M22. A extensão de início de actividade sai deste saldo apenas no recorteQA acima;cessação é um próximo candidato compatível,reutilizando o períodoL6,com regra/quotas/saída próprias a demonstrar antes de se declarar suportada.
|
||||
|
||||
**Documentos por caso — exemplos/retoma:**despesa36g sem qualificação61(4)→associar natureza/parcela/período;projecto sem reconhecimento10→instrumento ou norma de excepção exigida;cumulação cooperativa+CBF16→disposição aplicável,ordem e limites;efeitoL7 sem campoM20/M22→exemplar/edição/campo e representação das fracções. Não são novos aprovadores ou revalidações genéricas. A dúvida limita o caso/campo dependente;as demais provas permanecem válidas.
|
||||
|
||||
Entrega agrupada preparada para os cinco casos compatíveis,sem instalação deste incremento. Na futura entrega:medir novamente espaço/inodes/carga de compilação e backup,conferir o main então actual e executar backup/restauro fresco,mantendo a versão activa até a nova ficar pronta. O controlo de5,50GiB antes/5,33GiB após backup desta entrega0bd5d495 é histórico,não garantia futura. **L6 operacional delimitado;L7 parcial;colecta distinta do saldo final deL8.** Recibo:`docs/investmoz/simulations/irpc-l7-start-period-qa-20261026.json`;provas:`outputs/irpc-l7-start-period/`. Reprodução dirigida:`node --test tests/frontend/irpc-special-start-period.test.mjs`;`php tools/irpc-special-start-period-qa.php routes`;`php tools/irpc-special-start-period-qa.php test`;`tsc --noEmit`;build com `INVESTMOZ_QA_BUILD=1`.
|
||||
|
||||
### Porquê investir — fundo azul, 26/10/2026
|
||||
|
||||
Pedido expresso da Tempo: ajustar o fundo para azul bebé ou azul IBM. Escolha de apresentação: IBM Blue 20, #D0E2FF, da paleta oficial https://www.carbondesignsystem.com/building-blocks/foundations/color/code. Substitui #BBC0C6 apenas no bloco dos cinco parágrafos; a decisão anterior fica no histórico. Inventário do delta: mantidos texto escuro, geometria compacta, cinco parágrafos editoriais, 12 anteriores, sete cartões, 15 links e a disposição aprovada, sem perda confirmada. Sem alteração de schema, dados, configuração, permissões ou cálculos. Registo em V2-01 na matriz existente. Verificação deste azul concluída: build e diff passaram; prévia isolada em 1440 e 390 px confirmou rgb(208, 226, 255), equivalente a #D0E2FF, sem alteração da geometria, 17 parágrafos ou 15 links e sem transbordo. Captura de computador inspeccionada. Recibo em outputs/why-invest-blue-20261026/layout.json. Sem prova do activo; alteração local sem publicação.
|
||||
|
||||
## 26/10/2026 — CBF16 cessação e quotas anteriores: entrega agrupada preparada em QA
|
||||
|
||||
**QA, sem instalação.** O conjunto inclui `ba83afe7` (início de actividade) e acrescenta cessação da actividade em2026 e quotas anteriores documentadas de activos que entraram emuso em2025. A versão do portal comunicada permanece `0bd5d495`;não se voltou a instalar ou a conferir remotamente o activo nesta passagem. O main entretanto avançou para `ae0d74bb`;a candidata incorpora a alteração visual de «Porquê investir»,a nota do manual e a linhaV2-01 da matriz,sem perda das notas fiscais. Nenhum ficheiro dessa alteração foi substituído pelo incrementoL7.
|
||||
|
||||
**Condições e reutilização.** Preparação opcional13,distinta de início12 e do recorte mensal11,sem alteração das chaves/resultados anteriores. Usa sujeito/período/activos/quotas e saldosL6. CBF3/9/10/16,Decreto72/2013 art3(3),9(1–3) e10 eCIRPC7(4):condições/afectação/reconhecimento ou excepção identificados,ano civil2026 ou cessação de residente desde1Janeiro até ao último mês completo,contabilização/saldos reconciliados,método constante pela taxa normal máxima,duodécimos desde entrada emuso e ausência de cumulação. Localização não concede benefício.
|
||||
|
||||
O recorte de implementação admite activos novos a custo histórico com entrada2025/2026. A selecção destes anos é coberturaQA,não um limite legal inventado para os restantes activos. Valores anteriores contabilísticos,fiscais,parcela temporariamente tributada e suporte são reutilizados deL6;não se recalculam taxas/benefícios de exercícios passados. Uma entrada em2026 com quotas anteriores positivas fica por reconciliar. Informação em falta não é zero;condição negativa e ausência declarada permanecem distintas.
|
||||
|
||||
**Cessação não é saída do activo.** O termo do período limita os meses efectivos,sem preencher transmissão/inutilização por presunção. Uma saída de activo documentada dentro do período reutiliza a dataL6 e exclui o mês do evento,conformeart9(2);sem ela,reutiliza os meses do período. Este ramo só apura a amortização,não calcula uma mais-valia ou operação de transmissão por aproximação.
|
||||
|
||||
| Caso sintético novo | Efeito no cálculo |
|
||||
| --- | --- |
|
||||
| Cessação30Junho,activo emuso desdeJaneiro2026,sem quotas anteriores,contabilizado60 | 6meses;quota normal50,acelerada75 limitada60;diferença adicional10MZN. Lucro/base3130→3120;colecta simulada1001,60→998,40MZN. Sem saída do activo presumida. |
|
||||
| Mesmo período,activo2025;quotas anteriores contabilísticas150,fiscais100,parcela recuperável50 | Dedução normal50;acelerada75,incluindo15 de parcela anterior. Diferença adicional25MZN,sem somar novamente os15. Saldo anterior aritmético50→35;saldo fiscal após dedução850→825. Lucro/base3130→3105;colecta simulada1001,60→993,60MZN. Os saldos declarados150/100/50 permanecem intactos. |
|
||||
| Ano civil2026,mesmos saldos anteriores,contabilizado120 | Dedução100→150,incluindo30 de parcela anterior;diferença adicional50MZN e saldo anterior aritmético20. Lucro/base6260→6210;colecta simulada2003,20→1987,20MZN. |
|
||||
| CessaçãoJunho com saída do activo documentada20Junho | 5meses;quota normal125/3 eacelerada125/2;diferença125/6MZN. Fracção exacta preservada,sem arredondamento fiscal presumido. |
|
||||
| Saldo fiscal remanescente20 ou contabilização/parcela anterior insuficiente | Ambos os cálculos respeitam os mesmos limites;dedução adicional pode ser zero,sem exceder a base nem consumir saldos oficiais. |
|
||||
| Suporte em falta / condição negativa / ausência declarada | Estados e efeitos separados;uma falta de suporteCBF16 mantém a referênciaL6 conhecida e limita apenas o benefício dependente. Um saldoL6 desconhecido limita também os cálculos que dele dependem. |
|
||||
|
||||
**Provas novas:**11testes dirigidos,API privada1teste/123asserções,sete casos cálculo→gravação→recuperação→HTML/dossier financeiro. BaseQA `simulator_fiscal_delta_20261021_test`,127.0.0.1:55441,guarda de identidade e transacção com rollback. Comparação exacta do resultado12 aceite,conservação de todo o histórico,activos,plano e outros livros;recalcular não acumula a dedução nem reduz os saldos declarados. Interface real:preparar/cancelar,preencher apenas os suportes novos,pendência,recuperação15/saldo35,saída5meses/fracção,gravação/recuperação/exportação e ausência/negativa,sem erros. Wayfinder`--with-form`,TypeScript ebuildQA passaram;build/tipos conferidos também após incorporar o main. Reutilizadas,sem repetir,as provas aceites de `ba83afe7` e dos restantes percursos. MotoresL6 de amortizações/periodização/câmbio,schema,configuração,permissões,originais e provas anteriores preservados. SGF TEMPO separado;nenhuma escrita no activo,migração ou importação.
|
||||
|
||||
**Saldo concreto — código:**(1)outras origens/segregações de despesas autónomas;(2)cooperativas mistas/retidas e demais entidades9–14;(3)CBF16 com activos anteriores a2025,períodos parciais/não civis/transição,saídas fora do recorte,quota inferior,métodos/categorias e cumulações;(4)mais-valias61-A/operações54–56/41-A;(5)CBF17–19 e direito potencial15;(6)regimes sectoriais/territoriais;(7)transporteL7M20/M22. O recorte agora demonstrado deixa de figurar como integralmente por implementar,mas permanece apenas emQA. Retomar extensõesCBF16 com a regra temporal/método/base ligada aos activos e demonstrar o efeito novo;retomar mistos/cumulações com segregação,ordem e limites,sem pesquisar novamente o que já está aceite.
|
||||
|
||||
**Dependências documentais por caso:**natureza/parcela/período da operação→associar os factos e o exercício;reconhecimentoCBF10→instrumento ou excepção exigida;quotas anteriores150/100/50 sem suporte→reconciliar a parcela temporariamente tributada,sem incluir exclusões permanentes;cumulação→disposição/ordem/limites aplicáveis;campoM20/M22→exemplar/edição/campo e representação exacta. A falta limita só o caso/campo dependente,não exige aprovadores ou revalidação genérica de fontes.
|
||||
|
||||
**Entrega agrupada preparada:**início12 de `ba83afe7` mais cessação/quotas anteriores13,com as provas aceites e novas separadas no mesmo pacote. Antes de instalar,voltar a conferir main,espaço/inodes/carga de compilação ebackup,executar backup/restauro fresco e manter a versão activa até a nova ficar pronta. **L6 operacional delimitado;L7 parcial;colecta simulada não é saldo final:retenções,pagamentos,créditos anuais e saldo a pagar/recuperar permanecem emL8.** Recibo:`docs/investmoz/simulations/irpc-l7-cessation-prior-qa-20261026.json`;provas:`outputs/irpc-l7-cessation-prior/`. Reprodução só do delta:`node --test tests/frontend/irpc-special-cessation-prior.test.mjs`;`php tools/irpc-special-cessation-prior-qa.php routes`;`php tools/irpc-special-cessation-prior-qa.php test`;`tsc --noEmit`;build com `INVESTMOZ_QA_BUILD=1`.
|
||||
|
||||
## 26/10/2026 — CBF16 início, cessação e quotas anteriores instalado pelo Git
|
||||
|
||||
**Instalado `632dc06930d6b4f1b012feb3b4daa3b1cfc53f39`,incluindo `ba83afe7`.** Entrega única do início de actividade,cessação e quotas anteriores no âmbitoQA demonstrado. `0bd5d495` permanece como release anterior;históricos e provas aceites conservados. O main `ae0d74bb` e a alteração visual de «Porquê investir» foram incorporados,preservando texto/cor/geometria e a linhaV2-01 da matriz. Sem instalação separada dos dois incrementos.
|
||||
|
||||
**Capacidade e recuperação:**a primeira medição confirmou 4.32GiB,abaixo do mínimo existente5GiB,e a falha anteriorae0d74bb por falta de espaço;versão activa preservada. Conferidas ausência de instalaçõesnpm e de ficheiros abertos,só a cache regenerável `/root/.npm/_cacache` foi limpa pelo comando npm próprio. Recuperados 2.82GiB;32logs npm anteriores e `_npx` preservados. Sem apagar releases,backups,dependências dos projectos,provas únicas ou ficheirosSGF. Nova medição:7.15GiB e21431150inodes;após backup:6.99GiB,acima do limiar5GiB,com capacidade de backup/compilação e escala de inodes conferidas. O limiar do instalador não foi reduzido.
|
||||
|
||||
Backup fresco `2026-10-26T13:29:24Z`:174tabelas e369ficheiros/configuração conferidos;restauro isolado sem rede/porta55441 com174checksums iguais. Schema,roles/grants e permissões mantidos. Só depois destas guardas,integraçãoGit por fast-forward sem forçar o histórico. A release anterior ficou activa até a nova estar pronta. Revisão/manifest servidos,marcadores12/13 e restantes leitores,assets e simuladorHTTP200 conferidos após instalação. Três ficheiros do delta fiscal,60ficheiros protegidos/enquadrados no main e31originais correspondem ao destino preparado. Dados de negócio comparados com o backup;cache/sessões reconciliadas com eventos operacionais/acessos públicos. Sem migrações,importações ou escrita privada sintética no activo.
|
||||
|
||||
**Resultado demonstrado preservado:**dedução normal50MZN→acelerada75MZN;**75−50=25MZN adicionais**. Os15MZN recuperados de quotas anteriores **já estão incluídos nos75**,não são somados novamente. Saldo anterior aritmético35MZN;valores declarados150/100/50 e históricos mantidos,sem consumo de saldos oficiais. Lucro/base3105MZN e**colecta simulada993,60MZN**;saldo final a pagar/recuperar permanece indeterminado emL8. Cessação da actividade não presume transmissão/inutilização dos activos;saída só quando documentada no mapa existente.
|
||||
|
||||
Reutilizadas as provas aceites:início12 (9testes/API97) e cessação/quotas13 (11testes/API123),UI real,gravação/recuperação/relatórios,tipos/build. Não se repetiram as respectivas suites por iniciativa desta entrega;apenas os controlos automáticos obrigatórios do procedimentoGit e a conferência do delta instalado. Os motoresL6 de amortizações,periodização e câmbio mantêm-se;L3,ISPC,L5 e demais provas aceites não foram reabertos. Recibo:`docs/investmoz/simulations/irpc-l7-grouped-delivery-20261026.json`;provas locais:`outputs/irpc-l7-grouped-delivery-20261026/`.
|
||||
|
||||
**SaldoL7 e próxima retoma:**continuam próprios as cumulações (por exemplo cooperativa+CBF16:identificar disposição,parcela elegível,ordem e limites antes de combinar),outras origens/segregações de despesas autónomas,cooperativas mistas/retidas e demais entidades,extensõesCBF16fora dos anos/períodos/métodos/categorias demonstrados,mais-valias61-A/operações54–56/41-A,CBF17–19/direito potencial15,regimes sectoriais/territoriais e transporteM20/M22. Mantém-se a separação entre código por implementar e documentos por caso:natureza/parcela/período,reconhecimento ou excepção exigida,saldos anteriores temporariamente tributados,norma/ordem/limites de cumulação e edição/campo/fracção. Uma falta limita só o caso/campo dependente;sem pesquisa transversal repetida ou aprovador genérico. **L6 operacional delimitado;L7 parcial;L8 conserva retenções,pagamentos,créditos anuais e saldo final.** Cada futura entrega volta a medir capacidade e executar backup/restauro fresco.
|
||||
|
||||
## 26/10/2026 — Cumulações L7 demonstradas em QA e saldo do simulador
|
||||
|
||||
**QA pronto,sem instalação.** `632dc069`,incluindo `ba83afe7`,está entregue e deixa de constituir pendência de instalação. A próxima candidata acrescenta apenas a qualificação e o cálculo das combinações abaixo;mantém resultados/entradas/históricos10–13. L6 continua operacional no âmbito demonstrado;L7 parcial;L8 conserva a liquidação final.
|
||||
|
||||
**Regra aplicada e fontes reutilizadas:**CBF4,APIEXp66,veda a cumulação dos benefícios específicos entre si ou com os genéricos,salvo previsão expressa. CBF13,APIEXp70,delimita os genéricos a investimentos não destinatários de específicos;CBF16,APIEXp72,é genérico. CIRPC12/14,PDF5/p768(59),reduz50% da taxa geral nas cooperativas abrangidas,excluindo rendimentos sujeitos a retenção. A correspondência agora implementada trata a reduçãoCIRPC12 e o efeitoCBF16 genérico em fases distintas,no mesmo sujeito/projecto/período,quando ambos estão qualificados e não há benefício específico nem outro benefício por corresponder. Não transforma o artigo4 numa proibição genérica de todos os tratamentosCIRPC, nem numa autorização de qualquer outra combinação. Não há novo parecer/aprovador genérico como condição;as condições dos artigos e documentos concretos continuam necessárias.
|
||||
|
||||
A opção «Preparar cumulações dos tratamentosL7 registados» reutiliza cooperativa,activos,períodos,despesas e suportes existentes. Discrimina presença/ausência de específicosCBF,excepção expressa invocada e outros benefícios,em lugar da antiga confirmação global de ausência de outros benefícios;esta entrada anterior permanece conservada,sem alteração automática das escolhas. Não selecciona benefício pela localização. Uma incompatibilidade não escolhe o tratamento a manter,não apaga registos e não aplica o benefício específico sem motor próprio. A nova preparação é opcional14;sem ela,as chaves/modelos anteriores permanecem exactos.
|
||||
|
||||
| Caso novo | Efeito demonstrado |
|
||||
| --- | --- |
|
||||
| Cooperativa agrária abrangida +CBF16 genérico,períodoJan–Jun2026 e activo2025/quotas anteriores já entregues | Lucro/baseL6 3130;CBF16 deduz só25adicionais e obtém3105;depois taxa16% sobre3105:colecta simulada496,80MZN. Os15recuperados já estão nos75deduzidos,sem outra dedução. Não se somam reduções monetárias calculadas sobre bases diferentes. |
|
||||
| Mesmo caso com despesa36g100 e incidência61(4) qualificada | Acréscimo100 já emL6:lucro3230→3205 após25CBF16;colecta ordinária512,80MZN à taxa16%;imposto autónomo35MZN separado,sem redução cooperativa;colecta combinada547,80MZN. Nenhum novo acréscimo da despesa. |
|
||||
| EspecíficoCBF22 declarado no mesmo projecto +genérico16,sem excepção expressa | Combinação incompatívelCBF4/13;totalL7indeterminado e entradas conservadas. ReferênciaL6 conhecida mantida. O artigo/taxa do benefício específico não é aplicado por presunção. |
|
||||
| Excepção invocada/outro benefício/presença de específico ou suporte em falta | Estado indeterminado até corresponder artigo,âmbito,período,ordem e limites. Não tratar desconhecido como ausência. |
|
||||
| Duplicação de activo ou dedução positiva não correspondida já registada na baseL6 | Impede reaplicar a mesma origem;registo e valor original conservados,sem preencher outro benefício por aproximação. |
|
||||
| Saldo fiscal20 /base tributável zero | Dedução respeita saldo e contabilização,sem saldo negativo. Numa base zero a colecta ordinária é zero,mas o imposto autónomo35 permanece,sem compensação pelo prejuízo. |
|
||||
| Condição cooperativa negativa /ausênciaCBF16 declarada | Apenas o tratamento efectivamente aplicável permanece;estados separados,sem forçar acumulação. |
|
||||
|
||||
**Ordem e limites:**diferença fiscalCBF16 uma vez→mesmas deduções/perdasL6→matéria colectável→taxa cooperativa16% na base integralmente elegível→imposto autónomo35% separado. Mantêm-se limites de contabilização,parcela anterior recuperável e saldo fiscal do activo,sem alterar os saldos declarados ou consumir saldo oficial. A redução não se estende a rendimentos mistos/retidos nem ao imposto autónomo. O relatório apresenta a origem documental/activo,a dedução normal,a acelerada,a recuperação já incluída e a única diferença adicional.
|
||||
|
||||
**Demonstração nova:**12testes dirigidos,API privada1teste/133asserções e sete casos cálculo→gravação→recuperação→HTML/dossier financeiro. BaseQA `simulator_fiscal_delta_20261021_test`,127.0.0.1:55441,guarda de identidade e transacção/rollback. Resultado13 aceite reproduzido exactamente e histórico integral,activos,saldos,plano e outros livros conservados;recalcular não acumula valores. Interface real demonstrou preparar/cancelar,preencher só as declarações novas,combinação permitida,incompatibilidade,excepção não correspondida,falta de informação,imposto autónomo separado,guardar/recuperar e exportar,sem erros. Wayfinder`--with-form`,TypeScript ebuildQA passaram. Sem repetir suites aceites,migração,importação ou escrita no activo;SGF TEMPO separado. MotoresL6 de amortizações/periodização/câmbio e31originais preservados.
|
||||
|
||||
**SaldoL7:**este recorte sai do grupo «cumulação ainda não implementada» apenas paraCIRPC12+CBF16 e a coexistência separada61(4),com as condições acima. Permanecem por implementar outras cumulações/excepções expressas,CBF17–19 e direito potencial15,regimes específicos,parcelas cooperativas mistas/retidas e demais entidades,outras origens de despesas,extensõesCBF16,mais-valias/operações especiais e transporteM20/M22. Retoma por disposição/artigo/ordem/limite e parcela identificados,implementando os tratamentos ainda ausentes;documento individual em falta limita só o caso/campo dependente. Não reabrir as provas aceites ou pesquisar outra vez dúvidas sem informação nova.
|
||||
|
||||
**Quanto falta no simulador:**a matriz conserva estimativas iniciais,sem uma reestimativa actual do esforço integral restante. SóL8–L14 somavam inicialmente240–416horas (30–52dias de8h);esta referência não é um saldo actualizado nem inclui resíduosL1–L7,L15–L16 ou espera documental. L8 contém liquidação/pagamentos/créditos/saldo final;L9–L14 contêm INSS,IRPS,Selo,direitos aduaneiros eICE;L15–L16,SISA/encargos imobiliários,ainda por dimensionar. L6 mantém5grupos de código e5documentais;L5 mantém as dez dúvidasAT só para os casos dependentes. Os lotes e grupos não são unidades iguais,não sustentam uma percentagem global de conclusão. A cobertura já entregue continua utilizável com limites explícitos;simulador fiscal integral permanece um trabalho de dezenas de dias na referência de planeamento,sem prazo fechado.
|
||||
|
||||
Entrega agrupada preparada com os sete casos novos compatíveis;incompatibilidade e informação insuficiente acompanham o mesmo candidato como estados demonstrados. Não houve instalação nesta passagem. A futura entrega requer main compatível,capacidade do servidor medida novamente ebackup/restauro fresco,mantendo a versão activa até a nova ficar pronta. Recibo:`docs/investmoz/simulations/irpc-l7-combinations-qa-20261026.json`;provas:`outputs/irpc-l7-combinations/`. Reprodução só do delta:`node --test tests/frontend/irpc-special-combinations.test.mjs`;`php tools/irpc-special-combinations-qa.php routes`;`php tools/irpc-special-combinations-qa.php test`;`tsc --noEmit`;build com `INVESTMOZ_QA_BUILD=1`. **L7 parcial;colecta simulada distinta do saldo finalL8.**
|
||||
|
||||
Conferência de compatibilidade:main `a7434cd2` incorporado na candidata,com apresentação/catálogo e linhas não fiscais da matriz preservados. Recuperada a adenda históricaQA13 que tinha desaparecido do manual no main;isto é perda documental,não perda do cálculo13. Só tipos/build de integração foram conferidos novamente;provas fiscais aceites conservadas. A revisão servida não foi consultada nesta passagemQA.
|
||||
|
||||
## 26/10/2026 — Cumulações L7 entregues pelo Git
|
||||
|
||||
**Instalado `f8d57bddf96b4610604a013fcc5bdd703c7dc6d5`.** A anteriora7434cd2,que já incluía632dc069,fica preservada. Main/candidata compatíveis;apresentação ecatálogo sectorial entregues entretanto mantidos. A notaQA anterior é histórica:não há pendência de instalação deste incremento.
|
||||
|
||||
Medição inicial:5.06GiB,com inodes suficientes,mas sem margem para o backup fresco mais o mínimo5GiB do instalador. Recuperados0.21GiB somente da cache versionada de compilaçãoNode em`/tmp/node-compile-cache`,sem gestores de pacotes ou ficheiros abertos. Fontes,node_modules,releases,backups,logs,originais eSGF mantidos;permissões/proprietário da pasta preservados. Nova capacidade:5.26GiB e21374782inodes. Backup fresco`2026-10-26T14:20:47Z`:174tabelas/369ficheiros econfiguração;restauro isolado sem rede/55441 com174checksums iguais. Após o backup restavam5.10GiB,acima do mínimo5GiB de compilação;a guarda de um segundo backup não é requisito para repetir o backup acabado de executar. Nenhum limiar foi reduzido.
|
||||
|
||||
Só depois destas guardas,integraçãoGit sem forçar histórico;release anterior activa até a nova estar pronta. Compilação,tipos econtrolos automáticos do procedimento passaram:1054testesfrontend,API59testes/317asserções,preservação1teste/3106asserções. Reutilizadas as provasQA12testes/API133/UI/relatórios,não repetidas por iniciativa desta entrega. Conferidos4ficheiros fiscais do delta,68protegidos,31originais,369persistentes/configuração e174tabelas;172tabelas de negócio mantidas,cache/sessões reconciliadas com eventos operacionais/acessos públicos. Schema,roles/grants epermissões iguais;sem migrações/importações/escrita privada sintética. Revisão/manifest servidos,15marcadores,4assets eHTTP200 do simulador conferidos.
|
||||
|
||||
O recorte mantém a diferençaCBF16 de25MZN aplicada uma vez,com15recuperados já incluídos nos75deduzidos;depois aplica16% à base cooperativa integralmente elegível. No caso combinado,colecta496,80MZN;com despesa autónoma qualificada,512,80+35=547,80MZN. Valores são colecta simulada,não saldo finalL8. IncompatibilidadeCBF4/13,excepções sem correspondência e informação em falta permanecem explícitas;nenhum benefício é escolhido ouapagado automaticamente.
|
||||
|
||||
Após a instalação ficaram4.14GiB livres. Antes de outra compilação,voltar a resolver capacidade contra o mínimo existente e o backup dessa execução;esta entrega foi concluída e não autoriza apagar releases,backups ou provas. SaldoL7 e primeiro incrementoL8 são discriminados na secção seguinte. Recibo:`docs/investmoz/simulations/irpc-l7-combinations-delivery-20261026.json`;provas:`outputs/irpc-l7-combinations-delivery-20261026/`. **L7 parcial;L8 conserva saldo final.**
|
||||
|
||||
## 26/10/2026 — Saldo consolidado de L7 e primeiro incremento delimitado de L8
|
||||
|
||||
**L7 parcial,com a entrega de cumulaçõesf8d57bdd registada acima.** Deixam de estar pendentes de instalação a combinaçãoCIRPC12+CBF16 no recorte qualificado,a separação do imposto autónomo61(4) e os estados de incompatibilidade/falta/excepção não correspondida demonstrados. Isso não implementa todas as cumulações nem os tratamentos abaixo. Fontes oficiais e provas aceites permanecem válidas;documento em falta limita só o caso/campo que dele dependa.
|
||||
|
||||
| CódigoL7 ainda por implementar | Exemplo e condição concreta de retoma |
|
||||
| --- | --- |
|
||||
| Outras origens/segregações de despesas autónomas | Despesa100 com apenas60 correspondidos em36g ou encargo fora do resultado:ligar origem/parcela e incidência61(4),sem segundo acréscimo. |
|
||||
| Cooperativas mistas/retidas e demais entidades9–14 | Base agrária com serviços não abrangidos ou rendimentos sujeitos a retenção:segregar proveitos/custos/base e aplicar o artigo específico;não reduzir tudo a16%. |
|
||||
| ExtensõesCBF16 e outras combinações | Activo anterior a2025,usado/reabilitado/reavaliado,método/período fora da cobertura,ou excepção expressa à não cumulação:ligar regra temporal/base/método e disposição,ordem e limites à parcela;reutilizar activos/quotas,sem reescrever o passado. |
|
||||
| Mais-valias61-A e operações54–56/41-A | Ganho já incluído no resultado ou transferência de activo/perda:implementar apuramento e reconciliação próprios,sem dupla incidência ou compensação presumida. |
|
||||
| CBF17–19 e direito potencial15 | Formação/investimento com activos e despesas elegíveis/excluídos:implementar base,limite,janela temporal e compatibilidade. Direito/origem do crédito emL7;utilização anual e saldo emL8. |
|
||||
| Regimes sectoriais/territoriais e benefícios específicos | EstatutoZEE ou projecto de infra-estruturas:aplicar disposição/período efectivos e excepção quando prevista;endereço/sector não concede benefício. |
|
||||
| TransporteL7M20/M22 | Efeito calculado sem campo/edição correspondente:identificar exemplar,instrução,campo e representação;conservar o cálculo exacto independente. |
|
||||
|
||||
**Documentos por caso,distintos de código:**natureza/parcela/período;estatuto/reconhecimento exigido ou norma de excepção;saldos anteriores e distinção de exclusão temporária/permanente;disposição/ordem/limites da combinação;exemplar/edição/campo/representação. Não pedir nova validação genérica da autenticidade de fontes aceites,nem repetir pesquisas anteriores sem informação nova. Não preencher campo,código,taxa ou saldo por presunção.
|
||||
|
||||
### L8 — primeiro percurso a implementar em QA:colecta→pagamentos comprovados→saldo simulado
|
||||
|
||||
**Delimitado,não implementado ou instalado nesta passagem.** Recorte inicial:IRPC de residente no regime geral,ano civil2026,MZN,com colecta corrente determinada e suportes que permitem reconciliar o fecho. Parte de uma execuçãoL6 válida ou deL7 válida quando os efeitos aplicáveis estejam qualificados;guarda chave/versão/NUIT/período e valores de origem. Não soma colectaL6 com colectaL7 nem a colecta ordinária com uma colecta combinada que já a inclua. Não usa uma versãoL6 para ignorar um efeitoL7 positivo ou pendente que afecte o mesmo fecho. Um caso ordinário independente não espera pela implementação de outro benefício ou por um campoM20/M22 desconhecido.
|
||||
|
||||
**Dados reutilizados e qualificações novas apenas onde necessárias:**
|
||||
|
||||
1. **Colecta:**reutilizar a execução e as condições existentes,distinguindo colecta ordinária,imposto autónomo e colecta combinada. O primeiro fecho completo limita-se aos casos com ausência documentada de tributação autónoma/mais-valias que exija liquidação própria. Se existir imposto autónomo positivo,a parcela ordinária pode ser apresentada,mas não como saldo total até corresponder a articulação;não o apagar ou compensar por pressuposto.
|
||||
2. **Retenções sofridas:**reutilizarL5 apenas quando `direction=received`,natureza `on_account`,origem efectiva,documento/prova e montante sofrido reconciliados,mesmo sujeito/NUIT/período e rendimento incluído na base apropriada. Retenção entregue pela empresa por pagamento a terceiros,retenção definitiva,mera projecção,guia sem pagamento ou montante ainda não comprovado não são crédito próprio. EmL7cooperativa,a declaração de ausência de rendimentos retidos não pode coexistir silenciosamente com retenção recebida positiva;esse caso exige a segregação própria,sem bloquear o regime normal independente.
|
||||
3. **Pagamentos por conta efectuados:**registar/reutilizar comprovativo,identificador,data,exercício,sujeito e montanteMZN;reconciliar parcelas e pagamentos sem dupla utilização. Neste primeiro incremento,não calcular automaticamente a obrigaçãoPPC a partir do exercício anterior,nem transformar tesouraria prevista em pagamento efectuado.
|
||||
4. **Outros créditos/PEC:**reutilizar a informação existente e distinguir valor conhecido,ausência declarada e falta de informação. O primeiro percurso completo exige ausência documentada dePEC e créditos por dupla tributação/investimento/outros créditos ainda sem limite/ordem correspondidos. Presença positiva mantém a parcela/fecho dependente indeterminado;não usar zero. CBF15 potencialL7 não é automaticamente crédito anual utilizável. PEC não se transforma em montante reembolsável nem recebe transporte de3/5anos por presunção.
|
||||
5. **Identidade/duplicação:**contrapartes e documentos existentes são reutilizados;qualificar beneficiário e NUIT do próprio sujeito. Deduplicar por origem/documento/comprovativo e controlar afectações parciais;um comprovativo não pode aparecer integralmente em retenções ePPC,ou em dois exercícios. Preservar valores declarados e histórico,sem consumo de saldo oficial.
|
||||
|
||||
**Resultado e sequência a demonstrar:**colecta válida→deduções admissíveis e respectivas ausências→retenções efectivamente sofridas por conta→PPC comprovados→saldo aritmético→aplicação das regras de cobrança/reembolso do recorte→montante simulado a pagar ou recuperar. Mostrar a decomposição e o sinal;zero só com entradas completas ou ausência documentada. Informação em falta não transforma a colecta em saldo final. Como a base nasce do plano,o resultado continua uma simulação identificada,não autoliquidação submetida,pagamento efectuado ou reembolso deferido/recebido.
|
||||
|
||||
**Fontes já disponíveis para o cotejo dirigido de implementação:**CIRPC63/67,natureza das retenções com as alteraçõesLei12/2025;RegulamentoDecreto9/2008 art21(2–5),ordem/limites das deduções,eart27(1–2/6),pagamentos e reembolso. O exemplar aceite prevê no27(6) um mínimo de100MZN;esse parâmetro e a fronteira devem ser ligados à versão/período aplicáveis antes de activar o consumidor,não inferidos de um rótulo de formulário. O cotejo de aplicabilidade/alterações desta regra é trabalho de implementação da fonte aceite,não pedido de certificação genérica nem reabertura dos cálculosL6/L7. Arts64–66/PEC e créditos específicos mantêm as suas regras próprias;juros/multas/calendário,geração de guias,submissão e processamento de reembolso seguem incrementos próprios.
|
||||
|
||||
| Critério de aceitação a executar,sem prova reivindicada agora | Exemplo sintético proposto |
|
||||
| --- | --- |
|
||||
| Saldo positivo com pagamentos/retencões válidos | Colecta1408−retenção sofrida300−PPC500=608MZN de saldo aritmético;qualificar valor a pagar segundo a regra aplicável. |
|
||||
| Saldo negativo | Colecta1408−retenção1000−PPC600=−192MZN;identificar192 a recuperar no recorte,se a regra permitir,sem afirmar reembolso recebido. |
|
||||
| Zero e fronteiras do mínimo | Colecta1408−408−1000=0;demonstrar os lados inferior/igual/superior do mínimo do parâmetro versionado,sem arredondamento novo. |
|
||||
| Ausência vs informação em falta | Ausência documentada de retenções/PPC/outros créditos permite saldo com parcelas zero justificadas;suporte ou natureza por determinar mantém só o fecho dependente indeterminado. |
|
||||
| Reutilização e dupla dedução | Seleccionar retenção recebida e comprovativo existentes,recusar pagamento a terceiros/retenção definitiva/duplicado e demonstrar conservação dos originais e cenários anteriores. |
|
||||
| Cálculo→gravação→recuperação→relatório | Novo livro/snapshotL8 ligado à chave da colecta e às provas seleccionadas;resultado13/14 eL5 anteriores imutáveis;mudança da fonte invalida a fotografia corrente sem recalcular históricos. Relatório/exportação apresenta colecta,abatimentos,saldo e lacunas concordantes. |
|
||||
|
||||
Só serão demonstradas estas novas regras/efeitos,emQA isolada e com as guardas existentes. Fracções continuam exactas;representação/campos oficiais sem correspondência ficam identificados e não bloqueiam cálculo independente. Pagamentos noutra moeda,períodos especiais,PEC/créditos positivos,liquidação autónoma e demais situações ficam no saldo concreto deL8,com condição de retoma por regra,origem,limite,período e prova. A documentação deste recorte não é novo cálculo executável.
|
||||
|
||||
### Esforço global:referência inicial não é previsão actual
|
||||
|
||||
As240–416horas deL8–L14 permanecem identificadas como referência inicial de planeamento,não saldo actual nem prazo assumido. Antes de estimar o conjunto:reconciliar por lote o que já está implementado/reutilizável e o que falta em código;descontar provas aceites sem as repetir;separar espera documental;incluir resíduosL1–L7,integrações/entregas eL15–L16,SISA/encargos imobiliários. Campos de entrada,fontes inventariadas ou percentagens isoladas não provam percurso executável completo. Contar apenas o delta necessário e não somar duas vezes componentes partilhados. Esta passagem entregaL7 e delimitaL8;gere uma estimativa reconciliada futura,sem converter os intervalos iniciais numa promessa global. **L7 parcial;saldo finalL8 ainda não implementado nesta entrega.**
|
||||
|
||||
## 26/10/2026 — L8: primeiro saldo anual simulado demonstrado em QA
|
||||
|
||||
**QA concluído em `11a6cee9`; ainda sem instalação.** `f8d57bdd` permanece a entrega comunicada no portal. Este incremento reutiliza a colecta corrente de L6 ou o total ordinário L7 aplicável, sem somar ambos nem contornar um tratamento pendente. Recorte: sujeito residente no regime geral, ano civil de 2026, MZN, sem PEC/créditos positivos ou imposto autónomo que exijam liquidação própria. L6 operacional no âmbito demonstrado; L7 mantém o saldo parcial já discriminado. Não há nova pesquisa ou reabertura das provas aceites.
|
||||
|
||||
**Percurso executável:** «Preparar saldo anual L8» reutiliza NUIT, exercício e chave/versão da colecta sem substituir edições deliberadas. Selecciona os comprovativos L5 recebidos, efectivos, por conta e reconciliados; confirma o próprio beneficiário e a inclusão do rendimento na base do exercício. Retenções entregues pela empresa por pagamentos a terceiros, definitivas ou projectadas não são abatimentos próprios. PPC exige recibo, emitente, data, titular, exercício, moeda, montante comprovado, parcela utilizada e confirmação do pagamento efectivo; não usa previsões do plano nem calcula a obrigação PPC. A reutilização não apaga provas ou consome saldos oficiais.
|
||||
|
||||
Conhecido, ausência declarada com suporte e informação em falta são estados distintos. Ausência contraditória, titular/exercício divergente, prova em falta ou origem desactualizada mantêm o saldo dependente indeterminado. A identidade normalizada do emitente/comprovativo detecta repetição mesmo com data alterada; a mesma prova não pode ser retenção e PPC. Controla limites do comprovativo e da afectação L5, incluindo parcelas em outros contextos do mesmo dossier. São simulações alternativas, sem reserva central ou consumo de crédito fiscal entre dossiers independentes.
|
||||
|
||||
| Caso demonstrado | Resultado L8 simulado |
|
||||
| --- | --- |
|
||||
| Colecta 1 408 − retenção sofrida 300 − PPC 500 | **608 MZN a pagar**. |
|
||||
| Colecta 1 408 − retenção sofrida 1 000 − PPC 600 | Saldo aritmético −192: **192 MZN a recuperar**, sem afirmar reembolso recebido. |
|
||||
| Colecta 1 408 − retenção 408 − PPC 1 000 | Saldo zero, com parcelas completas. |
|
||||
| Ausência declarada de retenções/PPC, PEC ausente e outros créditos conhecidos zero | 1 408 MZN a pagar; estados conhecidos/ausentes conservados. |
|
||||
| PPC por comprovar, prova repetida ou PEC positivo ainda sem regra própria | Saldo a pagar/recuperar indeterminado; entradas e subtotais conhecidos conservados. |
|
||||
| Fronteiras do mínimo: saldos ±99,99 e ±100 | Aritmética exacta; abaixo de 100 MZN sem cobrança/reembolso neste recorte; em 100 aplica pagar/recuperar. Sem arredondamento ou transporte de crédito inventado. |
|
||||
| Colecta anual L7 acelerada aceite de 1 996,80, sem abatimentos declarados | Reutilizada uma vez: saldo simulado 1 996,80, sem somar a referência L6 nem recalcular o benefício. |
|
||||
|
||||
**Fontes e limites:** CIRPC arts. 63/67, Lei 34/2007 e natureza da retenção na redacção aplicável da Lei 12/2025; Regulamento Decreto 9/2008 arts. 21(2–5) e 27(1–2/6). O mínimo de 100 MZN do art. 27(6) está ligado ao recorte ordinário de 2026; as alterações IRPC do acervo de 2025 não substituem essa regra. Exemplares, páginas e hashes constam do recibo, com aceitação oficial anterior preservada. Não generalizar este parâmetro a períodos/regimes não correspondidos. PEC positivo, crédito de investimento, dupla tributação e outros créditos não recebem abatimento, limite, transporte ou reembolso presumidos. Um crédito potencial L7 não passa automaticamente a crédito utilizável L8.
|
||||
|
||||
**Gravação e recuperação:** livro opcional `irpcAnnual` no snapshot existente, por contexto, sujeito e exercício; ligado à execução da colecta e às provas L5 seleccionadas. Guarda o input e o resultado simulado, acrescenta o resultado anterior ao histórico sem o recalcular, e invalida o resultado corrente quando mudam as fontes/entradas. HTML e dossier financeiro recuperam colecta, provas/parcelas, estados, saldo, lacunas e limites concordantes. Sem preparação L8, os relatórios anteriores não ganham linhas L8. Plano, originais, livros e históricos L5–L7 permanecem imutáveis. O saldo não é declaração submetida, pagamento efectuado ou reembolso recebido.
|
||||
|
||||
**Provas novas:** 19 testes frontend dirigidos; API privada QA, 1 teste/170 asserções, sete casos com cálculo → gravação → recuperação → HTML/dossier; base isolada `simulator_fiscal_delta_20261021_test`, loopback 55441, guarda de identidade e transacção com rollback. Interface real: preparar, preencher só dados em falta, seleccionar prova, impedir repetição, pagar/recuperar/zero/ausência/indeterminação, guardar/recarregar/recuperar/exportar, sem erros de página. Wayfinder `--with-form`, TypeScript e build QA passaram. Comparação de 2 832 ficheiros anteriores: só três pontos de integração alterados, mais os cinco ficheiros novos do incremento; motores L5/L6/L7, fontes, fixtures, schema, configuração e permissões preservados; 31 originais iguais. Não se repetiram suites aceites de L3, ISPC, câmbio ou L5–L7. SGF TEMPO separado.
|
||||
|
||||
### Saldo concreto L8 após este incremento
|
||||
|
||||
| Código ainda por implementar | Condição concreta de retoma |
|
||||
| --- | --- |
|
||||
| PEC e créditos positivos: investimento, dupla tributação e outros créditos próprios | Correspondência do crédito, titular/exercício, montante efectivamente disponível, ordem, limite e transporte aplicáveis; prova de cada saldo. Não presumir reembolsabilidade ou prazo de 3/5 anos. |
|
||||
| Liquidação de imposto autónomo/61-A e articulação com o saldo anual | Segregar a parcela autónoma e corresponder quais abatimentos podem incidir sobre ela; não a ignorar nem compensar automaticamente com prejuízo/PPC. |
|
||||
| Períodos especiais e comprovativos noutra moeda | Corresponder exercício/data de afectação e regra cambial fiscal do pagamento; reutilizar periodização/câmbio existentes sem confirmar pressupostos por omissão. |
|
||||
| Cálculo da obrigação PPC/PEC, calendários, juros/multas e guias | Regra, parâmetros, factos e vencimentos próprios por período. O registo de PPC efectuado já demonstrado não calcula a obrigação. |
|
||||
| Transporte oficial M20/M22, submissão e processamento de reembolso | Edição/campo, representação de fracções e fluxo de recepção correspondidos; sem preencher campos provisórios como oficiais. |
|
||||
|
||||
**Esclarecimentos documentais aguardados:** permanecem as dúvidas concretas L5/L6/L7 já registadas, sem nova pesquisa repetida. Exemplo: cooperativa com rendimentos mistos/retidos requer segregação antes de utilizar retenção positiva; excepção de cumulação exige disposição, período e limites correspondidos; campo M20/M22 divergente requer edição/campo exactos. Cada falta só bloqueia o seu caso. Ausência de documento num cenário não bloqueia o saldo normal independente acima.
|
||||
|
||||
**Próxima entrega:** compatibilidade conferida com `origin/main` em `f8d57bdd`, sem incorporar runtime do checkout raiz. Nenhum acesso ou operação no servidor nesta passagem. Os 4,14 GiB são o valor comunicado, não medição nova; antes de instalar, medir espaço/inodes, confirmar capacidade para backup/restauro fresco e compilação isolada, mantendo a versão activa até a nova estar pronta. Recibo: `docs/investmoz/simulations/irpc-l8-first-qa-20261026.json`; provas: `outputs/irpc-l8-settlement/`. Reprodução só do delta: `node --test tests/frontend/irpc-annual-settlement.test.mjs`; `php tools/irpc-annual-settlement-qa.php routes`; `php tools/irpc-annual-settlement-qa.php test`; `tsc --noEmit`; build com `INVESTMOZ_QA_BUILD=1`. **L8 parcial, QA pronto, sem instalação.** A referência inicial de 240–416 horas L8–L14 não é previsão actual; permanece necessária a reconciliação do trabalho reutilizado, resíduos e L15–L16 antes de assumir prazo global.
|
||||
|
||||
## 27/10/2026 — entrega L8 preparada; instalação adiada por capacidade
|
||||
|
||||
**Candidato `14360748` pronto; não instalado.** A conferência SSH autenticada de 27/10, 06:05 UTC (08:05 em Moçambique), confirmou `f8d57bdd` como revisão activa e `main` remoto. Compatibilidade por ancestralidade, pacote QA e 168 ficheiros do destino conferidos: 134 ficheiros protegidos, três integrações anteriores e 31 originais. O delta executável continua limitado a cinco ficheiros L8; os 19 testes, API/170 asserções, interface, recuperação/relatórios, tipos e build aceites foram reutilizados, sem nova ronda.
|
||||
|
||||
**Impedimento concreto:** partição `/dev/md2`, montada em `/`, com 4 402 343 936 bytes livres (**4,10 GiB**) e 21 340 182 inodes disponíveis. Inodes suficientes face à referência da release (31 259 entradas). O instalador existente exige **5 GiB livres após o backup**; com a referência observada do backup anterior de 175 917 490 bytes, faltam pelo menos **1,07 GiB adicionais antes do backup**. É uma estimativa mínima de capacidade, a medir novamente; não uma autorização para reduzir o limiar. Caches regeneráveis de Composer/Node somam cerca de 0,12 GiB e não cobrem a diferença. Diagnóstico apenas por leitura, sem limpeza de caches, releases, backups, provas, dependências ou ficheiros SGF TEMPO.
|
||||
|
||||
**Decisão expressa do utilizador: «Manter a entrega preparada por agora».** Não foram executados backup/restauro frescos, integração no `main` nem instalação. A versão activa foi preservada e a sessão SSH encerrada. Na retoma, seleccionar o ramo candidato `codex/irpc-l8-settlement-qa-20261026`, voltar a conferir `main` e revisão servida, medir capacidade/espaço/inodes, executar backup/restauro fresco e compilação isolada, mantendo o activo até a nova release estar pronta. Só depois conferir a revisão servida e o delta L8. As notas desta espera ficam no ramo documental `codex/irpc-l8-delivery-capacity-20261027`; não mudam o código candidato. L8 parcial, PEC/créditos próprios separados e saldo L7 preservado. Recibo: `docs/investmoz/simulations/irpc-l8-delivery-capacity-20261027.json`; provas e auxiliares preparados: `outputs/irpc-l8-first-delivery-20261027/` no checkout raiz.
|
||||
## 27/10/2026 — identidade proactiva: primeiro incremento demonstrado em QA
|
||||
|
||||
**QA concluído em `3439f350`; sem instalação, publicação real ou análise económica validada.** Partida no `main` remoto `f8d57bdd`, conferido novamente antes da entrega. Ramo separado `codex/proactive-investment-first-qa-20261027`, worktree `C:/laragon/www/portal-investidor-proactive-qa-20261027`. A referência local `fa02c70` e o ramo `codex/proactive-investment-scope-20261027` não foram encontrados no repositório consultado; o âmbito expresso da Tempo foi suficiente e não se criou dependência desse commit. **L8 `14360748` mantém-se preparado, sem instalação e sem integração nesta candidata.** A capacidade do servidor continua fora deste trabalho local. Sem SSH, instalação, limpeza do servidor ou intervenção no SGF TEMPO nesta passagem.
|
||||
|
||||
### Diagnóstico dirigido e decisões de implementação
|
||||
|
||||
| Componente existente | Reutilização e lacuna concreta tratada |
|
||||
| --- | --- |
|
||||
| `geo_locations`, `sectors`, `value_chains`, `projects`, `economic_clusters`, `development_corridors`, `investment_zones` | Mesmos identificadores, hierarquia, sectores e referências públicas já disponíveis; selectores e catálogo existentes. Não se criaram mestres territoriais, empresas, projectos ou estruturas para completar campos em falta. |
|
||||
| `investment_gaps` e `investment_specific_needs` | Mantidos nos seus âmbitos de lacuna de cluster/cadeia e necessidade de manifestação. O schema público exige contexto de cluster/cadeia/capacidade no primeiro e submissão/opções no segundo. Não se inventam esses valores para guardar uma hipótese territorial inicial. A análise editorial é uma parte versionada do rascunho existente, não outro catálogo ou cadastro de lacunas económicas validadas. |
|
||||
| `Opportunity`, `OpportunityManagement`, `management_draft`, `audit_events` | Acrescentado só o bloco opcional `proactive`: evidências, necessidade, ideia e relações. Reutilizados identidade, chave de criação, etag, rascunho, auditoria cifrada e versões. Criação repetida não duplica a ficha; versão antiga não sobrescreve edição concorrente. |
|
||||
| Editor de oportunidades e designação interna da equipa | Lacuna confirmada: a preparação inicial exigia organização promotora até quando desconhecida. Permitida a preparação/edição de análise proactiva sem promotor real apenas no âmbito da designação interna existente. Organização real fica nula; operador e responsável continuam identificados. Sem novo papel, aprovador, grant activo ou permissão universal. Os restantes percursos mantêm as condições anteriores; actores não designados e operadores de outro âmbito são recusados. |
|
||||
| `portal_resources`, `documents`, `opportunity_documents` e gestor documental existente | Referência ao documento já associado, fonte, exemplar, localizador, período, abrangência, cobertura e verificação. Não copia o binário nem altera direitos, classificação ou scan. Documento interno/restrito ou fora do âmbito não passa a público pelo formulário da análise. Listas de empresas, hotéis e restaurantes continuam inicialmente internas. |
|
||||
| `OpportunityPromotion` e catálogo/ficha existentes | Síntese expressamente pública, prévia e confirmação no fluxo já autorizado, com MFA normal. Nenhum texto interno é preenchido automaticamente. Estado da necessidade e estado da publicação são independentes. Consulta anónima só da versão publicada. |
|
||||
| `InvestorContext`, escolhas por oportunidade, `desk_cases`, `InvestorPath` e simulador | A origem, versão, território, sector, cadeia/etapa, relações públicas seleccionadas, pressupostos e limites seguem no contexto cifrado do dossier existente. Selecções múltiplas conservam uma fotografia por ideia; o consumidor/simulador recebe só a escolha em tratamento. Título e outras edições deliberadas são preservados. Sem regra fiscal nova ou benefício inferido da localização. |
|
||||
|
||||
### Implementado e demonstrado
|
||||
|
||||
- **Evidência:** actividades, recursos, infra-estruturas, oferta e procura; facto separado da interpretação. Finalidade local ou metodológica, acesso interno ou público autorizado e documento associado opcionais. Duplicação de evidência ou da mesma referência na análise é recusada. Informação em falta permanece em falta.
|
||||
- **Necessidade:** problema, oferta/procura observadas, quantidade/qualidade/logística/transformação/coordenação/apoio, clientes/beneficiários, fontes, limites e pendências. Pode guardar como hipótese. Confirmação exige os campos/fundamento e evidências locais seleccionadas com proveniência/cobertura/período/verificação; referência internacional, por si só, não confirma procura local. Histórico mostra hipótese e confirmação anteriores sem recalcular nem apagar os originais.
|
||||
- **Ideia:** solução, actividade, cadeia existente/etapa, abrangência, recursos, criar/expandir/associar, pressupostos, condições, pendências e próxima acção. Relações com estruturas existentes mantêm a qualificação documentada, hipotética ou proximidade. Nenhuma relação cria contrato, energia acessível, terra disponível, participação ou benefício fiscal.
|
||||
- **Aplicabilidade:** “O que existe” mostra evidências e contexto; “Necessidade” acrescenta a lacuna; “Ideia” acrescenta a solução. Campos anteriores ficam conservados quando ocultos. Não se exigem montante, promotor, coordenadas ou uma oportunidade previamente publicada para iniciar a preparação da equipa.
|
||||
- **Divulgação:** grupos “O que existe”, “Necessidades identificadas” e “Ideias de investimento” no catálogo existente; a consulta de oportunidades cadastradas conserva a verificação de disponibilidade na respectiva ficha. Uma ideia não é convertida em oportunidade com participação disponível. Textos públicos são redigidos separadamente, com revisão expressa da exposição directa/indirecta. Evidências internas e cópias literais detectadas são bloqueadas; uma confirmação pública depende do fundamento público seleccionado. Relações divulgadas transportam apenas referência pública, qualificação e base pública, sem copiar a referência privada.
|
||||
- **Continuidade:** criar → guardar → recuperar → editar → prévia/publicação em QA → consulta anónima → autenticação → dossier → recarregar/retomar sessão. Login e MFA Fortify normais demonstrados com contas sintéticas QA. O mesmo contexto chega ao dossier, sem substituir o título deliberado do investidor. Relatório existente mostra origem, estado, fundamento, evidências, relações, pressupostos, limites e próximo passo por ideia; sem preparação proactiva não acrescenta linhas.
|
||||
|
||||
### Referências metodológicas do Ruanda — dependência resolvida
|
||||
|
||||
O responsável forneceu os dois caminhos após a procura dirigida inicial. Exemplares acessíveis, originais preservados e hashes conferidos antes/depois. **Não foram importados ou publicados no portal.** Texto integral extraído e imagens de leitura ficam apenas nas provas privadas/ignoradas; o pacote entrega rastreabilidade e paráfrases metodológicas, sem os originais ou a reprodução integral dos diapositivos.
|
||||
|
||||
| Exemplar e passagem utilizada | Aplicação delimitada |
|
||||
| --- | --- |
|
||||
| `20070627_Rwanda_5d0cc43d-c990-4cf1-8ee9-ada71094918f.pdf`, 31 páginas, capa “Creating a Competitive Rwanda”, Michael E. Porter/HBS, Kigali, Junho2007. SHA256 `18b07a9379a1ad0baa33697d57d6237f15a6fec346db44bfee7506bf1fa27dee`. P14, “Improving the Business Environment: The Diamond”; P27, “Role of the Private Sector in Economic Development”, conferidas visualmente. | Perguntar por factores de produção, procura, fornecedores, actividades e serviços de apoio; distinguir relação documentada de acesso/compromisso. Cada afirmação sobre Moçambique precisa de evidência local própria. |
|
||||
| `Rwanda Competitiveness Briefing_Prof Porter_OTF.ppt`, 50 diapositivos na leitura nativa PowerPoint, capa “How Rwanda Competes Today”, RNIC, briefing para Prof. Porter, 20Julho2008. SHA256 `4a9325ad64278cb0ef3c60367a05ee2ed9262e2cd49a48d579061349914aa830`. Slide17, procura turística, fonte/amostra/período visíveis; slide20, constrangimentos por etapa da cadeia do chá; slide24, diagnóstico mineiro, texto em ordem nativa. | Conservar fonte, período, abrangência e cobertura/amostra das observações; estruturar etapas e limitações em vez de presumir uma lacuna. Dados, valores, projecções e instituições estrangeiras não são transferidos para os pilotos nem para regras fiscais. Slide17 conferido visualmente;20/24 lidos em texto nativo, sem alegar conferência visual desses dois. |
|
||||
|
||||
Os caminhos completos e os trechos/limites estão no recibo. O PDF2007 e o briefing2008 são exemplares distintos. Os 91 grupos de texto históricos encontrados numa exploração OLE não foram usados como número de diapositivos; a ordem nativa de 50 é a referência do PPT. A metodologia internacional orienta perguntas e organização; não demonstra procura em Cahora Bassa, Montepuez ou Gurué.
|
||||
|
||||
### Guia curto de utilização em QA
|
||||
|
||||
1. Entre na conta da equipa com a designação existente e abra **Minhas oportunidades → Nova oportunidade → Preparar análise e ideia**. Escolha título, sector e nível territorial conhecidos. O promotor real pode ficar por identificar; não são necessários montante ou coordenadas.
|
||||
2. Acrescente evidências. Separe o facto da interpretação e preencha fonte/exemplar, localizador, período, abrangência, cobertura e data de verificação. Marque referências internacionais como **metodológicas** e listas internas como **internas**. Use o documento já associado quando disponível.
|
||||
3. Mantenha a necessidade como **hipótese** enquanto faltar fundamento local. Para confirmar, explicite problema, observações, tipo, beneficiários, fundamentação e evidências locais. “Confirmada” não significa viabilidade comercial demonstrada. Guarde com motivo e recupere o rascunho; o histórico conserva o fundamento anterior.
|
||||
4. Quando aplicável, escolha **Ideia de investimento** e prepare solução/actividade, cadeia/etapa, recursos, relações e próxima acção. A proximidade fica identificada como proximidade. Escolhas existentes e campos ocultos continuam conservados.
|
||||
5. Abra **Divulgação promocional — Em preparação**. Redija os campos públicos separadamente, seleccione só evidências públicas e relações autorizadas, reveja a exposição directa/indirecta, prepare a prévia e confirme **apenas em QA**. A referência privada da relação e os documentos internos não são copiados. A revisão editorial continua humana no fluxo existente; o controlo literal não é validação semântica de todas as inferências possíveis.
|
||||
6. Consulte sem sessão em `/oportunidades?perspective=ideas` (ou `exists`/`needs`). **Iniciar ou continuar o roteiro deste investimento** utiliza a autenticação e o dossier existentes. Confirme o contexto na prévia antes de guardar; pode continuar um dossier ou criar um novo. Para várias ideias, escolha a que está em tratamento nos consumidores. O simulador recebe o contexto e conserva os seus dados/regras próprios; não calcula sem dados ou pressupostos explícitos.
|
||||
|
||||
**Reprodução técnica só do delta:** `php tools/proactive-investment-qa.php routes` (`--with-form`); `php tools/proactive-investment-qa.php test`; `node --test tests/frontend/proactive-investment.test.mjs`; `tsc --noEmit`; build com `INVESTMOZ_QA_BUILD=1`. Base isolada `proactive_investment_20261027_test`,127.0.0.1:55441, clonada do QA anterior com o mesmo schema/identificadores; guarda de identidade e rollback nos testes. Flags existentes de perfis/contratos especializados/percurso foram configuradas só no bootstrap QA; `.env`, configuração activa e grants activos não mudaram. O servidor HTTP de prova usou127.0.0.1:18760, não a homologação.
|
||||
|
||||
### Provas, preservação e saldo concreto
|
||||
|
||||
**Passaram:**14 testes da API/139asserções;7testes frontend de relatório/isolamento por ideia;Wayfinder,TypeScript ebuildQA;interface real com login/MFA,criação/edição/recuperação,histórico,perguntas aplicáveis,prévia/publicação QA,consulta anónima,contexto após autenticação,recarregar/retomar sessão,relações/pressupostos e ausência de erros de página. Casos Cahora Bassa/energia,Montepuez/mineração eGurué/chá são **inequivocamente sintéticos**,reutilizando distritos e sectores existentes. Não se publicou uma análise económica real nem se validou um mercado.14testes não são nova ronda de L3/ISPC/câmbio/L5–L8.
|
||||
|
||||
**Preservado:**15pontos de integração anteriores e7ficheiros novos de código/testes/guarda;89ficheiros de motores fiscais e31originais fiscais iguais,mais os2originais Ruanda intactos. Sem migrações ou novo catálogo/base territorial/sistema de permissões. Sem escrita na base origem ou activa;fixtures/grants sintéticos apenas no clone QA. A candidataL8 `14360748` conserva exactamente a mesma referência. O checkout raiz recebe somente este registo documental,sem integrar o runtime do ramoQA.
|
||||
|
||||
| Estado | Saldo e condição concreta de retoma |
|
||||
| --- | --- |
|
||||
| Implementado e demonstrado neste incremento | Percurso editorial técnico completo acima, no recorte QA e com os estados/limites visíveis. Pode preparar novos investimentos sem depender de oportunidades publicadas. |
|
||||
| Parcial — conteúdo económico real dos três pilotos | Recolher oferta/procura locais,exemplares,períodos,cobertura e informação de clientes/beneficiários;relacionar recursos/serviços com evidência. Só os casos apoiados por esses dados podem mudar de hipótese. Nenhuma falta bloqueia outra análise independente. |
|
||||
| Dependência documental/comercial | Contrato/encomenda,energia acessível,terra,participação disponível e condições comerciais precisam de prova específica por caso. A qualificação formal da oportunidade continua nos campos/fluxos existentes;este incremento não a presume a partir da localização,lista de empresas ou necessidade. Listas e contactos privados exigem síntese autorizada e revisão editorial no fluxo actual antes de qualquer divulgação. |
|
||||
| Dependência resolvida | Os dois exemplares Ruanda foram localizados/lidos nos trechos identificados;deixam de constar como ficheiros indisponíveis. A sua existência não substitui a evidência local. |
|
||||
| Trabalho futuro,fora do primeiro incremento | Automatizar inventário,indicadores,comparação/priorização e eventual IA;quantificar mercado/custos/rentabilidade só com dados/pressupostos explícitos;eventual correspondência a lacunas mestre de cluster quando os seus campos e fundamento forem conhecidos. Não há novo prazo global ou implantação activa reivindicados. |
|
||||
| Entrega futura no destino | CandidataQA peloGit apenas. Conferir o main vigente e compatibilidade com outros incrementos antes de integrar;capacidade,backup/restauro e instalação são uma execução separada autorizada. A espera de capacidade deL8 não foi contornada. |
|
||||
|
||||
Recibo:`docs/investmoz/unification/proactive-investment-first-qa-20261027.json`;provas:`outputs/proactive-investment-20261027/`. Não há novos cálculos fiscais,submissão AT,publicação na homologação ou alteração do SGF TEMPO.
|
||||
|
||||
## 27/10/2026 — primeiro caso proactivo com fontes reais: Cahora Bassa / apoio metrológico
|
||||
|
||||
**Análise preliminar privada demonstrada em QA, sobre o runtime aceite `3439f350` / candidata `1afab4a2`, sem nova alteração funcional ou instalação.** Caso `CB-METROLOGIA-20261027`, ficha QA `401`, dossier privado QA `894343c7-c33d-452e-a6a5-b6675f77ee23`. O operador é uma conta sintética QA já existente; os factos e referências desta análise são reais e identificados, distintos dos cenários fictícios anteriores. Não se publicou a análise, não se contactou comprador ou prestador e não se transportaram contactos, documentos pessoais ou NUIT das listas. L8 `14360748` conserva a mesma referência e continua separado. Main remoto conferido: `f8d57bdd`; sem SSH, limpeza, instalação ou intervenção no SGF TEMPO.
|
||||
|
||||
### Escolha do piloto e fontes reutilizadas
|
||||
|
||||
| Piloto | Resultado da triagem dirigida |
|
||||
| --- | --- |
|
||||
| **Cahora Bassa — seleccionado** | A lista empresarial fornecida contém referências históricas locais de reparação/manutenção mecânica e eléctrica. O acervo inclui a reprodução histórica da concessão HCB. Foram acrescentados o relatório primário HCB2024, a página institucional de engenharia e, decisivamente, o Plano de Compras HCB2026 publicado pelo IGEPE, que delimita um serviço concreto de calibração. É uma decisão por disponibilidade de fundamento nesta ronda, sem ranking de rentabilidade ou potencial económico. |
|
||||
| Montepuez | Há referências empresariais internas e fontes mineiras localizadas. Não foi escolhido nesta ronda um âmbito primário de aquisição tão directamente utilizável para esta aplicação. Não se conclui que falte actividade ou procura; continua elegível para outro caso documentado. |
|
||||
| Gurué | Há referências históricas internas ligadas ao chá e perfis/fontes públicos localizados. Os constrangimentos antigos encontrados não bastam para atribuir automaticamente uma lacuna actual à cadeia do chá. Não foram transpostos para a proposta de Cahora Bassa. |
|
||||
|
||||
Inventário anterior de606 fontes preservado e consultado; listagem dirigida dos documentos acessíveis no acervo e triagem dos dois workbooks empresariais/cadastro turístico ficam nas provas privadas. Os workbooks têm grãos/períodos/versões distintos e registos repetidos: não se somaram os totais entre eles nem se contou uma denominação repetida como várias empresas. O cadastro de alojamento de3–5estrelas não demonstrou cobertura distrital comparável neste recorte; não demonstra ausência de hotéis ou serviços e não foi usado para inferir procura metrológica.
|
||||
|
||||
| Evidência / exemplar | Âmbito usado e limite |
|
||||
| --- | --- |
|
||||
| HCB, **Relatório e Contas2024**, edição bilingue,63páginas PDF; PDFp9/página impressa14. URL `https://hcbadm.mzbusiness.com/wp-content/uploads/2025/08/Relatorio-e-Contas-2024-Bilingue-VF-1.pdf`. SHA256 `d0fed6af0e40fffd6f7f385152fdbfff2a10cae0b66c9d7a59a0a99658758080`. | Actividade e infra-estruturas existentes da HCB. Página conferida visualmente; não é carteira de contratos disponíveis. Matambo não é atribuída ao distrito de Cahora Bassa. |
|
||||
| HCB, **Plano Anual de Compras2026**,8páginas; PDFp1,2.ª/3.ªlinhas de dados. URL `https://igepe.org.mz/wp-content/uploads/2026/06/HCB-Plano-Anual-de-Aquisicoes-2026.pdf`. SHA256 `cbc93102fea61a712c193d1c1815e7ec19e7d570ee2703c1b1390d4c05e5bd8e`. | Duas entradas de calibração de equipamento de medida e monitorização, concurso limitado, previsões19/02–30/06 e05/05–14/09/2026. Em27/10/2026 os prazos previstos já passaram. Plano não confirma procedimento aberto, adjudicação ou procura ainda insatisfeita. “1” em “Qtde de Itens” não é número de instrumentos; linhas de igual designação não provam dois contratos independentes. Conferência visual da tabela. |
|
||||
| Lista fornecida **Empresas Licenciadas.xlsx**, `Servicos Tempo/Relatorios/novos/docs`, folha`EMPRESAS`; SHA256 `1b5087b464e39e88c42def39655c2391aaaf684b4c832d6a77ff274b98889f00`. | Pistas internas: L19376,D19376,O19376:P19376,U19376:V19376 e L55640,D55640,O55640:P55640,U55640:V55640. Licenças2018/2021, não capacidade actual. Linhas12243/19376/65567 repetem denominação e não são contadas como três empresas. Nenhuma lista/contacto foi copiada para publicação. |
|
||||
| **CAE eBAU.xlsx** fornecido, folha`CAE`, B857/F857 e B859/F859. | Etiquetas de33120 — reparação/manutenção de máquinas/equipamentos e33140 — equipamento eléctrico, lidas no exemplar fornecido. Não comprovam calibração, qualificação, acreditação ou vigência actual de licença; não se declarou uma versão oficial actual do catálogo sem identificação. Hash/caminho no recibo. |
|
||||
| **HCB-TERMOS-DO-CONTRATO-DE-CONCESSAO.pdf** fornecido, página única; BR I Série47,21/11/2007,Decreto57/2007,artigo2. SHA256 `f4afc62f140d197cae3bf395674adce2eba37f0436261d52d7eb554f6230a073`. | Contexto documental histórico da actividade, conferido visualmente. Sem análise da vigência actual ou aplicação de regra ao novo investimento. Direitos de concessão não se tornam direitos do promotor. Original preservado, não importado/publicado. |
|
||||
| Página institucional HCB`https://www.hcb.co.mz/hidroelectricidade`, consultada27/10/2026. | Contexto do complexo e CAPEX Vital; sem data editorial precisa ou progresso actualizado de cada obra. Não comprova contratação adicional. Captura/hash privados; sem copiar projecções para o orçamento da ideia. |
|
||||
|
||||
Os exemplares Ruanda já aceites continuam apenas metodológicos; não se repetiu a sua prova nem se usaram como evidência de procura local. Os cinco originais locais usados permanecem com hashes iguais. Fontes públicas adicionais foram guardadas como cópias privadas de consulta, sem importação, publicação ou alteração de direitos no portal.
|
||||
|
||||
### Actividade, necessidade e ideia estruturada
|
||||
|
||||
**O que existe:** actividade hidroeléctrica e infra-estruturas HCB documentadas; registos históricos locais de actividades de reparação/manutenção. **Necessidade documental:** o comprador planeou serviços de calibração em2026. **Hipótese por verificar:** existe procura residual/recorrente e uma vantagem concreta de apoio local no Songo. Não há evidência de falta de fornecedores, atrasos, preços elevados ou adjudicação disponível; a necessidade comercial mantém o estado **hipótese**, com esse fundamento guardado.
|
||||
|
||||
**Ideia:** estudar associação entre prestador local e laboratório qualificado para apoio metrológico à HCB no Songo: inventário/gestão de instrumentos, preparação, recolha/entrega controlada e acompanhamento documental. Calibração/ensaios só por quem demonstrar competência no âmbito contratado. A associação é uma proposta, não acordo. **Cliente potencial:** HCB, apenas nas unidades e procedimentos em que o serviço se justifique; outros clientes não foram presumidos. Etapa: apoio à manutenção na produção/transporte de electricidade. Sem criar cadeia mestre ou relação canónica para preencher uma correspondência não disponível no clone. Abrangência distrital/proposta no Songo, sem parcela, instalações, energia ou acesso assegurados.
|
||||
|
||||
**Condições:** confirmar requisitos efectivos do comprador e do âmbito metrológico, capacidade, rastreabilidade, segurança/acesso, responsabilidades, regras de associação/transporte e eventual acreditação exigida. Não se impôs certificação específica por interpretação do plano. Recursos de operação, equipa, instrumentos, veículo, instalações e laboratório ainda não estão assegurados. Montante, promotor empresarial, coordenadas exactas, preços, volume, mercado, receitas e rentabilidade permanecem por determinar; sem usar zero ou totais do plano como substitutos.
|
||||
|
||||
### Demonstração deste caso e continuidade
|
||||
|
||||
Criada pela interface existente,guardada,recuperada e conferida na mesma ficha privada. Cinco evidências preservadas;necessidade comercial como hipótese;campos de clientes,oferta,procura,condições e próxima acção recuperados sem alteração. A mesma contaQA preparou um dossier privado pelo percurso existente,confirmou o contexto e recuperou a fotografia da ideia pela API autenticada. O relatório existente produziu as cinco linhas de evidência e os mesmos limites;uma leitura privada de prova reúne essas linhas e as observações do caso. Nenhuma publicação promocional foi preparada ou confirmada. Ficha permanece`draft`,fora da consulta publicada;consulta anónima do dossier recusada.
|
||||
|
||||
Reutilizadas as14provas API/139asserções,7provas frontend,tipos ebuild de`1afab4a2`;não se repetiu a ronda técnica ou fiscal. Feita apenas aplicação e conferência do novo caso real. A primeira leitura da página do dossier antecedeu o fim da gravação do contexto;após recuperação concluída,interface eAPI concordaram. Corrigida a espera no script local de prova,sem mudar código da aplicação ou regravar históricos. Preservação por hash das linhas anteriores no mesmo clone:52fichas,17dossiers,19projectos,1921territórios,12sectores,63documentos;uma ficha e um dossier novos. Sem migrações,importação de empresas,novos grants ou alteração do destino activo.
|
||||
|
||||
**Para consultar ao retomar QA:**usar a contaQA já designada e abrir`/minhas-oportunidades/401/edit`;comparar os campos/fundamentos;abrir o dossier`/investimentos/894343c7-c33d-452e-a6a5-b6675f77ee23`. É um percurso privado,não um link público nem uma nova instalação. Recibo:`docs/investmoz/unification/proactive-real-pilot-qa-20261027.json`;provas privadas:`outputs/proactive-real-pilot-20261027/`. Cookies,credenciais,extractos integrais de listas,originais e ficheiros de diagnóstico não integram o pacote de entrega.
|
||||
|
||||
### Saldo e perguntas concretas de retoma
|
||||
|
||||
| Ponto | Exemplo/pergunta e condição de retoma |
|
||||
| --- | --- |
|
||||
| Procura actual e estado das compras | As entradas terminavam em30/06 e14/09/2026:foram executadas,adjudicadas,canceladas ou reprogramadas? Existe novo ciclo em2027? Retoma da qualificação comercial apenas com estado e necessidade residual/recorrente identificados pelo comprador. |
|
||||
| Âmbito técnico e operacional | Que famílias/instrumentos,quantidades,periodicidade,local de execução e prazo de devolução se aplicam? Que qualificação/rastreabilidade/acreditação é exigida neste âmbito? Obter a especificação antes de dimensionar meios ou afirmar elegibilidade. |
|
||||
| Oferta e associação | Os dois registos internos seleccionados continuam activos,interessados e tecnicamente aptos? Que laboratório pode assumir o âmbito? Verificar capacidade/competência,consentimento e oferta concorrente;cadastro/CAE não basta. Não enviar contactos ou listas automaticamente. |
|
||||
| Vantagem e viabilidade | O apoio no Songo reduz um problema mensurável do cliente face à solução actual? Comparar transporte,prazos,risco,custos e condições;quantificar só quando houver dados. Não comprar equipamento ou criar orçamento com base apenas no plano. |
|
||||
| Divulgação ou uso no activo | Preparar eventual síntese pública separada só quando autorizada/revista;instalação do código não publica nem transporta automaticamente a ficha e o dossierQA. Capacidade,compatibilidade e backup/restauro serão tratados na execução futura aplicável. Nenhuma dependência de capacidade impede esta análise privada. |
|
||||
|
||||
**Estado:**primeira aplicação real demonstrada,análise económica/comercial preliminar. Preparadas perguntas para reunião exploratória com a HCB,sem as enviar. L8eSGF preservados;limites e pendências anteriores não foram eliminados.
|
||||
|
||||
## 27/10/2026 — orientação confirmada: oportunidades geradas pela procura
|
||||
|
||||
**Decisão expressa do responsável:** “a ideia não é gerir concursos mas sim as oportunidades que geram”. O anúncio é uma fonte de procura para preparar oportunidades complementares; não se cria um circuito de concursos, candidaturas ou adjudicações. O percurso técnico aceite em`1afab4a2` continua preparado para entrega independentemente da confirmação comercial do caso. Instalação e capacidade do servidor seguem separadas;sem nova intervenção no destino ou no SGF TEMPO. L8`14360748`preservado.
|
||||
|
||||
**Caso privado QA — evolução da mesma ficha e dossier:**ficha401,versão1→2;dossier`894343c7-c33d-452e-a6a5-b6675f77ee23`,contexto1→2. Sete evidências recuperadas. Modelo centrado em serviço recorrente de apoio metrológico no Songo,associando apoio local e laboratório competente:inventário/calendário,preparação,recolha/entrega controlada e documentação. Cliente potencial inicial:HCB. Outros clientes dependem de identificação própria. Sem contrato,parceria,procura recorrente ou vantagem económica declarados como confirmados. Título e campos deliberados do dossier conservados;fotografia anterior e388eventos de auditoria existentes intactos. Não se criou outra ficha,dossier,empresa,grant ou regra fiscal.
|
||||
|
||||
### O que a nova fonte esclarece
|
||||
|
||||
- **Procura e âmbito:**o anúncio da HCB,de17/08/2026,referência051/2026,identifica quinze famílias de instrumentos e outros a especificar nos TdR;por exemplo,manómetros,balanças,paquímetros/micrómetros,multímetros e instrumentos de análise eléctrica. O PDF tem2páginas,ambas lidas visualmente;SHA256`bb4c33064e5d49504d8a85ac88ad1b847cfa6c69e1016e3ab588ff785b205c1f`;exemplar`https://www.diarioeconomico.co.mz/wp-content/uploads/2026/08/concurso-hcb-tender-document-docu-mo-ambique-2026-1.pdf`. Não contém volumes,gamas,incertezas,periodicidade ou execução. O prazo04/09/2026é histórico,não oportunidade aberta presumida. Não se mapeou automaticamente este procedimento a uma das duas linhas do plano.
|
||||
- **Qualificação:**o anúncio específico pede licença para o serviço,acreditação/credenciação para calibração,três anos de experiência,três referências e equipa qualificada. Isso esclarece aquela contratação;não se converte em condição para preparar a nova oportunidade nem em requisito universal para todo apoio logístico/metrológico futuro. A execução técnica de calibração deve corresponder à competência/âmbito e aos requisitos efectivos do serviço a prestar.
|
||||
- **Possível prestação laboratorial:**a ficha pública IPAC`M0100`,INNOQ–Laboratório de Metrologia,Maputo,anexo17/02/2026,publica capacidades por âmbito:inclui electricidade,pesagem e pressão com gamas,incertezas e condições de local. Fonte`https://www.ipac.pt/pesquisa/ficha_lac.asp?ID=M0100`,consultada27/10/2026. É uma entidade a consultar sobre serviços,sem acordo ou capacidade disponível confirmados. Não se estende a cobertura a todas as famílias da HCB ou a uma instalação no Songo. Os prestadores históricos locais continuam por verificar.
|
||||
|
||||
A consulta pública dirigida não localizou prova identificável de adjudicação/execução ou compromisso para2027. Isso não prova que não houve contrato,que a compra continua aberta ou que existe procura por satisfazer. Rótulos“Em Curso” e campos0,00dos agregadores não são preço,volume ou estado confirmado. Não prolongar a mesma pesquisa sem novo documento ou resposta do cliente. O estado da compra passada é contexto para a procura futura,não o produto a gerir.
|
||||
|
||||
### Preparação da oportunidade e condição de retoma
|
||||
|
||||
| Questão de negócio | Informação concreta a obter e uso |
|
||||
| --- | --- |
|
||||
| Problema do cliente e recorrência | Que problema operacional existe no ciclo dos instrumentos,como é resolvido hoje e que necessidade futura permanece? Identificar instrumentos,quantidades,frequências e horizonte. Compra satisfeita pode cobrir só um ciclo;não autoriza presumir recorrência. |
|
||||
| Âmbito da prestação | Por família/modelo/gama,pontos e incerteza:que trabalho é exigido,onde pode ocorrer e com que prazo? Separar inventário/logística/documentação local da execução técnica da calibração. |
|
||||
| Parceiros e recursos | Confirmar capacidade real,disponibilidade e interesse dos prestadores locais e de laboratório(s). Corresponder âmbito a instrumentos concretos,com responsabilidades,custódia,segurança e condições comerciais;nenhum parceiro é designado automaticamente. |
|
||||
| Valor e receitas | Testar menor custo total,menos tempo fora de serviço ou melhor organização/rastreabilidade,sem os declarar como benefícios já medidos. Serviço por lote ou avença são hipóteses de receita,sem preço ou vontade de pagar conhecidos. |
|
||||
| Vantagem económica | Comparar solução actual e proposta para o mesmo âmbito,volume,qualidade,local e período:serviço laboratorial,transporte/retorno,embalagem/seguro,apoio local e custos incrementais sem duplicação. Medir prazos separadamente;monetizar impacto operacional só com base fornecida. Valores e vantagem permanecem indeterminados. |
|
||||
|
||||
**Resultados úteis previstos pelo responsável:**(1)procura recorrente/problema/interesse demonstrados→corresponder parceiros e dimensionar o serviço;(2)ciclo actual satisfeito,necessidade futura documentada→reformular horizonte;(3)cliente confirma necessidade satisfeita e sem necessidade futura para a solução→arquivar a hipótese com essa conclusão e conservar o dossier;(4)informação insuficiente→manter hipótese privada,sem declarar ausência de procura. Nenhum desses estados impede a entrega técnica do percurso proactivo.
|
||||
|
||||
Perguntas de descoberta e comparação foram preparadas,sem envio a terceiros. A ficha mantém`hypothesis`/`draft`,sem publicação. O contexto foi actualizado pelo mecanismo existente de prévia/confirmação e recuperado com os sete fundamentos;relatório existente reproduz as novas linhas. Sem alteração de código da aplicação,migração,novas entidades ou repetição das provas técnicas/fiscais aceites. Apenas a própria ficha e o seu dossier mudaram;52outrasfichas,17outrosdossiers,19projectos,1921territórios,12sectores,63documentos e históricos anteriores preservados.
|
||||
|
||||
Recibo:`docs/investmoz/unification/proactive-opportunity-model-qa-20261027.json`;análise privada actual:`outputs/proactive-commercial-followup-20261027/opportunity-private-brief.html`. A versão anterior da prova continua conservada. Esta passagem consolida o modelo da oportunidade e o saldo de validação comercial;não instala ou publica uma oportunidade real.
|
||||
|
||||
## 27/10/2026 — hipótese regional: outros clientes e sustentabilidade do apoio metrológico
|
||||
|
||||
**Pedido do responsável:** estudar outros clientes regionais,frequência,custos e capacidade dos parceiros,sem transformar sinais de procura em gestão de concursos. **Dado comercial expresso:** “Ainda não há dados comerciais”. A ficha permanece privada e a entrega técnica do percurso continua independente desta validação. Mantém-se`1afab4a2`como candidata técnica aceite,runtime`3439f350`,sem instalação nesta passagem. L8`14360748`eSGF TEMPO preservados.
|
||||
|
||||
**Resultado delimitado:** há base documental para prospectar três entidades adicionais — Vulcan/Moatize,EDM/Tete–Moatize e Nacala Logistics/segmentoMoatize — mas não há procura,recorrência,preço ou capacidade disponível confirmados para este serviço. Não se afirmou sustentabilidade,mercado dimensionado ou clientes contratados. A mesma ficha401e o dossier`894343c7-c33d-452e-a6a5-b6675f77ee23`foram actualizados da versão/contexto2para3,com11evidências. Origem Cahora Bassa/Energia,localização canónica,título e campos deliberados do dossier conservados;abrangência comercial regional identificada separadamente.
|
||||
|
||||
| Prospecto | Facto e fonte usados | Hipótese comercial e limite |
|
||||
| --- | --- | --- |
|
||||
| Vulcan Mozambique/Moatize | A própria empresa descreve mina,processamento de carvão e equipamentos produtivos em`https://www.vulcaninternational.com/products-services/`,consultado27/10/2026,página sem data editorial identificada. | Verificar instrumentos de processo/manutenção e necessidade de apoio metrológico. Não foi recebido pedido nem inventário;capacidade de produção da mina não é volume de calibração. |
|
||||
| EDM/Tete–Moatize | **Plano de Actividades e Orçamento2025**,PDFp68/página impressa68,Direcção de Transporte:linha3,calibração/reparação de equipamentos de teste;linha7,activos deMoatize/móvelTete;linha17,automaçãoSETete. Fonte`https://cdn.edm.co.mz/website/imprensa/Plano_Actividades_Orcamento_2025.pdf`,86páginas;conferidos visualmente apenas a página68e o detalhe relevante. Hash/cópia privada no recibo. | Serviço de calibração planeado a nível empresarial em2025 e referências regionais não demonstram parcela de procura actual emTete. Identificar unidade compradora,inventário e solução actual. O orçamento não é preço unitário,receita ou mercado regional. Não atribuir activosHCBàEDM ou contá-los duas vezes. |
|
||||
| Nacala Logistics/Moatize | A empresa descreve operação ferroviária atéMoatize e manutenção preventiva em`https://www.nacalalogistics.com/quem-somos/`e`https://www.nacalalogistics.com/faq/`,consultados27/10/2026. Na secção Accionistas,as concessionárias identificam Vulcan Mozambique como accionista. | Verificar instrumentos de manutenção e entidade/centro de compra. A marca agrega concessionárias;não equivale a uma contraparte contratual única. A ligação comVulcan impede assumir diversificação independente;não se somaram volumes ou clientes confirmados. |
|
||||
| Mphanda Nkuwa/GMNK — futuro separado | Descrição institucional em`https://www.gmnk.co.mz/en/about-us/project-description/`,consultada27/10/2026,qualifica o projecto em desenvolvimento. | Sem entrada na procura recorrente de base,receita ou carga de trabalho actual. Retomar apenas com necessidade e horizonte concretos;não inferir encomenda da capacidade projectada ou localização. |
|
||||
|
||||
As páginas institucionais confirmam apenas os factos no seu âmbito;relevância metrológica de mineração/ferrovia e interesse em apoio associado são inferências a testar,identificadas como tal. Fontes,exemplar,data e hashes foram guardados em provas privadas;nenhuma empresa,lista,documento ou relação canónica foi importado/publicado. As referências históricas de parceiros locais e o âmbitoIPAC/INNOQjá demonstrado foram reutilizados,sem repetir a pesquisa nem alargar automaticamente a cobertura técnica.
|
||||
|
||||
### Dados mínimos por cliente e parceiro
|
||||
|
||||
Por **cliente/centro de compra**:instrumentos,famílias/modelos/gamas,pontos e critério de aceitação;quantidade por janela e programa efectivo;prazo fora de serviço;prestador,processo e custo actuais;necessidade ainda não satisfeita;interesse e condições de pagar por lote/missão ou avença. Frequência permanece indeterminada e deve vir do programa do proprietário;sem regra anual por defeito,sem converter prazo de anúncio ou quinze famílias em quantidade/recorrência.
|
||||
|
||||
Por **parceiro**:âmbito de competência e local permitido por instrumento;capacidade efectivamente disponível em cada janela,equipa,meios,prazo e preço. Verificar capacidade actual dos prestadores locais históricos,sem confundir reparação/CAEcom acreditação de calibração. O âmbito publicado doINNOQ–LMemMaputo é pista parcial,não reserva de capacidade nem cobertura de todas as famílias. Famílias não correspondidas continuam separadas das compatíveis.
|
||||
|
||||
### Comparação económica delimitada
|
||||
|
||||
A unidade de comparação é a **missão/lote**:mesmo âmbito,quantidade,qualidade,local e período que a solução actual. A contribuição da missão é a receita acordada menos laboratório,apoio directo,transporte de ida/retorno,embalagem/seguro e outros custos incrementais dessa missão. Custos de transporte partilhado entram uma vez;custos fixos incrementais são deduzidos uma vez no período,sem os duplicar também na contribuição. Para sustentabilidade,avaliar ainda investimento,reposição de meios,fundo de maneio e prazos de recebimento;resultado operacional isolado não basta.
|
||||
|
||||
Comparar atendimento individual noSongo,missões agrupadas Songo–Tete/Moatize com janelas compatíveis e uma organização de apoio emTete/Moatize com deslocação aoSongo. Essas alternativas são hipóteses de funcionamento,não mudança de localização,cotação de rota ou recomendação de investimento já aprovada. Nenhum quilómetro,custo de deslocação,preço,volume,receita,margem,poupança ou ponto de equilíbrio foi inventado. A agregação pode partilhar logística e também criar custos,prazos ou restrições de custódia;isso tem de ser medido.
|
||||
|
||||
**Condição de retoma:** obter inventários/programas e interesse dos prospectos;identificar entidade compradora e concentraçãoVulcan/Nacala;com o mesmo âmbito pedir propostas de laboratório,apoio local e transporte;comparar as alternativas e a solução actual. Sem esses dados,o resultado útil é “carteira regional prospectável,sustentabilidade por demonstrar”. Se os dados posteriores mostrarem procura insuficiente ou serviço já satisfatório,conservar essa conclusão e reformular/arquivar a hipótese. Não repetir pesquisa pública para substituir dados comerciais que o responsável confirmou ainda não existirem. Nenhuma mensagem foi enviada a terceiros.
|
||||
|
||||
**Preservação e prova desta evolução:**guardar→prévia/confirmação do contexto→recuperação no mesmo dossier→linhas do relatório existente,com11evidências e valores comerciais em falta. Apenas ficha401e o seu dossier foram actualizados;52outrasfichas,17outrosdossiers,19projectos,1921territórios,12sectores,63documentos e391eventos anteriores de auditoria intactos. Sem nova entidade,grant,migração,código da aplicação ou ronda das provas técnicas/fiscais aceites. Fonte e contexto anteriores conservados,sem publicar a ficha.
|
||||
|
||||
Recibo:`docs/investmoz/unification/proactive-regional-clients-qa-20261027.json`;estudo privado:`outputs/proactive-regional-clients-20261027/regional-private-brief.html`. A entrega técnica e a eventual instalação continuam separadas do estado comercial desta oportunidade.
|
||||
|
||||
|
||||
## 27/10/2026 — passagem à prospecção e segundo piloto territorial privado
|
||||
|
||||
**Decisão do responsável:** o caso de apoio metrológico está suficientemente estruturado para prospecção. Fica privado e pendente de informação externa; não continuar a aprofundá-lo para concluir a funcionalidade. Nenhum contacto ou proposta comercial foi recebido ou enviado nesta passagem. A ficha401 e o dossier `894343c7-c33d-452e-a6a5-b6675f77ee23` mantêm fonte/contexto3, sem alterações.
|
||||
|
||||
**Ficha curta para a equipa:** `docs/investmoz/unification/prospeccao-apoio-metrologico-20261027.pdf`, PDF preenchível de duas páginas e42campos, com uma página por cliente e outra por parceiro. Cliente: instrumentos/gamas/quantidades, programa efectivo e janelas, requisitos, solução actual, contratação e próxima acção. Parceiro: âmbito, equipa/meios e capacidade disponível, prazo, preços discriminados, impostos/moeda, deslocações/custódia e validade da proposta. Sem resposta, os dados ficam por determinar. Guardar uma cópia por entidade/centro de compra ou parceiro, com evidência/data e responsável.
|
||||
|
||||
**Retoma da viabilidade do Songo:** quando chegarem inventários, programas, interesse e cotações comparáveis, actualizar a comparação já preparada para o mesmo âmbito, volume, qualidade, local e período. Distinguir entidade, utilizador e centro que decide/paga; a ligação Vulcan/Nacala impede presumir compradores independentes. Somar cada missão/transporte partilhado uma vez. Não usar ausência de resposta como ausência de procura ou zero. Necessidade satisfeita pode conduzir a reformulação futura ou arquivo fundamentado, preservando o dossier.
|
||||
|
||||
**Próximo piloto — Gurué:** foi criado, por serviços existentes e apenas na base QA isolada, o caso `GUR-CHA-20261027`, ficha402/fonte1 e dossier `883c8ec3-59a3-4074-b91c-b7d4a5d88ff0`/contexto1. Ideia privada: estudar apoio associado à colheita, qualidade da folha verde e organização das entregas na cadeia do chá. Reutilizados o distrito canónico de Gurué e o sector Agronegócio; nenhum novo mestre, promotor empresarial, montante ou coordenada presumidos.
|
||||
|
||||
Cinco referências distinguem actividade de procura: INE2020–2024, edição2025, PDFp9/Quadro1.1; página do próprio Asian Tea Group sobre Chá de Magoma; IGC2014, PDFp75,78–79/impressas60,63–64; e referências privadas da lista já fornecida, com datas2021–2023 e códigos declarados. INE e produtor documentam actividades; o estudo2014 é histórico e orienta perguntas, sem transportar volumes, preços, capacidades ou intenções para2026. Cadastros antigos não comprovam competência ou disponibilidade actual. Não se presume compra de folha externa, oferta em falta, nova fábrica ou interesse em contratar.
|
||||
|
||||
**Acção delimitada do Gurué:** compreender como se colhe, avalia e entrega hoje; identificar problema mensurável, intervenientes, critérios do processador, quantidades/janelas, solução/custo actuais e quem contrataria/pagaria pelo apoio. Magoma é unidade potencial a consultar; Chazeiras é referência histórica cuja situação actual deve ser confirmada. Beneficiário não equivale a pagador. Necessidade, parceiros, custos e viabilidade permanecem em hipótese, sem bloquear a funcionalidade técnica ou exigir prolongamento de pesquisa pública.
|
||||
|
||||
**Demonstração apenas do delta:** criação→gravação→prévia/confirmação→recuperação→linhas do relatório existente, com5evidências e pressupostos visíveis. Conservados todos os53registos anteriores de oportunidades,18dossiers,19projectos,1921territórios,12sectores,63documentos,394eventos de auditoria,40utilizadores e3organizações. Novos apenas a ficha/dossier/percurso QA e respectivos registos de histórico. Sem alteração de código, schema, permissões ou provas técnicas/fiscais aceites. O formulário foi reaberto e ensaiado com valores sintéticos numa cópia; a versão para a equipa está em branco, com campos interactivos verificados e as duas páginas revistas visualmente.
|
||||
|
||||
**Entrega técnica independente:** `1afab4a2` continua candidata técnica aceite, runtime `3439f350`, sem instalação ou publicação nesta passagem. A capacidade do servidor deve ser novamente medida no procedimento da futura entrega; não se declarou resolvida nem se apagou conteúdo. L8 `14360748`, SGF TEMPO e demais provas preservados. Esta passagem não envia a ficha a terceiros nem publica oportunidades reais.
|
||||
|
||||
Recibo: `docs/investmoz/unification/proactive-handoff-gurue-qa-20261027.json`. Prova privada e nota do piloto: `outputs/proactive-handoff-gurue-20261027/gurue-proof.json` e `gurue-private-brief.html`. Saldo do Songo: recolha externa; saldo do Gurué: descoberta dirigida da necessidade; saldo da instalação: capacidade e procedimento de entrega. Estes três estados permanecem independentes.
|
||||
|
||||
|
||||
## 27/10/2026 — autonomia pela interface e candidata técnica consolidada
|
||||
|
||||
**Âmbito pedido:** reutilizar as provas aceites; demonstrar apenas anexar respostas, rever a ideia privada e encaminhar/actualizar o mesmo dossier pela interface, sem intervenção de código ou SQL na operação da equipa. Songo aguarda respostas externas e Gurué mantém a hipótese agrícola privada; ambos ficaram intactos. Não foram recolhidas respostas comerciais reais nem observada uma sessão de formação com funcionários.
|
||||
|
||||
### Guia curto da equipa
|
||||
|
||||
1. Entrar com o perfil operacional já autorizado e o MFA normal. Em **Minhas oportunidades → Nova oportunidade → Preparar análise e ideia**, indicar título, sector e apenas o território conhecido. Não substituir o promotor real por quem prepara a análise; a preparação interna permite que ainda seja desconhecido.
|
||||
2. Em **Evidências e proveniência**, separar facto e interpretação, identificar fonte/exemplar, trecho, período, abrangência e limitações. Manter **Interna — análise privada**. Guardar o rascunho e aguardar a confirmação do servidor.
|
||||
3. Para uma resposta recebida, abrir **Imagens, documentos e localizações → Documentos**, escolher o original, identificar emissor/versão/data quando conhecidos, página e afirmação fundamentada. Escolher classificação e consulta internas e **Guardar recurso**. O ficheiro fica privado e o seu estado de scan é visível; o download só fica disponível após scan limpo dos mesmos bytes.
|
||||
4. Regressar ao rascunho e escolher esse ficheiro em **Documento existente associado** na evidência correspondente. Rever a oferta/procura observadas, solução, pressupostos, pendências e próxima acção. Uma resposta parcial não confirma procura, preços ou sustentabilidade. Guardar e recuperar a ficha para conferir os dados.
|
||||
5. Usar **Preparar ou continuar investimento com esta ficha**. Se já existir, escolher o dossier e **Preparar neste dossier**; não criar outro para uma nova edição. Criar um dossier apenas para um investimento novo, com o título escolhido e consentimento de reutilização do próprio perfil.
|
||||
6. Confirmar a localização, usar **Rever dados antes de guardar**, conferir divergências e impactos e **Guardar dados do investimento**. O título e as edições deliberadas conservam-se. A referência à resposta acompanha a análise; o original permanece no gestor documental da ficha, acessível pelo link da ficha de origem e seus recursos, sem cópia ou divulgação automática dos bytes.
|
||||
7. Para novas respostas/edições, voltar à mesma ficha, guardar a revisão e continuar o mesmo dossier com nova prévia/confirmação. O dossier recebe a versão actual após confirmação; o estado anterior conserva-se no histórico. Informação em falta continua por determinar, sem zero presumido.
|
||||
8. **Divulgação promocional** é uma acção separada. Nada neste percurso publica o piloto, os anexos ou o dossier. A eventual decisão de publicação real continua independente da demonstração sintética e da instalação técnica.
|
||||
|
||||
### Delta demonstrado e correcção delimitada
|
||||
|
||||
Ensaio com o operador QA existente, login/MFA normais e apenas controlos da interface: nova ficha sintética403, resposta PDF de ensaio anexada e recuperada, ClamAV real limpo, hash do download igual ao original; documento associado à evidência; ideia revista; dossier `5bc28554-a2d1-4e60-9181-93ba0ecede59` criado e depois continuado sem duplicação. Fonte4/contexto2, hipótese e título deliberado preservados. O anexo e os dados são sintéticos; não constituem resposta de clientes ou parceiros reais.
|
||||
|
||||
Foi reproduzido e corrigido um aviso enganador: o pedido de complementos públicos tratava uma análise privada autorizada como referência pública desaparecida. **InvestmentComplements** consulta primeiro a autorização existente e devolve uma lista vazia para essa preparação privada; não a transforma em oferta pública. Origens públicas continuam a produzir os seus complementos; pedidos sem acesso continuam sem obter a fonte privada. Dois testes novos dirigidos,18asserções, passaram em transacção QA. A demonstração privada foi retomada sem o aviso. Não se alteraram permissões, tabelas, frontend ou motores fiscais.
|
||||
|
||||
Todos os54registos anteriores de oportunidades,19dossiers,63documentos,19projectos,1921territórios,12sectores,3organizações e399eventos de auditoria preservados por comparação de hashes. Novos apenas a amostra QA e seus registos. As provas anteriores de criação/edição, publicação expressa, anonimato, histórico, relatório, Wayfinder, TypeScript e build foram reutilizadas; não se repetiram suites fiscais ou a análise económica dos pilotos. Foi conferida a recuperação da referência documental e das novas linhas pelo relatório existente.
|
||||
|
||||
### Candidata para instalação futura
|
||||
|
||||
Runtime desta correcção: `51d536b7`; inclui o percurso técnico `3439f350`/candidata aceite `1afab4a2`, documentação e ficha de prospecção `403c444a`. A comparação com main remoto `f8d57bdd` confirmou ancestralidade, sem alterações entretanto integradas a perder. O delta de runtime face à candidata anterior limita-se à consulta de complementos; frontend, schema e configuração mantêm-se.
|
||||
|
||||
**Não instalado.** Antes da entrega activa, medir novamente espaço/inodes na partição do instalador e dos backups, confrontar com a necessidade efectiva de compilação isolada/backup, conferir o main então actual, executar backup/restauro fresco e manter a versão activa até a nova estar pronta. Depois conferir revisão servida e apenas o delta. A preparação dos pilotos QA não integra dados na base activa nem publica oportunidades. L8 `14360748` permanece separado; SGF TEMPO intocado. Não se fizeram SSH, limpeza, backup ou instalação nesta passagem.
|
||||
|
||||
Recibo: `docs/investmoz/unification/proactive-team-autonomy-qa-20261027.json`. Provas e pacote local: `outputs/proactive-team-autonomy-20261027/`. A verificação comprova que o percurso está disponível aos perfis autorizados através da interface; não declara formação da equipa, viabilidade dos pilotos ou conclusão integral dos requisitos nacionais.
|
||||
|
||||
|
||||
## 27/10/2026 — duas entregas autorizadas: L8 primeiro, percurso proactivo depois
|
||||
|
||||
O responsável autorizou expressamente a execução das duas entregas pelo procedimento existente, sem nova ronda de autorização. A indicação histórica de manter preparado em `c85e772d` foi reconciliada: o commit acrescenta documentação de capacidade, sem mudar o código de L8 `14360748`/runtime `11a6cee9`. A autorização actual permite retomar; não substitui a medição de capacidade nem o backup/restauro frescos.
|
||||
|
||||
**Etapa1:** L8 em `c85e772d`, com a colecta válida, retenções efectivamente sofridas e PPC comprovados no recorte aceite; PEC e créditos próprios continuam separados. **Etapa2:** ramo `codex/sequential-delivery-20261027`, merge de L8 e do percurso proactivo `0ff402a1`, runtime reconciliado `74f7f93a`. A etapa2 só segue após confirmar a revisão efectivamente servida na etapa1.
|
||||
|
||||
O relatório comum tinha um conflito de imports. Foram conservados ambos e as chamadas de linhas anuais e proactivas. Os restantes ficheiros de runtime de cada candidata ficaram idênticos à origem. Verificação apenas da integração partilhada:6linhas anuais e10linhas proactivas recuperadas, entradas intactas e sem inferência cruzada. TypeScript e compilação QA isolada passaram; suites económicas/fiscais aceites não repetidas. Documentação de ambas as linhas conservada, sem importação de fixtures ou escrita em bases.
|
||||
|
||||
**Estado efectivo desta passagem: preparado, sem instalação.** O main remoto permanece `f8d57bdd` e a revisão pública servida foi conferida por HTTP em27/10/2026,10:14UTC, também `f8d57bdd`. A ponte SSH local estava `closed`; a autenticação por chave foi recusada com a chave do servidor registada e conferida. Não havia aqui uma sessão autenticada utilizável. Não foram executados backup/restauro frescos, alteração de main ou instalação. A capacidade antiga de4,10GiB é histórica e não foi apresentada como medição actual.
|
||||
|
||||
Retomar na sessão local com SSH autenticado, usando a autorização já registada: medir espaço/inodes na partição efectiva, comparar com compilação e backup, conferir main e revisão activa, criar e ensaiar backup fresco, instalar L8 e conferir apenas o seu delta. Depois repetir as guardas necessárias para a candidata conjunta e conferir o delta proactivo preservando L8. Manter a versão activa até a nova estar pronta. Excluir fixtures QA dos inputs de instalação; não executar seeders/importações de amostras, não publicar pilotos privados nem usar o pacote QA como cópia da base activa. SGF TEMPO separado.
|
||||
|
||||
Recibo de preparação: `docs/investmoz/unification/sequential-delivery-preparation-20261027.json`. Provas e instrução de passagem: `outputs/sequential-delivery-20261027/`. Os recibos de execução e as duas revisões servidas serão registados apenas depois de execução real na sessão autenticada; este recibo não os substitui.
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -13,9 +13,12 @@ export type EducationalArticle = {
|
||||
|
||||
export default function EducationalArticleCard({
|
||||
article,
|
||||
headingLevel = 3,
|
||||
}: {
|
||||
article: EducationalArticle;
|
||||
headingLevel?: 3 | 4;
|
||||
}) {
|
||||
const Heading = headingLevel === 3 ? 'h3' : 'h4';
|
||||
const focus =
|
||||
'focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-emerald-800';
|
||||
return (
|
||||
@@ -34,11 +37,11 @@ export default function EducationalArticleCard({
|
||||
<p className="text-sm font-medium text-emerald-800">
|
||||
Guia sectorial
|
||||
</p>
|
||||
<h3 className="text-2xl leading-tight font-bold">
|
||||
<Heading className="text-2xl leading-tight font-bold">
|
||||
<Link href={article.href} className={focus}>
|
||||
{article.title}
|
||||
</Link>
|
||||
</h3>
|
||||
</Heading>
|
||||
{article.summary && (
|
||||
<p className="text-base leading-relaxed text-slate-700">
|
||||
{article.summary}
|
||||
|
||||
@@ -17,6 +17,7 @@ export const modalityLabels: Record<string, string> = {
|
||||
type Values = Record<string, string | boolean | number[]>;
|
||||
const labels: Record<string, string> = {
|
||||
q: 'O que procura',
|
||||
perspective: 'Consultar por',
|
||||
sector: 'Sector',
|
||||
category: 'Modalidade da oportunidade',
|
||||
preparation: 'Estado de preparação',
|
||||
@@ -215,6 +216,7 @@ export default function OpportunitySearchFilters({
|
||||
onChange={(e) => change({ q: e.target.value })}
|
||||
/>
|
||||
</Field>
|
||||
{select('perspective', [{value:'exists',label:'O que existe'},{value:'needs',label:'Necessidades identificadas'},{value:'ideas',label:'Ideias de investimento'},{value:'opportunities',label:'Oportunidades cadastradas — disponibilidade na ficha'}])}
|
||||
{select('sector', choicesFor('sector'))}
|
||||
{select('category', choicesFor('category'))}
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { Link } from '@inertiajs/react';
|
||||
import { ArrowRight, Search } from 'lucide-react';
|
||||
import { useEffect, useState } from 'react';
|
||||
import type { FormEvent } from 'react';
|
||||
@@ -127,7 +128,6 @@ type PortalHeroProps = {
|
||||
query: string;
|
||||
setQuery: (value: string) => void;
|
||||
onSearch: (event: FormEvent<HTMLFormElement>) => void;
|
||||
onNavigate: (view: 'opportunities') => void;
|
||||
stats?: HomeResponse['data']['stats'];
|
||||
};
|
||||
|
||||
@@ -136,7 +136,6 @@ export default function PortalHero({
|
||||
query,
|
||||
setQuery,
|
||||
onSearch,
|
||||
onNavigate,
|
||||
stats,
|
||||
}: PortalHeroProps) {
|
||||
const [currentSlide, setCurrentSlide] = useState(0);
|
||||
@@ -261,20 +260,38 @@ export default function PortalHero({
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div className="mt-6 flex flex-wrap items-center justify-center gap-3">
|
||||
<button
|
||||
onClick={() => onNavigate('opportunities')}
|
||||
className="inline-flex min-h-11 items-center gap-2 rounded-xl bg-white px-5 py-3 text-sm font-semibold text-[#101820] transition-colors hover:bg-slate-100 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white"
|
||||
<div className="mt-4 flex flex-wrap items-center justify-center gap-2">
|
||||
<Link
|
||||
href="/porque-investir"
|
||||
className="inline-flex min-h-11 items-center rounded-lg border border-white/50 bg-black/15 px-3 py-1.5 text-sm font-semibold text-white transition-colors hover:bg-white/15 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white sm:min-h-9"
|
||||
>
|
||||
Consultar oportunidades{' '}
|
||||
Porquê investir em Moçambique?
|
||||
</Link>
|
||||
<Link
|
||||
href="/investimentos/iniciar"
|
||||
className="inline-flex min-h-11 items-center rounded-lg border border-white/50 bg-black/15 px-3 py-1.5 text-sm font-semibold text-white transition-colors hover:bg-white/15 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white sm:min-h-9"
|
||||
>
|
||||
Partir de uma ideia
|
||||
</Link>
|
||||
<Link
|
||||
href="/oportunidades"
|
||||
className="inline-flex min-h-11 items-center gap-1.5 rounded-lg bg-white px-3 py-1.5 text-sm font-semibold text-[#101820] transition-colors hover:bg-slate-100 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white sm:min-h-9"
|
||||
>
|
||||
Consultar oportunidades
|
||||
<ArrowRight size={16} aria-hidden="true" />
|
||||
</button>
|
||||
<a
|
||||
</Link>
|
||||
<Link
|
||||
href="/simulador-fiscal"
|
||||
className="inline-flex min-h-11 items-center rounded-xl border border-white/50 bg-black/15 px-5 py-3 text-sm font-semibold text-white transition-colors hover:bg-white/15 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white"
|
||||
className="inline-flex min-h-11 items-center rounded-lg border border-white/50 bg-black/15 px-3 py-1.5 text-sm font-semibold text-white transition-colors hover:bg-white/15 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white sm:min-h-9"
|
||||
>
|
||||
Simulador Fiscal
|
||||
</a>
|
||||
</Link>
|
||||
<Link
|
||||
href="/sectores"
|
||||
className="inline-flex min-h-11 items-center rounded-lg border border-white/50 bg-black/15 px-3 py-1.5 text-sm font-semibold text-white transition-colors hover:bg-white/15 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white sm:min-h-9"
|
||||
>
|
||||
Sectores de investimento
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<dl
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
import { createOperationKey } from '@/lib/operation-key';
|
||||
import { Field, control, button } from '@/pages/management/shared';
|
||||
|
||||
export type ProactiveEvidence = {id:string;category:string;purpose:'local'|'methodology';statement:string;interpretation:string;source:string;locator:string;period:string;scope:string;coverage:string;verified_on:string;access:'internal'|'public';document_id:string};
|
||||
export type ProactiveAnalysis = {
|
||||
version:1;kind:'exists'|'needs'|'ideas';evidence:ProactiveEvidence[];
|
||||
need:{state:'hypothesis'|'confirmed';problem:string;observed_supply:string;observed_demand:string;type:string;clients:string;evidence_ids:string[];limitations:string;missing:string;confirmation:string};
|
||||
idea:{solution:string;activity:string;chain_id:string;stage:string;coverage:string;mode:string;resources:string;assumptions:string;conditions:string;pending:string;next_action:string};
|
||||
relations:{id:string;kind:string;target_id:string;relation:string;reference:string;evidence_ids:string[]}[];
|
||||
};
|
||||
export type ProactiveOptions = {documents?:{id:string;title:string}[];groups:Record<string,string>;references:Record<string,{id:string;name:string}[]>};
|
||||
export type ProactivePublic = {version?:number;group:string;state:string;need:string;proposal:string;basis:string;limitations:string;next_action:string;evidence_ids:string[];chain_id?:string|null;stage?:string|null;notice?:string;resources?:string;assumptions?:string;conditions?:string;relation_ids?:string[];relations?:{kind:string;target_id:string;label:string;relationship:string;basis:string}[];evidence?:Partial<ProactiveEvidence>[]};
|
||||
export const proactiveNotice = 'Ausência de registo não comprova ausência de oferta. Proximidade não comprova contrato, participação, energia acessível, terra disponível ou benefício fiscal. Necessidade confirmada não comprova viabilidade comercial; hipótese de fornecimento não é encomenda.';
|
||||
export const newProactive = ():ProactiveAnalysis => ({version:1,kind:'ideas',evidence:[],need:{state:'hypothesis',problem:'',observed_supply:'',observed_demand:'',type:'',clients:'',evidence_ids:[],limitations:'',missing:'',confirmation:''},idea:{solution:'',activity:'',chain_id:'',stage:'',coverage:'',mode:'',resources:'',assumptions:'',conditions:'',pending:'',next_action:''},relations:[]});
|
||||
export const newPublicProactive = ():ProactivePublic => ({group:'ideas',state:'hypothesis',need:'',proposal:'',basis:'',limitations:'',next_action:'',evidence_ids:[],chain_id:'',stage:'',resources:'',assumptions:'',conditions:'',relation_ids:[]});
|
||||
|
||||
export function ProactiveInvestmentEditor({value,onChange,options,history=[]}:{value?:ProactiveAnalysis;onChange:(value:ProactiveAnalysis)=>void;options?:ProactiveOptions;history?:{version:number;at:string;state:string;problem:string;confirmation:string}[]}){
|
||||
if(!value)return <section className="rounded border p-4"><h2 className="font-semibold">Análise territorial e preparação de ideias</h2><p>Comece pelo território e sector existentes, mesmo sem oportunidade publicada, promotor, montante ou coordenadas. O rascunho e a publicação são independentes.</p><button type="button" className={button} onClick={()=>onChange(newProactive())}>Preparar análise e ideia</button></section>;
|
||||
const patch=(p:Partial<ProactiveAnalysis>)=>onChange({...value,...p});
|
||||
const text=(label:string,v:string,change:(v:string)=>void)=><Field label={label}><textarea className={control} aria-label={label} value={v??''} onChange={e=>change(e.target.value)}/></Field>;
|
||||
const select=(label:string,v:string,choices:Record<string,string>,change:(v:string)=>void)=><Field label={label}><select className={control} aria-label={label} value={v??''} onChange={e=>change(e.target.value)}><option value="">Por determinar</option>{Object.entries(choices).map(([key,label])=><option key={key} value={key}>{label}</option>)}</select></Field>;
|
||||
const evidenceChoice=(selected:string[],change:(v:string[])=>void)=><fieldset><legend>Evidências que fundamentam esta entrada</legend>{value.evidence.map((e,i)=><label key={e.id} className="block"><input type="checkbox" checked={selected.includes(e.id)} onChange={event=>change(event.target.checked?[...selected,e.id]:selected.filter(id=>id!==e.id))}/> Evidência {i+1}: {e.statement||'Por descrever'} ({e.access==='public'?'Pública autorizada':'Interna'})</label>)}</fieldset>;
|
||||
return <section className="space-y-4 rounded border p-4" aria-label="Análise territorial e ideia">
|
||||
<h2 className="text-xl font-semibold">Território e sector → evidências → necessidade → ideia</h2><details><summary>Como fundamentar esta análise</summary><p>Inventarie actividades, recursos, infra-estruturas e serviços de apoio. Confronte oferta observada com procura documentada e identifique os clientes ou beneficiários. Registe o período, cobertura e limitações de cada observação. Use referências internacionais para orientar as perguntas; a confirmação do caso depende de evidência local.</p></details><p>Reutiliza o sector e a localização principal escolhidos nesta ficha. Guarde pelo botão de rascunho existente. Nenhum montante, promotor ou ponto exacto é exigido.</p><p>{proactiveNotice}</p>
|
||||
{select('Tipo de conteúdo em preparação',value.kind,{exists:'O que existe',needs:'Necessidade identificada',ideas:'Ideia de investimento'},v=>patch({kind:v as ProactiveAnalysis['kind']}))}
|
||||
<fieldset className="space-y-3 rounded border p-3"><legend>Evidências e proveniência</legend><p>Registe factos e interpretações em campos separados. Listas de empresas, hotéis, restaurantes, contactos e documentos internos permanecem internos; não são copiados para a divulgação.</p>
|
||||
{value.evidence.map((e,i)=>{const change=(p:Partial<ProactiveEvidence>)=>patch({evidence:value.evidence.map(x=>x.id===e.id?{...x,...p}:x)});return <fieldset key={e.id} className="space-y-2 rounded border p-3"><legend>Evidência {i+1}</legend>
|
||||
{select(`Finalidade da evidência ${i+1}`,e.purpose??'',{local:'Evidência local do caso',methodology:'Referência metodológica — não prova procura local'},v=>change({purpose:v as 'local'|'methodology'}))}
|
||||
{select(`Categoria da evidência ${i+1}`,e.category,{activity:'Actividade',resource:'Recurso',infrastructure:'Infra-estrutura',supply:'Oferta',demand:'Procura'},v=>change({category:v}))}
|
||||
{([['statement','Facto documentado'],['interpretation','Interpretação ou hipótese'],['source','Fonte e exemplar'],['locator','Localizador ou trecho'],['period','Período da evidência'],['scope','Abrangência'],['coverage','Cobertura e limitações']]as const).map(([key,label])=><div key={key}>{text(`${label} ${i+1}`,e[key],v=>change({[key]:v}))}</div>)}
|
||||
<Field label={`Verificação ${i+1}`}><input aria-label={`Verificação ${i+1}`} className={control} type="date" value={e.verified_on??''} onChange={event=>change({verified_on:event.target.value})}/></Field>
|
||||
<Field label={`Documento existente associado ${i+1}`}><select aria-label={`Documento existente associado ${i+1}`} className={control} value={e.document_id??''} onChange={event=>change({document_id:event.target.value})}><option value="">Sem documento associado — indicar fonte e localizador</option>{options?.documents?.map(d=><option key={d.id} value={d.id}>{d.title}</option>)}</select></Field>
|
||||
{select(`Divulgação da evidência ${i+1}`,e.access,{internal:'Interna — análise privada',public:'Pública — origem e divulgação autorizadas'},v=>change({access:v as ProactiveEvidence['access']}))}
|
||||
<button type="button" className="underline" onClick={()=>patch({evidence:value.evidence.filter(x=>x.id!==e.id),need:{...value.need,evidence_ids:value.need.evidence_ids.filter(id=>id!==e.id)},relations:value.relations.map(r=>({...r,evidence_ids:r.evidence_ids.filter(id=>id!==e.id)}))})}>Retirar evidência {i+1} deste rascunho</button>
|
||||
</fieldset>;})}
|
||||
<button type="button" className={button} onClick={()=>patch({evidence:[...value.evidence,{id:createOperationKey(),category:'activity',purpose:'local',statement:'',interpretation:'',source:'',locator:'',period:'',scope:'',coverage:'',verified_on:'',access:'internal',document_id:''}]})}>Acrescentar evidência</button>
|
||||
</fieldset>
|
||||
{value.kind!=='exists'&&<fieldset className="space-y-3 rounded border p-3"><legend>Necessidade ou lacuna</legend>
|
||||
{select('Estado da necessidade',value.need.state,{hypothesis:'Hipótese analítica',confirmed:'Necessidade confirmada — fundamento documentado'},v=>patch({need:{...value.need,state:v as 'hypothesis'|'confirmed'}}))}
|
||||
{select('Tipo de lacuna',value.need.type,{quantity:'Quantidade',quality:'Qualidade',logistics:'Logística',processing:'Transformação',coordination:'Coordenação',support:'Serviços de apoio'},v=>patch({need:{...value.need,type:v}}))}
|
||||
{([['problem','Problema identificado'],['observed_supply','Oferta observada'],['observed_demand','Procura observada'],['clients','Potenciais clientes ou beneficiários'],['limitations','Limitações da necessidade'],['missing','Informação por confirmar'],['confirmation','Fundamentação do estado da necessidade']]as const).map(([key,label])=><div key={key}>{text(label,value.need[key],v=>patch({need:{...value.need,[key]:v}}))}</div>)}
|
||||
{evidenceChoice(value.need.evidence_ids,v=>patch({need:{...value.need,evidence_ids:v}}))}
|
||||
</fieldset>}
|
||||
{value.kind==='ideas'&&<fieldset className="space-y-3 rounded border p-3"><legend>Ideia em preparação</legend>
|
||||
{([['solution','Solução proposta'],['activity','Actividade proposta'],['stage','Etapa da cadeia de valor'],['coverage','Localização ou abrangência da ideia'],['resources','Recursos documentados'],['assumptions','Pressupostos explícitos'],['conditions','Condições da ideia'],['pending','Pendências da ideia'],['next_action','Próxima acção']]as const).map(([key,label])=><div key={key}>{text(label,value.idea[key],v=>patch({idea:{...value.idea,[key]:v}}))}</div>)}
|
||||
{select('Cadeia de valor existente',value.idea.chain_id,Object.fromEntries((options?.references.chain??[]).map(c=>[c.id,c.name])),v=>patch({idea:{...value.idea,chain_id:v}}))}
|
||||
{select('Possibilidade de investimento',value.idea.mode,{create:'Criar actividade',expand:'Expandir actividade',associate:'Associar actividades existentes'},v=>patch({idea:{...value.idea,mode:v}}))}
|
||||
</fieldset>}
|
||||
{value.kind!=='ideas'&&<p>Os campos anteriores da ideia são conservados. Escolha “Ideia de investimento” quando pretender preparar uma solução.</p>}
|
||||
<fieldset className="space-y-3 rounded border p-3"><legend>Relações com estruturas existentes</legend>
|
||||
{value.relations.map((r,i)=>{const change=(p:Partial<typeof r>)=>patch({relations:value.relations.map(x=>x.id===r.id?{...x,...p}:x)});return <fieldset key={r.id} className="rounded border p-3"><legend>Relação {i+1}</legend>
|
||||
{select(`Tipo de referência ${i+1}`,r.kind,{project:'Projecto âncora',cluster:'Cluster',corridor:'Corredor',park:'Parque',chain:'Cadeia de valor'},v=>change({kind:v,target_id:''}))}
|
||||
{select(`Referência existente ${i+1}`,r.target_id,Object.fromEntries((options?.references[r.kind]??[]).map(c=>[c.id,c.name])),v=>change({target_id:v}))}
|
||||
{select(`Fundamento da relação ${i+1}`,r.relation,{documented:'Documentada',hypothesis:'Hipótese de relação',proximity:'Proximidade, sem compromisso'},v=>change({relation:v}))}
|
||||
{text(`Fonte da relação ${i+1}`,r.reference,v=>change({reference:v}))}{evidenceChoice(r.evidence_ids,v=>change({evidence_ids:v}))}
|
||||
<button type="button" className="underline" onClick={()=>patch({relations:value.relations.filter(x=>x.id!==r.id)})}>Retirar relação {i+1}</button>
|
||||
</fieldset>;})}
|
||||
<button type="button" className={button} onClick={()=>patch({relations:[...value.relations,{id:createOperationKey(),kind:'project',target_id:'',relation:'hypothesis',reference:'',evidence_ids:[]}]})}>Relacionar referência existente</button>
|
||||
</fieldset>
|
||||
{!!history.length&&<details><summary>Histórico do fundamento da necessidade</summary>{history.map(h=><p key={h.version}>Versão {h.version} · {h.at} · {h.state==='confirmed'?'Necessidade confirmada':'Hipótese'}: {h.problem} — {h.confirmation||'Fundamentação por completar'}</p>)}</details>}
|
||||
<p>Não calcula mercado, investimento ou rentabilidade. Informação em falta permanece por determinar. Uma nova edição não altera os históricos nem publica a análise.</p>
|
||||
</section>;
|
||||
}
|
||||
|
||||
export function ProactiveSummary({value}:{value?:ProactivePublic|null}){
|
||||
if(!value)return null;
|
||||
return <section className="space-y-2 rounded border p-4" aria-label="Origem proactiva do investimento"><h2 className="text-xl font-semibold">{value.group==='ideas'?'Ideia em preparação':value.group==='needs'?'Necessidade identificada':'O que existe'}</h2><p>{value.group==='exists'?'Registo documental; consultar abrangência, cobertura e limitações das fontes.':value.state==='confirmed'?'Necessidade confirmada no âmbito documentado':'Hipótese analítica; conclusão económica por confirmar'}</p>{([['need','Necessidade'],['proposal','Proposta'],['basis','Fundamento'],['limitations','Limitações'],['next_action','Próximo passo'],['stage','Etapa da cadeia'],['resources','Recursos'],['assumptions','Pressupostos'],['conditions','Condições']]as const).map(([key,label])=>value[key]?<p key={key}><strong>{label}:</strong> {value[key]}</p>:null)}{value.relations?.map(r=><p key={r.kind+r.target_id}>Relação seleccionada: {r.label} · {r.relationship==='documented'?'Documentada':r.relationship==='proximity'?'Proximidade, sem pertença':'Hipótese de relação'}. Fundamento: {r.basis}. Não confirma contrato, acesso ou participação.</p>)}{value.evidence?.map((e,i)=><p key={e.id??i}>Evidência pública: {e.statement}; fonte: {e.source}; localizador: {e.locator}; período: {e.period}; abrangência: {e.scope}; cobertura: {e.coverage}; verificação: {e.verified_on}.</p>)}<p>{value.notice??proactiveNotice}</p><p>Sem disponibilidade de participação, viabilidade comercial ou benefício fiscal presumidos.</p></section>;
|
||||
}
|
||||
|
||||
export function ProactivePublicationFields({value,onChange,evidence,relations=[],options,reviewed,onReview}:{value:ProactivePublic;onChange:(v:ProactivePublic)=>void;evidence:ProactiveEvidence[];relations?:{id:string;label:string;relationship:string}[];options?:ProactiveOptions;reviewed:boolean;onReview:(v:boolean)=>void}){
|
||||
const text=(key:'need'|'proposal'|'basis'|'limitations'|'next_action'|'stage'|'resources'|'assumptions'|'conditions',label:string)=><Field label={label}><textarea aria-label={label} className={control} value={value[key]??''} onChange={e=>{onChange({...value,[key]:e.target.value});onReview(false);}}/></Field>;
|
||||
return <fieldset className="space-y-3 rounded border p-4"><legend>Síntese proactiva expressamente pública</legend><p>Redija uma síntese independente. Nenhum facto, interpretação, contacto ou fonte interna é copiado automaticamente. A síntese também não pode revelar informação privada indirectamente.</p>
|
||||
<Field label="Grupo público"><select className={control} aria-label="Grupo público" value={value.group} onChange={e=>onChange({...value,group:e.target.value})}>{Object.entries(options?.groups??{exists:'O que existe',needs:'Necessidades identificadas',ideas:'Ideias de investimento'}).map(([k,v])=><option key={k} value={k}>{v}</option>)}</select></Field>
|
||||
{value.group!=='exists'&&<Field label="Estado público da necessidade"><select className={control} aria-label="Estado público da necessidade" value={value.state} onChange={e=>onChange({...value,state:e.target.value})}><option value="hypothesis">Hipótese analítica</option><option value="confirmed">Necessidade confirmada com fundamento público</option></select></Field>}
|
||||
{value.group!=='exists'&&text('need','Necessidade pública')}{value.group==='ideas'&&text('proposal','Proposta pública')}{text('basis','Fundamento público')}{text('limitations','Limitações públicas da ideia')}{text('next_action','Próximo passo público')}{text('stage','Etapa pública da cadeia')}{text('resources','Recursos públicos documentados')}{text('assumptions','Pressupostos públicos')}{text('conditions','Condições públicas')}
|
||||
<Field label="Cadeia de valor pública"><select className={control} aria-label="Cadeia de valor pública" value={value.chain_id??''} onChange={e=>onChange({...value,chain_id:e.target.value})}><option value="">Por determinar</option>{options?.references.chain?.map(c=><option key={c.id} value={c.id}>{c.name}</option>)}</select></Field>
|
||||
<fieldset><legend>Relações públicas seleccionadas</legend>{relations.map(r=><label key={r.id} className="block"><input type="checkbox" checked={(value.relation_ids??[]).includes(r.id)} onChange={event=>onChange({...value,relation_ids:event.target.checked?[...(value.relation_ids??[]),r.id]:(value.relation_ids??[]).filter(id=>id!==r.id)})}/> {r.label} · {r.relationship}</label>)}</fieldset><fieldset><legend>Evidências públicas a divulgar</legend>{evidence.map(e=><label key={e.id} className="block"><input type="checkbox" checked={value.evidence_ids.includes(e.id)} onChange={event=>onChange({...value,evidence_ids:event.target.checked?[...value.evidence_ids,e.id]:value.evidence_ids.filter(id=>id!==e.id)})}/> {e.statement||'Evidência pública por descrever'}</label>)}</fieldset>
|
||||
<label className="block"><input type="checkbox" checked={reviewed} onChange={e=>onReview(e.target.checked)}/> Confirmei a divulgação deste texto e das evidências públicas seleccionadas, sem exposição directa ou indirecta de informação privada.</label>
|
||||
</fieldset>;
|
||||
}
|
||||
|
||||
export function proactiveView(raw:unknown):ProactivePublic|null{
|
||||
if(!raw||typeof raw!=='object')return null;
|
||||
const p=raw as Partial<ProactivePublic&ProactiveAnalysis>;
|
||||
if(p.version!==1)return null;
|
||||
if(typeof p.group==='string'&&typeof p.need==='string')return p as ProactivePublic;
|
||||
const a=raw as ProactiveAnalysis;
|
||||
if(!a.need||typeof a.need.problem!=='string'||!a.idea)return null;
|
||||
return {version:1,group:a.kind,state:a.need.state,need:a.kind==='exists'?'':a.need.problem,proposal:a.kind==='ideas'?a.idea.solution:'',basis:a.need.confirmation||'Fundamento por completar',limitations:[a.need.limitations,a.need.missing,a.idea.assumptions,a.idea.conditions,a.idea.pending].filter(Boolean).join('; '),next_action:a.idea.next_action,evidence_ids:a.need.evidence_ids,chain_id:a.idea.chain_id,stage:a.kind==='ideas'?a.idea.stage:'',notice:'Origem privada autorizada deste dossier. '+proactiveNotice};
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
import { Link } from '@inertiajs/react';
|
||||
import SectorEntry, { type SectorEntryData } from '@/components/sector-entry';
|
||||
|
||||
export type SectorDetailData = {
|
||||
sector: {
|
||||
id: number;
|
||||
name: string;
|
||||
slug: string;
|
||||
description: string | null;
|
||||
short_description: string | null;
|
||||
};
|
||||
sectorEntry?: SectorEntryData | null;
|
||||
opportunities?: {
|
||||
title: string;
|
||||
slug: string;
|
||||
province: string | null;
|
||||
summary: string | null;
|
||||
}[];
|
||||
};
|
||||
const button =
|
||||
'inline-block rounded-lg bg-emerald-800 px-5 py-3 font-semibold text-white disabled:opacity-50';
|
||||
export default function SectorContent({
|
||||
sector,
|
||||
sectorEntry,
|
||||
opportunities,
|
||||
headingLevel = 2,
|
||||
}: SectorDetailData & { headingLevel?: 2 | 3 }) {
|
||||
const Heading = headingLevel === 2 ? 'h2' : 'h3';
|
||||
return (
|
||||
<div className="space-y-5">
|
||||
<p className="whitespace-pre-line">
|
||||
{sector.description ||
|
||||
sector.short_description ||
|
||||
'Descrição sectorial em preparação.'}
|
||||
</p>
|
||||
{!sectorEntry && (
|
||||
<Link
|
||||
className={button}
|
||||
href={'/investimentos/iniciar?source=sector:' + sector.id}
|
||||
>
|
||||
Iniciar ou continuar uma ideia neste sector
|
||||
</Link>
|
||||
)}
|
||||
{sectorEntry && (
|
||||
<SectorEntry
|
||||
headingLevel={headingLevel}
|
||||
data={{
|
||||
...sectorEntry,
|
||||
start_href: sectorEntry.start_href
|
||||
? '/investimentos/iniciar?source=sector:' +
|
||||
sector.id
|
||||
: null,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
<Heading className="text-xl font-bold">
|
||||
Oportunidades no sector
|
||||
</Heading>
|
||||
{opportunities?.map((o) => (
|
||||
<article key={o.slug} className="rounded border bg-white p-5">
|
||||
<Link
|
||||
className="text-lg font-bold underline"
|
||||
href={`/oportunidades/${o.slug}`}
|
||||
>
|
||||
{o.title}
|
||||
</Link>
|
||||
<p>{o.province}</p>
|
||||
<p>{o.summary}</p>
|
||||
<ul aria-label="Localizações associadas">
|
||||
{sectorEntry?.locations
|
||||
.filter(
|
||||
(l) => l.href === `/oportunidades/${o.slug}`,
|
||||
)
|
||||
.filter(
|
||||
(l, i, rows) =>
|
||||
rows.findIndex(
|
||||
(other) =>
|
||||
JSON.stringify(other.location) ===
|
||||
JSON.stringify(l.location),
|
||||
) === i,
|
||||
)
|
||||
.map((l, i) => (
|
||||
<li key={i}>
|
||||
{typeof l.location.name === 'string'
|
||||
? l.location.name
|
||||
: 'Consultar localização e fonte na oportunidade'}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</article>
|
||||
))}
|
||||
{!opportunities?.length && (
|
||||
<p>Sem oportunidades publicadas neste sector.</p>
|
||||
)}
|
||||
<Link
|
||||
className={button}
|
||||
href={`/oportunidades?sector=${sector.slug}`}
|
||||
>
|
||||
Pesquisar todas as oportunidades do sector
|
||||
</Link>
|
||||
<p>
|
||||
<Link href="/como-investir" className="underline">
|
||||
Preparar o investimento
|
||||
</Link>{' '}
|
||||
·{' '}
|
||||
<Link href="/apoio" className="underline">
|
||||
Pedir apoio sectorial
|
||||
</Link>
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -24,7 +24,14 @@ export type SectorEntryData = {
|
||||
specialization_href: string | null;
|
||||
content_notice: string | null;
|
||||
};
|
||||
export default function SectorEntry({ data }: { data: SectorEntryData }) {
|
||||
export default function SectorEntry({
|
||||
data,
|
||||
headingLevel = 2,
|
||||
}: {
|
||||
data: SectorEntryData;
|
||||
headingLevel?: 2 | 3;
|
||||
}) {
|
||||
const Heading = headingLevel === 2 ? 'h2' : 'h3';
|
||||
return (
|
||||
<section
|
||||
className="space-y-5"
|
||||
@@ -64,7 +71,9 @@ export default function SectorEntry({ data }: { data: SectorEntryData }) {
|
||||
perfil e a modalidade já autorizados; se ainda não tem perfil,
|
||||
pode preparar a ideia e pedir o perfil de promotor.
|
||||
</p>
|
||||
<h2 className="text-xl font-bold">Descubra onde investir</h2>
|
||||
<Heading className="text-xl font-bold">
|
||||
Descubra onde investir
|
||||
</Heading>
|
||||
{data.content_notice && <p>{data.content_notice}</p>}
|
||||
{!data.articles.length && (
|
||||
<p>
|
||||
@@ -74,7 +83,11 @@ export default function SectorEntry({ data }: { data: SectorEntryData }) {
|
||||
)}
|
||||
<div className="grid gap-4 md:grid-cols-2">
|
||||
{data.articles.map((a) => (
|
||||
<EducationalArticleCard key={a.href} article={a} />
|
||||
<EducationalArticleCard
|
||||
key={a.href}
|
||||
article={a}
|
||||
headingLevel={headingLevel === 2 ? 3 : 4}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
{data.specialization_href && (
|
||||
@@ -87,9 +100,9 @@ export default function SectorEntry({ data }: { data: SectorEntryData }) {
|
||||
dependências.
|
||||
</p>
|
||||
)}
|
||||
<h2 className="text-xl font-bold">
|
||||
<Heading className="text-xl font-bold">
|
||||
Projetos âncora, clusters e território
|
||||
</h2>
|
||||
</Heading>
|
||||
{data.relations.length ? (
|
||||
<ul>
|
||||
{data.relations.map((r) => (
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import {SimulationIrpcAnnual} from '@/components/simulation-irpc-annual';
|
||||
import {SimulationIrpcNormal} from '@/components/simulation-irpc-normal';
|
||||
import {SimulationIrpcWithholdings} from '@/components/simulation-irpc-withholdings';
|
||||
import {SimulationIspcResiduals} from '@/components/simulation-ispc-residuals';
|
||||
@@ -3513,6 +3514,7 @@ export function SimulationForm() {
|
||||
{(current.id === 'financial' || current.id === 'tax') && <SimulationIspcResiduals draft={draft} onChange={change} />}
|
||||
{(current.id === 'financial' || current.id === 'tax') && <SimulationIrpcWithholdings draft={draft} onChange={change} />}
|
||||
{(current.id === 'financial' || current.id === 'tax') && <SimulationIrpcNormal draft={draft} onChange={change} />}
|
||||
{(current.id === 'financial' || current.id === 'tax') && <SimulationIrpcAnnual draft={draft} onChange={change} />}
|
||||
{(current.id === 'financial' || current.id === 'tax') && <SimulationMonthlyIva draft={draft} busy={isCalculating} onCalculate={runSimulation} onChange={change} />}
|
||||
{current.id === 'financial' &&
|
||||
(draft.detail_level === 'advanced' ||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import {useState} from 'react';
|
||||
import {annualBook,newAnnualBook,saveAnnualBook,reuseAnnualAssessment,annualAssessment,annualWithholdingOptions,reuseAnnualWithholding,newAnnualPpc,recordAnnual,annualReportRows,annualHtml,annualSettlementSource,type AnnualBook,type AnnualPpc} from '@/lib/irpc-annual-settlement';
|
||||
|
||||
type Props={draft:Record<string,unknown>;onChange:(field:string,value:string)=>void};
|
||||
export function SimulationIrpcAnnual({draft,onChange}:Props){
|
||||
const[error,setError]=useState('');if(draft.fiscal_component!=='irpc')return null;
|
||||
try{
|
||||
const b=annualBook(draft),save=(next:AnnualBook)=>{try{onChange('modelo_a_snapshot',saveAnnualBook(draft,next));setError('');}catch(e){setError(String(e));}};
|
||||
if(!b)return<section aria-label="IRPC — L8 fecho anual" className="rounded border p-4"><h4>L8 — da colecta ao saldo anual simulado</h4><p>Reutiliza a colecta válida, retenções efectivamente sofridas por conta e PPC comprovados do próprio sujeito/exercício. PEC e créditos com regras próprias permanecem separados.</p><button type="button" onClick={()=>{try{save(reuseAnnualAssessment(draft,newAnnualBook()));}catch(e){setError(String(e));}}}>Preparar saldo anual L8</button>{error&&<p role="alert">{error}</p>}</section>;
|
||||
const patch=(p:Partial<AnnualBook>)=>save({...b,...p}),a=annualAssessment(draft),options=annualWithholdingOptions(draft);
|
||||
const field=(key:'subjectNuit'|'year'|'reference'|'assessmentReference',label:string)=><label className="block">{label}<input aria-label={label} value={b[key]} onChange={e=>patch({[key]:e.target.value})}/></label>;
|
||||
const group=(key:'withholdings'|'ppc',label:string)=><><label className="block">Estado — {label}<select aria-label={'Estado L8 — '+label} value={b[key].state} onChange={e=>patch({[key]:{...b[key],state:e.target.value as ''|'known'|'absent'}})}><option value="">Informação em falta</option><option value="known">Valores conhecidos — seleccionar comprovativos</option><option value="absent">Ausência declarada com suporte</option></select></label><label className="block">Suporte — {label}<input aria-label={'Suporte L8 — '+label} value={b[key].reference} onChange={e=>patch({[key]:{...b[key],reference:e.target.value}})}/></label></>;
|
||||
return<section aria-label="IRPC — L8 fecho anual" className="space-y-3 rounded border p-4"><h4>L8 — colecta, abatimentos e saldo anual simulado</h4><p>A colecta acima é anterior aos abatimentos. Este saldo tem cálculo e histórico próprios; retenção entregue pela empresa por pagamento a terceiros não é retenção sofrida. O resultado continua simulado, sem submissão, pagamento ou reembolso automático.</p><p>{annualSettlementSource}</p>{error&&<p role="alert">{error}</p>}
|
||||
{field('subjectNuit','NUIT do sujeito do fecho L8')}{field('year','Exercício do fecho L8')}{field('reference','Suporte do fecho da entidade e exercício L8')}
|
||||
<p>Colecta disponível:{a.colecta?a.colecta.numerator+'/'+a.colecta.denominator+' MZN':'Indeterminada'};origem:{a.kind==='special'?'L7 qualificado':'L6 normal'};NUIT:{a.subjectNuit||'Por identificar'};exercício:{a.year||'Por identificar'}.</p><button type="button" onClick={()=>{try{save(reuseAnnualAssessment(draft,b));}catch(e){setError(String(e));}}}>Reutilizar colecta corrente L6/L7</button>{field('assessmentReference','Suporte da colecta reutilizada L8')}
|
||||
<fieldset className="space-y-2 rounded border p-3"><legend>Retenções efectivamente sofridas por conta</legend>{group('withholdings','Retenções sofridas')}
|
||||
{options.length===0?<p>Não há afectações de comprovativosL5 neste contexto. Reutilize e reconcilie a retenção recebida emL5 ou declare ausência com suporte.</p>:options.map(o=><div key={o.rowId+'|'+o.paymentId} className="rounded border p-2"><p>{o.document||'Prova por identificar'};emitente:{o.issuer};data:{o.date};parcelaL5:{o.amount}MZN;{o.reason||'Retenção recebida/efectiva por conta reconciliada emL5.'}</p><button type="button" disabled={!o.ready||b.withholdings.rows.some(r=>r.rowId===o.rowId&&r.paymentId===o.paymentId)} onClick={()=>{try{save(reuseAnnualWithholding(draft,b,o.rowId,o.paymentId,crypto.randomUUID()));}catch(e){setError(String(e));}}}>Seleccionar prova L5 {o.document||o.paymentId}</button></div>)}
|
||||
{b.withholdings.rows.map((r,index)=>{const change=(p:Partial<typeof r>)=>patch({withholdings:{...b.withholdings,rows:b.withholdings.rows.map(x=>x.id===r.id?{...x,...p}:x)}});return<fieldset key={r.id} className="rounded border p-2"><legend>Retenção seleccionada {index+1}</legend><p>Rendimento:{r.rowId};prova:{r.paymentId};NUIT:{r.subjectNuit};exercício:{r.year}. Fonte conservada. Se mudou, retire esta selecção e seleccione a prova actual. O histórico mantém-se.</p><label className="block">Parcela a abater<input aria-label={'Parcela da retenção L8 '+(index+1)} value={r.amount} onChange={e=>change({amount:e.target.value})}/></label><label className="block">O próprio sujeito é beneficiário e o rendimento está incluído na base deste exercício<select aria-label={'Rendimento incluído L8 '+(index+1)} value={r.incomeIncluded} onChange={e=>change({incomeIncluded:e.target.value as ''|'yes'|'no'})}><option value="">Informação em falta</option><option value="yes">Sim — documentado</option><option value="no">Não — crédito não aplicável neste fecho</option></select></label><label className="block">Suporte da titularidade e inclusão<input aria-label={'Suporte da retenção L8 '+(index+1)} value={r.reference} onChange={e=>change({reference:e.target.value})}/></label><button type="button" onClick={()=>patch({withholdings:{...b.withholdings,rows:b.withholdings.rows.filter(x=>x.id!==r.id)}})}>Retirar selecção L8 da retenção {index+1}</button></fieldset>;})}</fieldset>
|
||||
<fieldset className="space-y-2 rounded border p-3"><legend>PPC efectivamente pagos</legend>{group('ppc','PPC efectuados')}<p>Regista comprovativos de pagamentos por conta; não calcula automaticamente a obrigação PPC nem usa pagamentos previstos no plano.</p><button type="button" onClick={()=>patch({ppc:{...b.ppc,rows:[...b.ppc.rows,{...newAnnualPpc(crypto.randomUUID()),subjectNuit:b.subjectNuit,year:b.year}]}})}>Registar comprovativo PPC</button>
|
||||
{b.ppc.rows.map((r,index)=>{const change=(p:Partial<AnnualPpc>)=>patch({ppc:{...b.ppc,rows:b.ppc.rows.map(x=>x.id===r.id?{...x,...p}:x)}});return<fieldset key={r.id} className="rounded border p-2"><legend>PPC {index+1}</legend>{([['document','Comprovativo'],['issuer','Emitente'],['date','Data (AAAA-MM-DD)'],['subjectNuit','NUIT beneficiário'],['year','Exercício do comprovativo'],['currency','Moeda do comprovativo'],['proofAmount','Montante comprovado'],['amount','Parcela a abater'],['reference','Suporte do pagamento e afectação']]as const).map(([key,label])=><label key={key} className="block">{label}<input aria-label={'PPC L8 '+(index+1)+' — '+label} value={r[key]} onChange={e=>change({[key]:e.target.value})}/></label>)}<label className="block">Pagamento efectivamente comprovado<select aria-label={'PPC L8 '+(index+1)+' — Efectivo'} value={r.effective} onChange={e=>change({effective:e.target.value as ''|'yes'|'no'})}><option value="">Informação em falta</option><option value="yes">Sim — comprovativo reconciliado</option><option value="no">Não — apenas previsão/outro estado</option></select></label><button type="button" onClick={()=>patch({ppc:{...b.ppc,rows:b.ppc.rows.filter(x=>x.id!==r.id)}})}>Retirar PPC {index+1}</button></fieldset>;})}</fieldset>
|
||||
{([['pec','PEC'],['credits','Créditos com regras próprias']]as const).map(([key,label])=><fieldset key={key} className="rounded border p-3"><legend>{label} — tratamento separado</legend><label className="block">Estado — {label}<select aria-label={'Estado L8 — '+label} value={b[key].state} onChange={e=>patch({[key]:{...b[key],state:e.target.value as ''|'known'|'absent'}})}><option value="">Informação em falta</option><option value="absent">Ausência declarada com suporte</option><option value="known">Valor conhecido — positivo exige regra própria</option></select></label>{(b[key].state==='known'||b[key].amount)&&<label className="block">Montante declarado<input aria-label={'Montante L8 — '+label} value={b[key].amount} onChange={e=>patch({[key]:{...b[key],amount:e.target.value}})}/></label>}<label className="block">Suporte<input aria-label={'Suporte L8 — '+label} value={b[key].reference} onChange={e=>patch({[key]:{...b[key],reference:e.target.value}})}/></label></fieldset>)}
|
||||
<button type="button" onClick={()=>{try{save(recordAnnual(draft,b));}catch(e){setError(String(e));}}}>Calcular e guardar saldo anual L8</button><button type="button" onClick={()=>{try{const html=annualHtml(draft),url=URL.createObjectURL(new Blob([html],{type:'text/html;charset=utf-8'})),link=document.createElement('a');link.href=url;link.download='IRPC-L8-saldo-simulado.html';link.click();URL.revokeObjectURL(url);setError('');}catch(e){setError(String(e));}}}>Exportar saldo anual L8</button>
|
||||
{annualReportRows(draft).map((r,n)=><p key={n}>{r[1]} — {r[2]} — {r[3]}</p>)}</section>;
|
||||
}catch(e){return<p role="alert">PreparaçãoL8 não recuperável:{String(e)}. Originais e históricos conservados.</p>;}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import {useState} from 'react';
|
||||
import {costRules,newNormalCosts,newCostRow,reusableCreditBalance,type CostRow,type NormalCostsInput} from '@/lib/irpc-normal-costs';
|
||||
import {normalFinancialSource,type NormalBook} from '@/lib/irpc-normal';
|
||||
import {fiscalMoney} from '@/lib/irpc-normal-schedules';
|
||||
import {addFractions,subtractFractions,fractionPresentation} from '@/lib/fiscal-rational';
|
||||
import {type ProfitTopic} from '@/lib/irpc-normal-profit';
|
||||
type Field=[string,string,'money'|'text'|'choice'|'method'|'source'];
|
||||
const fields:Record<string,Field[]>={
|
||||
allowance:[['billed','Parcela facturada a clientes','money'],['taxedNotBilled','Parcela tributada emIRPS e não facturada a clientes','money']],
|
||||
advertising:[['campaign','Campanha de lançamento com horizonte superior a um ano','choice']],
|
||||
vehicle:[['passenger','Viatura ligeira de passageiros','choice'],['publicOrRental','Afecta a serviço público de transportes ou aluguer na actividade normal','choice']],
|
||||
fuel:[['supportedNormal','Parcela com activo/locação e consumo normal comprovados','money'],['passenger','Viatura ligeira de passageiros','choice'],['publicOrRental','Afecta a serviço público de transportes ou aluguer na actividade normal','choice']],
|
||||
rental:[['nonAcceptedQuota','Parcela documentada da quota não aceite (36h)','money'],['quotaReference','Documento e regra da quota não aceite','text'],['passenger','Aplicação36(4) — ligeira de passageiros','choice'],['publicOrRental','Afecta a serviço público de transportes ou aluguer na actividade normal','choice']],
|
||||
stock:[['balanceKey','Identificação única do inventário/objecto','text'],['lossObserved','Perda de valor efectivamente observada','choice'],['observedLoss','Perda total observada documentada','money'],['previous','Provisão fiscal anterior que subsiste','money']],
|
||||
litigation:[['balanceKey','Identificação única do processo/objecto','text'],['caseOngoing','Processo judicial em curso','choice'],['chargeDeductible','Obrigação daria lugar a custo fiscal dedutível','choice'],['obligation','Obrigação coberta documentada','money'],['previous','Provisão fiscal anterior que subsiste','money']],
|
||||
provision_reversal:[['balanceKey','Identificação única da provisão/objecto','text'],['previous','Parcela antes fiscalmente deduzida','money'],['eventEnded','Evento não subsiste ou utilização para fim diferente','choice'],['inResult','Reversão já incluída em proveitos do resultado actual','choice']],
|
||||
taxed_reversal:[['balanceKey','Identificação única da provisão/objecto','text'],['previous','Parcela antes tributada e não deduzida','money'],['eventEnded','Evento não subsiste ou utilização para fim diferente','choice'],['inResult','Reversão já incluída em proveitos do resultado actual','choice']],
|
||||
prior_cost:[['originalYear','Exercício de origem','text'],['unknownAtClose','Imprevisível ou manifestamente desconhecido no encerramento anterior','choice'],['closingEvidence','Suporte do conhecimento no encerramento anterior','text']],
|
||||
prior_income:[['originalYear','Exercício de origem','text'],['unknownAtClose','Imprevisível ou manifestamente desconhecido no encerramento anterior','choice'],['closingEvidence','Suporte do conhecimento no encerramento anterior','text']],
|
||||
work:[['projectKey','Identificação única da obra','text'],['method','Critério fiscal da obra','method'],['price','Preço contratual estabelecido','money'],['totalCost','Custo total estimado para concluir','money'],['incurred','Custos efectivamente incorporados acumulados','money'],['priorRevenue','Proveitos fiscais reconhecidos em exercícios anteriores','money'],['priorCost','Custos fiscais reconhecidos em exercícios anteriores','money'],['costSource','Linha de custos da obra no resultado actual','source'],['bookCost','Parcela de custos da obra já contabilizada no exercício','money'],['partialBilling','Facturação parcial com grau de acabamento correspondente','choice'],['ownFractionalDelivery','Obra por conta própria vendida e entregue fraccionadamente','choice'],['consistentMethod','Critério uniforme para obras idênticas e mantido até ao final','choice'],['publicReception','Recepção provisória de obra pública','choice'],['deferredReceipt','Receita antecipada19(5) proposta — zero conhecido se não aplicada','money']],
|
||||
};
|
||||
export function SimulationIrpcCosts({draft,book,save}:{draft:Record<string,unknown>;book:NormalBook;save:(b:NormalBook)=>void}){
|
||||
const[review,setReview]=useState(false),[error,setError]=useState(''),i=book.costs,source=normalFinancialSource(draft);
|
||||
if(!i)return<button type="button" onClick={()=>save({...book,costs:newNormalCosts()})}>Iniciar custos com limites, provisões e periodização</button>;
|
||||
const patch=(p:Partial<NormalCostsInput>)=>{setReview(false);save({...book,costs:{...i,...p}});};
|
||||
const row=(id:string,p:Partial<CostRow>)=>patch({rows:i.rows.map(r=>r.id===id?{...r,...p}:r)});
|
||||
const fact=(r:CostRow,k:string,v:string)=>row(r.id,{facts:{...r.facts,[k]:v}});
|
||||
const summaries=()=>{const groups=new Map<ProfitTopic,string[]>();for(const r of book.schedules?.rows??[]){if(!r.rule)continue;const k=({tax_own:'expenseCorrections',tax_other:'expenseCorrections',undocumented:'expenseCorrections',capital_in:'positivePatrimonial',patrimonial_gain:'positivePatrimonial',capital_out:'negativePatrimonial',patrimonial_cost:'negativePatrimonial',future_cost:'timing',future_income:'timing',current_cost:'timing',current_income:'timing'}as Record<string,ProfitTopic>)[r.rule];groups.set(k,[...(groups.get(k)??[]),r.amount]);}for(const r of i.rows)if(r.rule){const k=costRules[r.rule][1];groups.set(k,[...(groups.get(k)??[]),r.amount]);}return[...groups].map(([key,values])=>({key,amount:fractionPresentation(addFractions(values.map(fiscalMoney))).decimal}));};
|
||||
const reuse=(r:CostRow)=>{try{const code=r.sourceCode,l=source?.accountingLines.find(l=>l.code===code);if(!l)throw Error('Seleccione uma origem.');const claims=[...book.rows,...(book.schedules?.rows??[]),...i.rows.filter(q=>q.id!==r.id),...i.rows.filter(q=>q.rule==='work').map(q=>({sourceCode:q.facts.costSource,amount:q.facts.bookCost}))].filter(q=>q.sourceCode===code);const available=subtractFractions(fiscalMoney(l.total),addFractions(claims.map(q=>fiscalMoney(q.amount))));if(BigInt(available.numerator)<=0n)throw Error('Não há parcela livre conhecida nesta origem.');row(r.id,{amount:fractionPresentation(available).decimal});setError('');}catch(e){setError(String(e));}};
|
||||
return<fieldset aria-label="Custos com limites provisões periodização" className="space-y-3 rounded border p-3"><legend>Custos com limites, provisões e periodização — exercício2026</legend>
|
||||
<p>Reutiliza o resultado e as linhas já declaradas. Identifique só a parcela de cada categoria e os parâmetros em falta. Os limites anuais de publicidade e créditos são partilhados por todas as parcelas; os saldos de provisões não são consumidos. A divergência M20/M22 não bloqueia estes cálculos. Benefícios/casos especiaisL7 e saldo anualL8 mantêm os seus âmbitos.</p>{error&&<p role="alert">{error}</p>}
|
||||
<button type="button" onClick={()=>patch({rows:[...i.rows,newCostRow(crypto.randomUUID())]})}>Acrescentar custo, provisão ou periodização</button>
|
||||
{i.rows.some(r=>r.rule==='advertising')&&<fieldset><legend>Publicidade — limite único anual</legend><p>Volume de vendas da origem: {source?.accountingLines.find(l=>l.code==='revenue')?.total??'Em falta'} MZN. O limite não se repete por factura.</p><label>Correspondência às vendas normais do exercício<select aria-label="Vendas normais para publicidade" value={i.salesOrdinary} onChange={e=>patch({salesOrdinary:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Toda a receita da origem corresponde a vendas/serviços normais</option></select></label><label className="block">Suporte do volume de vendas e completude da publicidade<input value={i.advertisingReference} onChange={e=>patch({advertisingReference:e.target.value})}/></label><p>Campanhas de lançamento com efeito superior a um ano exigem36-A e articulação própria; permanecem discriminadas, sem dedução ordinária presumida.</p></fieldset>}
|
||||
{i.rows.some(r=>r.rule==='credit')&&<fieldset><legend>Créditos — limites anual e acumulado</legend><label>Regime da provisão de créditos<select aria-label="Regime da provisão de créditos" value={i.creditRegime} onChange={e=>patch({creditRegime:e.target.value as NormalCostsInput['creditRegime']})}><option value="">Por identificar</option><option value="ordinary">Ordinário — fora de supervisão financeira/seguradora</option><option value="regulated">Provisão sujeita a supervisão — correspondência própria</option></select></label><label className="block">Créditos da actividade normal existentes no fim do exercício<input value={i.creditBase} onChange={e=>patch({creditBase:e.target.value})}/></label>{reusableCreditBalance(source)&&<button type="button" onClick={()=>patch({creditBase:fractionPresentation(reusableCreditBalance(source)!).decimal})}>Reutilizar saldo financeiro de créditos: {fractionPresentation(reusableCreditBalance(source)!).decimal} MZN — conferir âmbito</button>}<label className="block">Provisão fiscal anterior que subsiste no termo do exercício<input value={i.creditPrevious} onChange={e=>patch({creditPrevious:e.target.value})}/></label><label className="block">Suporte do saldo de créditos e provisão anterior<input value={i.creditReference} onChange={e=>patch({creditReference:e.target.value})}/></label><p>1,5% anual e6% acumulado; saldo anterior em falta não significa zero. Não aplica regras bancárias/seguradoras nem percentagens de antiguidade presumidas.</p></fieldset>}
|
||||
{i.rows.map((r,n)=>{const income=['provision_reversal','taxed_reversal','prior_income','work'].includes(r.rule),omitted=r.rule==='provision_reversal'&&r.facts.inResult==='no';return<fieldset key={r.id} className="rounded border p-3"><legend>Parcela {n+1} — {r.document||'Por identificar'}</legend><label>Categoria<select aria-label={'Categoria custo '+(n+1)} value={r.rule} onChange={e=>row(r.id,{rule:e.target.value as CostRow['rule']})}><option value="">Por identificar</option>{Object.entries(costRules).map(([k,v])=><option key={k} value={k}>{v[0]} — {v[2]}</option>)}</select></label>
|
||||
{(['document','line','amount','reference']as const).map(k=><label key={k} className="block">{({document:'Documento ou mapa discriminado',line:'Linha distinta',amount:r.rule==='work'?'Proveitos da obra já contabilizados no exercício — zero se conhecido':'Parcela contabilística MZN',reference:'Suporte da classificação, condições e período'})[k]}<input aria-label={'Custo '+(n+1)+' '+k} value={r[k]} onChange={e=>row(r.id,{[k]:e.target.value})}/></label>)}
|
||||
{!omitted&&<><label>Origem contabilística<select aria-label={'Origem custo '+(n+1)} value={r.sourceCode} onChange={e=>row(r.id,{sourceCode:e.target.value})}><option value="">Por corresponder</option>{source?.accountingLines.filter(l=>l.accountingEffect===(income?'income':'expense')).map(l=><option key={l.code} value={l.code}>{l.origin}: {l.total} MZN</option>)}</select></label><button type="button" onClick={()=>reuse(r)}>Reutilizar parcela livre da origem {n+1}</button></>}
|
||||
{(fields[r.rule]??[]).filter(([k])=>!(k==='publicOrRental'&&r.facts.passenger!=='yes')&&!(k==='publicReception'&&r.facts.method!=='closing')&&!(r.rule==='stock'&&r.facts.lossObserved==='no'&&['observedLoss','previous'].includes(k))&&!(r.rule==='litigation'&&r.facts.caseOngoing==='no'&&['obligation','previous','chargeDeductible'].includes(k))).map(([k,label,type])=><label key={k} className="block">{label}{type==='choice'?<select aria-label={'Custo '+(n+1)+' '+k} value={r.facts[k]??''} onChange={e=>fact(r,k,e.target.value)}><option value="">Informação em falta</option><option value="yes">Sim — documentado</option><option value="no">Não — documentado</option></select>:type==='method'?<select aria-label={'Custo '+(n+1)+' '+k} value={r.facts[k]??''} onChange={e=>fact(r,k,e.target.value)}><option value="">Por identificar</option><option value="percentage">Percentagem de acabamento</option><option value="closing">Encerramento da obra</option></select>:type==='source'?<select aria-label={'Custo '+(n+1)+' '+k} value={r.facts[k]??''} onChange={e=>fact(r,k,e.target.value)}><option value="">Por corresponder/zero fora de linha</option>{source?.accountingLines.filter(l=>l.accountingEffect==='expense').map(l=><option key={l.code} value={l.code}>{l.origin}: {l.total} MZN</option>)}</select>:<input aria-label={'Custo '+(n+1)+' '+k} value={r.facts[k]??''} onChange={e=>fact(r,k,e.target.value)}/>}</label>)}
|
||||
<label>Condições ordinárias e inclusão na origem demonstradas<select aria-label={'Condições custo '+(n+1)} value={r.conditions} onChange={e=>row(r.id,{conditions:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Sim, nos documentos identificados</option></select></label><button type="button" onClick={()=>patch({rows:i.rows.filter(q=>q.id!==r.id)})}>Retirar parcela {n+1} das entradas actuais</button></fieldset>;})}
|
||||
{book.profit&&<><button type="button" onClick={()=>{try{summaries();setReview(true);setError('');}catch(e){setError(String(e));}}}>Conferir correspondência dos temas com os mapas</button>{review&&<div><p>Reveja as somas brutas antes de aplicar; não alteram os factos, o resultado financeiro ou os históricos.</p>{summaries().map(t=><p key={t.key}>{({expenseCorrections:'Correcções aos custos',incomeCorrections:'Correcções aos proveitos',positivePatrimonial:'Variações positivas',negativePatrimonial:'Variações negativas',timing:'Periodização',special:'Casos especiais'})[t.key]}: actual {book.profit!.topics[t.key].amount||book.profit!.topics[t.key].state||'Em falta'} → mapas {t.amount} MZN</p>)}<button type="button" onClick={()=>{const topics=structuredClone(book.profit!.topics);for(const t of summaries())topics[t.key]={state:'known',amount:t.amount,reference:'Correspondência aritmética aos documentos/linhas dos mapas de ajustamentos e custos do exercício.'};save({...book,profit:{...book.profit!,topics}});setReview(false);}}>Aplicar correspondências conferidas dos mapas</button></div>}</>}
|
||||
<p>Ao calcular e guardar, os novos resultados entram numa versão própria; o resultado anterior permanece no histórico. Informação em falta impede apenas os totais que dependem dessa parcela.</p>
|
||||
</fieldset>;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
import {useState}from'react';
|
||||
import{depreciationCatalog,newNormalDepreciation,newDepreciationAsset,reuseNormalAssets,type DepreciationAsset}from'@/lib/irpc-normal-depreciation';
|
||||
import{normalFinancialSource,type NormalBook}from'@/lib/irpc-normal';
|
||||
import{fiscalMoney}from'@/lib/irpc-normal-schedules';import{addFractions,subtractFractions,fractionPresentation}from'@/lib/fiscal-rational';
|
||||
export function SimulationIrpcDepreciation({draft,book,save}:{draft:Record<string,unknown>;book:NormalBook;save:(b:NormalBook)=>void}){
|
||||
const[error,setError]=useState(''),input=book.depreciation,source=normalFinancialSource(draft);
|
||||
if(!input)return<div><button type="button" onClick={()=>save({...book,depreciation:newNormalDepreciation()})}>Iniciar amortizações — tabelas, métodos e quotas anteriores</button>{!!book.schedules?.assets.length&&<button type="button" onClick={()=>save({...book,depreciation:{...reuseNormalAssets(book.schedules!.assets),completenessReference:book.schedules!.assetsReference}})}>Reutilizar activos e valores do mapa inicial</button>}</div>;
|
||||
const patch=(id:string,p:Partial<DepreciationAsset>)=>save({...book,depreciation:{...input,assets:input.assets.map(a=>a.id===id?{...a,...p}:a)}});
|
||||
const field=(a:DepreciationAsset,n:number,k:keyof DepreciationAsset,label:string)=><label key={k}className="block">{label}<input aria-label={'Activo '+n+' '+k}value={a[k]}onChange={e=>patch(a.id,{[k]:e.target.value})}/></label>;
|
||||
const choice=(a:DepreciationAsset,n:number,k:'specificRate'|'consistentMethod'|'newTangible'|'switchToStraight'|'priorFullQuotas'|'vehicleException'|'limitedRights'|'individual',label:string)=><label key={k}className="block">{label}<select aria-label={'Activo '+n+' '+k}value={a[k]}onChange={e=>patch(a.id,{[k]:e.target.value})}><option value="">Informação em falta</option><option value="yes">Sim — documentado</option><option value="no">Não — documentado</option></select></label>;
|
||||
return<fieldset aria-label="Amortizações ampliadas L6"className="space-y-3 rounded border p-3"><legend>Amortizações — tabelas, métodos, duodécimos e quotas anteriores</legend>
|
||||
<p>Decreto72/2013 eCIRPC26/27. Reutiliza a depreciação financeira e os activos do mapa inicial; os originais/históricos ficam conservados. O novo mapa substitui exclusivamente o cálculo de amortizações, sem somar novamente o mapa inicial. Custo histórico e condições ordinárias documentados; reavaliações, turnos intensivos, concessões e outros casos especiais permanecem separados.</p>
|
||||
<p>Depreciação contabilística a repartir: {source?.accountingLines.find(l=>l.code==='depreciation')?.total??'Em falta'} {source?.currency}. O catálogo apresenta apenas os códigos correspondidos; outra categoria permanece identificada, sem taxa livre.</p>{error&&<p role="alert">{error}</p>}
|
||||
<label className="block">Suporte da reconciliação integral dos activos e quotas anteriores<input value={input.completenessReference}onChange={e=>save({...book,depreciation:{...input,completenessReference:e.target.value}})}/></label>
|
||||
<button type="button"onClick={()=>save({...book,depreciation:{...input,assets:[...input.assets,newDepreciationAsset(crypto.randomUUID())]}})}>Acrescentar activo ao mapa fiscal</button>
|
||||
{input.assets.map((a,index)=>{const n=index+1,entry=Object.hasOwn(depreciationCatalog,a.category)?depreciationCatalog[a.category as keyof typeof depreciationCatalog]:null;return<fieldset key={a.id}className="rounded border p-3"><legend>Activo fiscal {n} — {a.description||'Por identificar'}</legend>
|
||||
{field(a,n,'assetKey','Identificação única do activo')}{field(a,n,'description','Descrição')}{field(a,n,'document','Documento, pressuposto ou mapa de origem')}{field(a,n,'line','Linha distinta do documento/mapa')}
|
||||
<label>Categoria/tabela<select aria-label={'Activo '+n+' category'}value={a.category}onChange={e=>{const category=e.target.value as DepreciationAsset['category'],c=Object.hasOwn(depreciationCatalog,category)?depreciationCatalog[category as keyof typeof depreciationCatalog]:null;patch(a.id,{category,rate:c?.rate??''});}}><option value="">Por identificar</option>{Object.entries(depreciationCatalog).map(([k,c])=><option key={k}value={k}>Tabela{c.table}/{c.code} — {c.label} — {c.rate}%</option>)}<option value="nondepreciable">Elemento comprovadamente não depreciável — exclusão</option><option value="other">Outra categoria — correspondência pendente</option></select></label>
|
||||
{entry&&<p>Taxa máxima: {entry.rate}%; taxas constantes cobertas: {Number(entry.rate)/2}% a{entry.rate}%; vida útil mínima: {100/Number(entry.rate)}anos, máxima: {200/Number(entry.rate)}anos. Coeficiente degressivo máximo: {100/Number(entry.rate)<5?'1,5':100/Number(entry.rate)<=6?'2':'2,5'}, apenas nos activos elegíveis. Fonte:tabela{entry.table}/{entry.code},PDF{entry.page}.</p>}{field(a,n,'cost','Custo histórico documentado MZN')}{field(a,n,'accounting','Depreciação contabilística do exercício MZN')}
|
||||
<button type="button"onClick={()=>{try{const total=fiscalMoney(source?.accountingLines.find(l=>l.code==='depreciation')?.total??''),used=addFractions(input.assets.filter(q=>q.id!==a.id).map(q=>fiscalMoney(q.accounting))),left=subtractFractions(total,used);if(BigInt(left.numerator)<0n)throw Error('Valores repartidos excedem a origem.');patch(a.id,{accounting:fractionPresentation(left).decimal});setError('');}catch(e){setError(String(e));}}}>Reutilizar depreciação financeira ainda não repartida — activo {n}</button>
|
||||
{a.category!=='nondepreciable'&&<>
|
||||
<label>Tipo de aquisição/base<select aria-label={'Activo '+n+' valuation'} value={a.valuation} onChange={e=>patch(a.id,{valuation:e.target.value as DepreciationAsset['valuation']})}><option value="">Por identificar</option><option value="historical_new">Bem adquirido novo/construído ou produzido — custo histórico</option><option value="used">Bem adquirido usado — regra própria7(2)</option><option value="revalued">Bem reavaliado — regra própria15</option><option value="other">Outra base — por corresponder</option></select></label>{entry&&choice(a,n,'specificRate','Existe taxa específica da tabelaI para o activo/actividade')}{field(a,n,'residual','Valor residual MZN')}{entry?.kind==='building'&&field(a,n,'land','Terreno/parte não depreciável incluídos no custo MZN')}
|
||||
<label>Método<select aria-label={'Activo '+n+' method'}value={a.method}onChange={e=>patch(a.id,{method:e.target.value as DepreciationAsset['method']})}><option value="">Por identificar</option><option value="constant">Quotas constantes — artigos5/7</option><option value="declining">Quotas degressivas — artigos6/8</option><option value="low_value">Valor reduzido, opção integral — artigo17</option></select></label>
|
||||
{a.method==='constant'&&field(a,n,'rate','Taxa constante escolhida %')}
|
||||
{a.method==='declining'&&<>{choice(a,n,'newTangible','Activo tangível novo adquirido a terceiros ou construído/produzido')}{field(a,n,'factor','Coeficiente degressivo escolhido (máximo1,5/2/2,5)')}{choice(a,n,'switchToStraight','Aplicar saldo/vida útil restante8(2) quando mais favorável')}{a.switchToStraight==='yes'&&choice(a,n,'priorFullQuotas','Condição de quotas anteriores do artigo8(2) integralmente documentada')}</>}
|
||||
{a.method==='low_value'?<>{choice(a,n,'individual','Activo individual, fora de conjunto depreciado como um todo')}<p>Art17:até20000MZN, sem amortização fiscal anterior e entrada emuso neste período; a dedução não excede o contabilizado e o saldo fiscal.</p></>:<label>Período da quota<select aria-label={'Activo '+n+' timing'}value={a.timing}onChange={e=>patch(a.id,{timing:e.target.value as DepreciationAsset['timing']})}><option value="">Por identificar</option><option value="annual">Quota anual</option><option value="months">Duodécimos em vigor desde o início — artigo9</option></select></label>}
|
||||
{field(a,n,'start','Entrada em funcionamento/utilização AAAA-MM-DD')}
|
||||
<label>Transmissão, inutilização ou termo da vida útil<select aria-label={'Activo '+n+' exitState'}value={a.exitState}onChange={e=>patch(a.id,{exitState:e.target.value as DepreciationAsset['exitState']})}><option value="">Informação em falta</option><option value="absent">Ausência declarada de evento</option><option value="known">Evento/data conhecidos</option></select></label>{(a.exitState==='known'||a.exitDate)&&field(a,n,'exitDate','Data do evento AAAA-MM-DD')}
|
||||
{choice(a,n,'consistentMethod','Método uniforme desde o início, sem mudança ou excepção por corresponder')}{entry?.kind==='vehicle'&&choice(a,n,'vehicleException','Afectação a serviço público de transportes/locação na actividade normal')}{entry?.kind==='software'&&choice(a,n,'limitedRights','Aquisição onerosa e utilização exclusiva por tempo limitado')}
|
||||
{field(a,n,'previousAccounting','Quotas contabilísticas anteriores desde a utilização MZN')}{field(a,n,'previousFiscal','Quotas fiscais anteriormente deduzidas MZN')}{field(a,n,'priorAvailable','Parcela anterior temporariamente tributada, recuperável MZN')}{field(a,n,'previousReference','Suporte das quotas anteriores e da recuperabilidade fiscal')}
|
||||
{['previousAccounting','previousFiscal','priorAvailable'].every(k=>!a[k as 'previousFiscal']||/^0(?:\.0+)?$/.test(a[k as 'previousFiscal']))&&<button type="button"onClick={()=>{if(!a.reference.trim()){setError('Identifique primeiro o suporte da ausência de quotas anteriores.');return;}patch(a.id,{previousAccounting:'0',previousFiscal:'0',priorAvailable:'0',previousReference:'Ausência de quotas anteriores expressamente declarada; '+a.reference});setError('');}}>Declarar ausência de quotas anteriores — activo {n}</button>}
|
||||
<p>Quota anterior recuperável exige contabilização e tributação temporária demonstradas. Não inclui encargos permanentemente excluídos ou quota nunca contabilizada. O cálculo apresenta o saldo posterior aritmético; não consome saldos oficiais.</p></>}
|
||||
{field(a,n,'reference','Suporte do activo, categoria, condições e período')}<label>Condições ordinárias e documentos conferidos<select aria-label={'Activo '+n+' conditions'}value={a.conditions}onChange={e=>patch(a.id,{conditions:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Sim, no recorte documentado</option></select></label>
|
||||
<button type="button"onClick={()=>save({...book,depreciation:{...input,assets:input.assets.filter(q=>q.id!==a.id)}})}>Retirar activo {n} das entradas actuais</button></fieldset>;})}
|
||||
</fieldset>;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import {normalFinancialSource,type NormalBook} from '@/lib/irpc-normal';
|
||||
import {m20Accounts,newNormalFormPreparation,newFormAllocation,reuseDirectFormAllocations,normalFormAccountsFor,type NormalFormPreparationInput,type FormAllocation} from '@/lib/irpc-normal-form-preparation';
|
||||
export function SimulationIrpcFormPreparation({draft,book,save}:{draft:Record<string,unknown>;book:NormalBook;save:(b:NormalBook)=>void}){
|
||||
const i=book.forms,source=normalFinancialSource(draft);if(!i)return<button type="button" onClick={()=>save({...book,forms:newNormalFormPreparation()})}>Preparar representação dos valores e campos M20/M22</button>;
|
||||
const patch=(p:Partial<NormalFormPreparationInput>)=>save({...book,forms:{...i,...p}}),row=(id:string,p:Partial<FormAllocation>)=>patch({allocations:i.allocations.map(a=>a.id===id?{...a,...p}:a)});
|
||||
return<fieldset aria-label="Preparação de valores M20 M22" className="space-y-3 rounded border p-3"><legend>Representação dos valores e correspondência M20/M22</legend><p>Reutiliza os valores exactos do cálculo e do período/moeda já documentados. A preparação dos campos não altera lucro tributável,matéria colectável ou colecta. M20A.1 exige meticais sem centavos;fracções conservam o valor exacto e ficam pendentes de regra de representação. O transporte201/quadro8 versus200/quadro10 continua identificado,só no resultado afectado. Não gera declaração oficial nem saldo finalL8.</p>
|
||||
<label className="block">Exemplares de preparação<select value={i.edition} onChange={e=>patch({edition:e.target.value as NormalFormPreparationInput['edition']})}><option value="">Por identificar</option><option value="accepted_pdf_and_m20a1">PDF M22 quadros10–12 e M20A.1 inventariados — edições distintas</option></select></label>
|
||||
<label className="block">Suporte da edição e do período<input value={i.reference} onChange={e=>patch({reference:e.target.value})}/></label><label className="block">Completude das contas e discriminação das linhas do plano<input value={i.completenessReference} onChange={e=>patch({completenessReference:e.target.value})}/></label>
|
||||
<button type="button" onClick={()=>patch({allocations:[...i.allocations,...reuseDirectFormAllocations(source).filter(a=>!i.allocations.some(r=>r.sourceCode===a.sourceCode))]})}>Reutilizar contas directas ainda não discriminadas</button><button type="button" onClick={()=>patch({allocations:[...i.allocations,newFormAllocation(crypto.randomUUID())]})}>Acrescentar parcela contabilística M20</button>
|
||||
{i.allocations.map((a,n)=><fieldset key={a.id} className="rounded border p-2"><legend>Parcela M20 {n+1}</legend><label className="block">Linha de origem<select aria-label={'Origem M20 '+(n+1)} value={a.sourceCode} onChange={e=>row(a.id,{sourceCode:e.target.value})}><option value="">Seleccione</option>{source?.accountingLines.map(l=><option key={l.code} value={l.code}>{l.origin}: {l.total} MZN</option>)}</select></label><label className="block">Conta M20A.1<select aria-label={'Conta M20 '+(n+1)} value={a.account} onChange={e=>row(a.id,{account:e.target.value as FormAllocation['account']})}><option value="">Por corresponder</option>{Object.entries(m20Accounts).filter(([k])=>normalFormAccountsFor(a.sourceCode).includes(k)||k===a.account).map(([k,v])=><option key={k}value={k}>{k} — {v}</option>)}</select></label><label className="block">Montante MZN<input aria-label={'Montante M20 '+(n+1)}value={a.amount}onChange={e=>row(a.id,{amount:e.target.value})}/></label><label className="block">Suporte da classificação<input aria-label={'Suporte M20 '+(n+1)}value={a.reference}onChange={e=>row(a.id,{reference:e.target.value})}/></label></fieldset>)}
|
||||
<fieldset className="rounded border p-2"><legend>Imposto contabilizado e resultado líquido</legend><p>Colecta e saldo a pagar não são usados como gasto contabilístico presumido. Indique imposto reconhecido e se já está incluído numa linha do plano,para evitar subtracção duplicada.</p><label className="block">Estado do imposto contabilizado<select aria-label="Estado do imposto contabilizado" value={i.incomeTax.state} onChange={e=>patch({incomeTax:{...i.incomeTax,state:e.target.value as ''|'known'|'absent'}})}><option value="">Informação em falta</option><option value="known">Valor conhecido</option><option value="absent">Ausência declarada com suporte</option></select></label>{(i.incomeTax.state==='known'||i.incomeTax.amount!==''||i.incomeTax.placement!=='')&&<><label className="block">Imposto contabilizado em MZN<input value={i.incomeTax.amount} onChange={e=>patch({incomeTax:{...i.incomeTax,amount:e.target.value}})}/></label><label className="block">Localização do imposto contabilizado<select value={i.incomeTax.placement} onChange={e=>patch({incomeTax:{...i.incomeTax,placement:e.target.value as ''|'included'|'outside'}})}><option value="">Por identificar</option><option value="included">Já incluído no resultado do plano — discriminado na conta8.5</option><option value="outside">Exterior ao resultado antes de imposto do plano</option></select></label></>}<label className="block">Suporte do imposto contabilizado<input value={i.incomeTax.reference}onChange={e=>patch({incomeTax:{...i.incomeTax,reference:e.target.value}})}/></label></fieldset>
|
||||
<label className="block">Parcela de taxa reduzida para a colecta total302<select aria-label="Parcela de taxa reduzida para a colecta total302" value={i.reducedRate.state} onChange={e=>patch({reducedRate:{...i.reducedRate,state:e.target.value as ''|'known'|'absent'}})}><option value="">Informação em falta</option><option value="absent">Ausência declarada — sem parcela reduzida neste sujeito/período</option><option value="known">Situação conhecida — âmbitoL7 por tratar</option></select></label><label className="block">Suporte da situação da taxa reduzida<input value={i.reducedRate.reference}onChange={e=>patch({reducedRate:{...i.reducedRate,reference:e.target.value}})}/></label>
|
||||
</fieldset>;
|
||||
}
|
||||
@@ -1,3 +1,8 @@
|
||||
import {SimulationIrpcSpecial} from '@/components/simulation-irpc-special';
|
||||
import {SimulationIrpcFormPreparation} from '@/components/simulation-irpc-form-preparation';
|
||||
import {SimulationIrpcPeriodFx} from '@/components/simulation-irpc-period-fx';
|
||||
import {SimulationIrpcDepreciation} from '@/components/simulation-irpc-depreciation';
|
||||
import {SimulationIrpcCosts} from '@/components/simulation-irpc-costs';
|
||||
import {SimulationIrpcSchedules} from '@/components/simulation-irpc-schedules';
|
||||
import {SimulationIrpcAssessment} from '@/components/simulation-irpc-assessment';
|
||||
import {useState} from 'react';
|
||||
@@ -14,9 +19,9 @@ export function SimulationIrpcNormal({draft,onChange}:{draft:Record<string,unkno
|
||||
const profit=(patch:Partial<NormalProfitInput>)=>save({...b,profit:{...(b.profit??newNormalProfitInput()),...patch}});
|
||||
const field=(r:NormalAdjustment,k:'document'|'line'|'amount'|'reference',label:string)=><label className="block">{label}<input value={r[k]} onChange={e=>patch(r.id,{[k]:e.target.value})}/></label>;
|
||||
return<section aria-label="IRPC normal — ajustamentos" className="space-y-3 rounded border p-4"><h4>L6 — IRPC normal: ajustamentos ao resultado financeiro</h4><p>Acréscimos de multas sem origem contratual e juros compensatórios incluídos nos custos do plano, artigo 36(1)c. A conferência anual pode determinar o lucro tributável simulado no recorte ordinário documentado. A matéria colectável exige conferência específica de deduções e perdas; a colecta tem cálculo próprio e o saldo final a pagar ou recuperar pertence aL8. Não reutiliza automaticamente juros simulados de L5.</p>{error&&<p role="alert">{error}</p>}
|
||||
{source?<p>Origem: plano financeiro desta oportunidade; {source.periods} meses; {source.currency}; resultado antes de imposto: {source.accountingProfitBeforeTax}. Cobranças, pagamentos e reembolso de capital ficam fora do resultado.</p>:<p>Prepare o plano financeiro para reutilizar o resultado e os custos reconciliados.</p>}
|
||||
{source?<p>Origem: plano financeiro desta oportunidade; {source.periods} meses; {source.currency}; resultado antes de imposto: {source.accountingProfitBeforeTax}. Cobranças, pagamentos e reembolso de capital ficam fora do resultado.</p>:<p>{b.periodsFx?'Complete a correspondência do período e moeda abaixo para reutilizar o plano existente emMZN.':'Prepare o plano financeiro para reutilizar o resultado e os custos reconciliados.'}</p>}
|
||||
<label className="block">Exercício fiscal<input value={b.year} onChange={e=>save({...b,year:e.target.value})}/></label>
|
||||
<label className="block">{b.schedules?'Correspondência dos12 meses do plano ao período anual documentado':'Correspondência dos 12 meses do plano a Janeiro–Dezembro de 2026'}<input value={b.mappingReference} onChange={e=>save({...b,mappingReference:e.target.value})}/></label>
|
||||
<label className="block">{b.periodsFx?'Correspondência do plano ao período documentado':b.schedules?'Correspondência dos12 meses do plano ao período anual documentado':'Correspondência dos 12 meses do plano a Janeiro–Dezembro de 2026'}<input value={b.mappingReference} onChange={e=>save({...b,mappingReference:e.target.value})}/></label>
|
||||
<label className="block">Âmbito<select value={b.scope} onChange={e=>save({...b,scope:e.target.value as NormalBook['scope']})}><option value="">Por identificar</option><option value="resident_general">Sujeito residente — regime geral, fora de transparência e regimes especiais</option><option value="ep_general">Não residente com estabelecimento estável — regime geral, só resultado imputável ao EP (mapas complementares)</option><option value="other">Outro âmbito — por corresponder</option></select></label>
|
||||
<label className="block">Suporte do âmbito e da imputação integral do resultado ao sujeito/EP<input value={b.scopeReference} onChange={e=>save({...b,scopeReference:e.target.value})}/></label>
|
||||
<button type="button" onClick={()=>save({...b,rows:[...b.rows,newNormalAdjustment(crypto.randomUUID())]})}>Acrescentar ajustamento ao resultado</button>
|
||||
@@ -29,10 +34,15 @@ export function SimulationIrpcNormal({draft,onChange}:{draft:Record<string,unkno
|
||||
<p>Depreciação positiva e juros financeiros não integralmente acrescidos exigem correspondência própria;uma declaração de ausência não apaga os valores do plano.</p>
|
||||
{profitTopics.map(([k,label])=>{const t=b.profit!.topics[k];const change=(p:Partial<ProfitEvidence>)=>profit({topics:{...b.profit!.topics,[k]:{...t,...p}}});return<fieldset key={k} className="rounded border p-2"><legend>{label}</legend><label className="block">Estado — {label}<select aria-label={'Estado — '+label} value={t.state} onChange={e=>change({state:e.target.value as ProfitEvidence['state']})}><option value="">Informação em falta</option><option value="known">Valor conhecido</option><option value="absent">Ausência declarada com suporte</option></select></label>{(t.state==='known'||t.amount!=='')&&<label className="block">Montante conhecido — {label}<input value={t.amount} onChange={e=>change({amount:e.target.value})}/></label>}<label className="block">Suporte — {label}<input value={t.reference} onChange={e=>change({reference:e.target.value})}/></label></fieldset>;})}
|
||||
</fieldset>}
|
||||
<SimulationIrpcPeriodFx draft={draft} book={b} save={save}/>
|
||||
<SimulationIrpcSchedules book={b} save={save}/>
|
||||
<SimulationIrpcDepreciation draft={draft} book={b} save={save}/>
|
||||
<SimulationIrpcCosts draft={draft} book={b} save={save}/>
|
||||
<SimulationIrpcTaxableBase draft={draft} book={b} save={save}/>
|
||||
<SimulationIrpcAssessment book={b} save={save}/>
|
||||
<button type="button" onClick={()=>{try{save(recordNormal(draft,b));}catch(e){setError(String(e));}}}>Calcular e guardar ajustamentos L6</button>
|
||||
<SimulationIrpcSpecial draft={draft} book={b} save={save}/>
|
||||
<SimulationIrpcFormPreparation draft={draft} book={b} save={save}/>
|
||||
<button type="button" onClick={()=>{try{save(recordNormal(draft,b));}catch(e){setError(String(e));}}}>Calcular e guardar L6 e tratamentos L7 preparados</button>
|
||||
<button type="button" onClick={()=>{try{const html=normalHtml(draft),url=URL.createObjectURL(new Blob([html],{type:'text/html;charset=utf-8'})),a=document.createElement('a');a.href=url;a.download='IRPC-normal-ajustamentos.html';a.click();URL.revokeObjectURL(url);setError('');}catch(e){setError(String(e));}}}>Exportar mapa parcial L6</button>
|
||||
{normalReportRows(draft).map((r,n)=><p key={n}>{r[1]} — {r[2]} — {r[3]}</p>)}
|
||||
</section>;
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import {SimulationFxSelection} from '@/components/simulation-fx-selection';
|
||||
import {rawNormalFinancialSource,type NormalBook} from '@/lib/irpc-normal';
|
||||
import {newNormalPeriodFx,mapNormalPeriodFx,type NormalPeriodFxInput} from '@/lib/irpc-normal-period-fx';
|
||||
import {irpcFxSources,irpcFxRow,updateIrpcFx} from '@/lib/irpc-fx';
|
||||
export function SimulationIrpcPeriodFx({draft,book,save}:{draft:Record<string,unknown>;book:NormalBook;save:(b:NormalBook)=>void}){
|
||||
const raw=rawNormalFinancialSource(draft),i=book.periodsFx;
|
||||
if(!i)return<button type="button" onClick={()=>save({...book,periodsFx:newNormalPeriodFx()})}>Preparar período curto ou plano noutra moeda</button>;
|
||||
const patch=(p:Partial<NormalPeriodFxInput>)=>save({...book,periodsFx:{...i,...p}}),model=mapNormalPeriodFx(draft,i,raw),sources=irpcFxSources(draft);
|
||||
const text=(k:'from'|'to'|'planStart'|'reference'|'conversionReference'|'mznMapsReference',label:string)=><label className="block">{label}<input value={i[k]} onChange={e=>patch({[k]:e.target.value})}/></label>;
|
||||
return<fieldset aria-label="Período e moeda L6" className="space-y-3 rounded border p-3"><legend>Período fiscal e conversão do plano — simulação L6</legend><p>Reutiliza os meses e valores originais do plano. Seleccione apenas os meses do período documentado;sem anualizar o resultado. Os mapas,activos e saldos fiscais permanecem emMZN e exigem reconciliação explícita. A conversão cambial para simulação usa o mecanismo existente; não confirma automaticamente a regra fiscal de conversão anual.</p>
|
||||
<label className="block">Tipo de período<select value={i.kind} onChange={e=>patch({kind:e.target.value as NormalPeriodFxInput['kind']})}><option value="">Por identificar</option><option value="annual">Anual documentado — 12meses</option><option value="start">Início de actividade — 7(4)a</option><option value="cessation">Cessação de actividade — 7(4)b</option><option value="same_year">Início e fim de sujeição no mesmo exercício — 7(4)c</option><option value="transition">Transição para período autorizado/comunicado — 7(4)d</option></select></label>
|
||||
{text('from','Início do período fiscal (AAAA-MM-DD)')}{text('to','Fim do período fiscal (AAAA-MM-DD)')}{text('planStart','Primeiro mês civil do plano (AAAA-MM-01)')}{text('reference','Suporte do evento,período e correspondência dos meses')}
|
||||
{book.schedules&&<button type="button" onClick={()=>patch({from:i.from||book.schedules!.period.from,to:i.to||book.schedules!.period.to,reference:i.reference||book.schedules!.period.reference})}>Reutilizar datas e suporte já declarados nos campos vazios</button>}
|
||||
{text('mznMapsReference','Reconciliação dos mapas,parcelas,activos e saldos existentes em MZN para este período')}
|
||||
{raw?.currency!=='MZN'&&<>{text('conversionReference','Pressuposto documentado da conversão mensal para simulação')}
|
||||
{[...new Set(model.rows.map(r=>r.period))].map(period=>{const date=model.rows.find(r=>r.period===period)?.date,entry=i.months.find(m=>m.period===period)??{period,currency:raw?.currency??''};const change=(p:Partial<typeof entry>)=>patch({months:[...i.months.filter(m=>m.period!==period),{...entry,...p}]});return<fieldset key={period} aria-label={'Câmbio do mês '+period} className="rounded border p-2"><legend>Mês{period} — {date} — {raw?.currency}</legend><label>Reutilizar selecção cambial existente<select value={entry.fxLink?.id??''} onChange={e=>{const s=sources.find(s=>s.id===e.target.value);if(s)change({currency:raw?.currency??'',fxSelection:s.selection,fxLink:{id:s.id,fingerprint:s.fingerprint}});}}><option value="">Seleccione uma origem documentada</option>{sources.map(s=><option value={s.id} key={s.id}>{s.label}</option>)}</select></label><SimulationFxSelection row={irpcFxRow('normal-'+period,entry)} onChange={p=>{if(p.fxSelection)change({...updateIrpcFx(entry,p.fxSelection),currency:raw?.currency??''});}}/></fieldset>;})}
|
||||
</>}
|
||||
{i.months.filter(m=>!model.rows.some(r=>r.period===m.period)).map(m=><p key={m.period}>Selecção conservada do mês{m.period},fora do período actual. <button type="button" onClick={()=>patch({months:i.months.filter(x=>x.period!==m.period)})}>Retirar selecção do mês{m.period} deste mapa</button></p>)}
|
||||
<p>{model.months}meses;resultado convertido:{model.source?.accountingProfitBeforeTax??'Indeterminado'} MZN. {model.pending.join(' | ')}</p><p>Meses parciais,limites anuais por corresponder e contagem de perdas41(5) afectam apenas os respectivos casos. Colecta não equivale ao saldo final a pagar.</p>
|
||||
</fieldset>;
|
||||
}
|
||||
@@ -7,7 +7,7 @@ export function SimulationIrpcSchedules({book,save}:{book:NormalBook;save:(b:Nor
|
||||
const asset=(id:string,p:Partial<NormalAsset>)=>patch({assets:s.assets.map(a=>a.id===id?{...a,...p}:a)});
|
||||
return<fieldset aria-label="Mapas complementares L6" className="space-y-3 rounded border p-3"><legend>Mapas complementares — regras ordinárias documentadas</legend>
|
||||
<p>Reutiliza o resultado e as linhas do plano. As somas brutas de cada tema devem corresponder à conferência do lucro tributável. Os efeitos com sinal ficam discriminados; uma dúvida não apaga as parcelas independentes. L7 conserva benefícios e casos especiais; L8 conserva o fecho anual.</p>
|
||||
<fieldset><legend>Período anual e correspondência dos meses</legend><label>Tipo de período<select aria-label="Tipo de período L6" value={s.period.kind} onChange={e=>patch({period:{...s.period,kind:e.target.value as NormalSchedules['period']['kind']}})}><option value="">Por identificar</option><option value="calendar">Ano civil — artigo7(1)</option><option value="authorised_annual">Anual diferente — autorização artigo7(2)</option><option value="ep_annual">Anual diferente de EP — comunicação artigo7(3)</option></select></label>{(['from','to','reference']as const).map(k=><label key={k} className="block">{({from:'Início do período AAAA-MM-DD',to:'Termo do período AAAA-MM-DD',reference:'Suporte do período e da correspondência mensal'})[k]}<input aria-label={'Período L6 '+k} value={s.period[k]} onChange={e=>patch({period:{...s.period,[k]:e.target.value}})}/></label>)}<p>Período anual diferente: documente autorização do artigo7(2) ou comunicação do EP do artigo7(3), início de aplicação e manutenção por cinco exercícios. O plano representa o período completo com termo em2026, emMZN. Períodos curtos e conversão fiscal anual de outra moeda ficam por corresponder.</p></fieldset>
|
||||
{book.periodsFx&&book.periodsFx.kind!=='annual'?<p>Período actual no mapa «Período fiscal e conversão do plano». O período anual anterior permanece conservado no histórico.</p>:<fieldset><legend>Período anual e correspondência dos meses</legend><label>Tipo de período<select aria-label="Tipo de período L6" value={s.period.kind} onChange={e=>patch({period:{...s.period,kind:e.target.value as NormalSchedules['period']['kind']}})}><option value="">Por identificar</option><option value="calendar">Ano civil — artigo7(1)</option><option value="authorised_annual">Anual diferente — autorização artigo7(2)</option><option value="ep_annual">Anual diferente de EP — comunicação artigo7(3)</option></select></label>{(['from','to','reference']as const).map(k=><label key={k} className="block">{({from:'Início do período AAAA-MM-DD',to:'Termo do período AAAA-MM-DD',reference:'Suporte do período e da correspondência mensal'})[k]}<input aria-label={'Período L6 '+k} value={s.period[k]} onChange={e=>patch({period:{...s.period,[k]:e.target.value}})}/></label>)}<p>Período anual diferente: documente autorização do artigo7(2) ou comunicação do EP do artigo7(3), início de aplicação e manutenção por cinco exercícios. O plano representa o período completo com termo em2026, emMZN. Períodos curtos e conversão fiscal anual de outra moeda ficam por corresponder.</p></fieldset>}
|
||||
<button type="button" onClick={()=>patch({rows:[...s.rows,newScheduleRow(crypto.randomUUID())]})}>Acrescentar regra complementar</button>
|
||||
{s.rows.map((r,n)=><fieldset key={r.id} className="rounded border p-2"><legend>Regra complementar {n+1}</legend>
|
||||
<label>Tratamento<select aria-label={'Tratamento complementar '+(n+1)} value={r.rule} onChange={e=>row(r.id,{rule:e.target.value as ScheduleRow['rule']})}><option value="">Por identificar</option>{Object.entries(scheduleRules).map(([k,v])=><option key={k} value={k}>{v[0]} — {v[2]}</option>)}</select></label>
|
||||
@@ -19,11 +19,11 @@ export function SimulationIrpcSchedules({book,save}:{book:NormalBook;save:(b:Nor
|
||||
<label className="block">Juros ordinários remanescentes MZN<input value={s.interest.amount} onChange={e=>patch({interest:{...s.interest,amount:e.target.value}})}/></label>
|
||||
<label className="block">Suporte dos juros e condições<input value={s.interest.reference} onChange={e=>patch({interest:{...s.interest,reference:e.target.value}})}/></label>
|
||||
<label>Condições dos juros<select aria-label="Condições dos juros ordinários" value={s.interest.conditions} onChange={e=>patch({interest:{...s.interest,conditions:e.target.value as ''|'yes'}})}><option value="">Informação em falta</option><option value="yes">Demonstradas no recorte ordinário</option></select></label></fieldset>
|
||||
<fieldset><legend>Amortizações fiscais — quotas constantes anuais</legend><p>Decreto72/2013, artigos3–7. Activo próprio sujeito a deperecimento, custo histórico, uso no início de2026, método uniforme, vida útil fiscal não excedida. Documente que não há regra sectorial específica prevalecente ou limitação especial. A categoria exige qualificação documentada; os itens genéricos9/9.1 só se aplicam quando não há taxa específica da tabelaI. Duodécimos, reavaliação, bens usados e recuperação de quotas antes tributadas ficam separados.</p>
|
||||
{!book.depreciation?<fieldset><legend>Amortizações fiscais — quotas constantes anuais</legend><p>Decreto72/2013, artigos3–7. Activo próprio sujeito a deperecimento, custo histórico, uso no início de2026, método uniforme, vida útil fiscal não excedida. Documente que não há regra sectorial específica prevalecente ou limitação especial. A categoria exige qualificação documentada; os itens genéricos9/9.1 só se aplicam quando não há taxa específica da tabelaI. Duodécimos, reavaliação, bens usados e recuperação de quotas antes tributadas ficam separados.</p>
|
||||
<label className="block">Reconciliação de todos os activos com a depreciação do plano<input value={s.assetsReference} onChange={e=>patch({assetsReference:e.target.value})}/></label>
|
||||
<button type="button" onClick={()=>patch({assets:[...s.assets,newNormalAsset(crypto.randomUUID())]})}>Acrescentar activo fiscal</button>
|
||||
{s.assets.map((a,n)=><fieldset key={a.id} className="rounded border p-2"><legend>Activo {n+1}</legend><label>Categoria fiscal<select aria-label={'Categoria activo '+(n+1)} value={a.category} onChange={e=>asset(a.id,{category:e.target.value as NormalAsset['category'],rate:e.target.value==='computer'?'25':e.target.value==='server'?'20':'',tableReference:e.target.value==='computer'?'Decreto72/2013 tabelaII grupo3 item9':e.target.value==='server'?'Decreto72/2013 tabelaII grupo3 item9.1':''})}><option value="">Por identificar</option><option value="computer">Computador, impressora, UPS — II/3/9 — 25%</option><option value="server">Servidor — II/3/9.1 — 20%</option><option value="other">Outra categoria — correspondência pendente</option></select></label>{([['description','Descrição'],['cost','Custo fiscal documentado MZN'],['residual','Valor residual MZN'],['rate','Taxa anual documentada %'],['accounting','Depreciação contabilística de2026 MZN'],['previousFiscal','Amortização fiscal acumulada anterior MZN'],['inUseFrom','Data de entrada em uso AAAA-MM-DD'],['tableReference','Diploma, tabela, código e taxa aplicáveis'],['reference','Documentos e condições do activo']]as const).map(([k,label])=><label key={k} className="block">{label}<input aria-label={label+' activo '+(n+1)} value={a[k]} onChange={e=>asset(a.id,{[k]:e.target.value})}/></label>)}
|
||||
<label>Condições do activo<select aria-label={'Condições activo '+(n+1)} value={a.conditions} onChange={e=>asset(a.id,{conditions:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Demonstradas no recorte anual constante</option></select></label><button type="button" onClick={()=>patch({assets:s.assets.filter(q=>q.id!==a.id)})}>Retirar activo {n+1} das entradas actuais</button></fieldset>)}</fieldset>
|
||||
<label>Condições do activo<select aria-label={'Condições activo '+(n+1)} value={a.conditions} onChange={e=>asset(a.id,{conditions:e.target.value as ''|'yes'})}><option value="">Informação em falta</option><option value="yes">Demonstradas no recorte anual constante</option></select></label><button type="button" onClick={()=>patch({assets:s.assets.filter(q=>q.id!==a.id)})}>Retirar activo {n+1} das entradas actuais</button></fieldset>)}</fieldset>:<p>Activos do mapa inicial conservados; a depreciação é agora reconciliada exclusivamente pelo mapa de tabelas, métodos, duodécimos e quotas anteriores abaixo.</p>}
|
||||
<label className="block">Suporte da perda fiscal do próprio exercício, se apurada<input value={s.currentLossReference} onChange={e=>patch({currentLossReference:e.target.value})}/></label><p>Perda actual conhecida: matéria colectável e colecta zero apenas depois de conferidas as restantes condições. Não é dedução a si própria nem saldo oficial de reporte. Informação insuficiente mantém os totais dependentes indeterminados.</p>
|
||||
</fieldset>;
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -58,10 +58,28 @@ const menuTranslations = [
|
||||
'solicitudes recibidas',
|
||||
],
|
||||
[
|
||||
'Porquê investir em Moçambique',
|
||||
'Why invest in Mozambique',
|
||||
'Pourquoi investir au Mozambique',
|
||||
'Por qué invertir en Mozambique',
|
||||
'Porquê investir em Moçambique?',
|
||||
'Why invest in Mozambique?',
|
||||
'Pourquoi investir au Mozambique ?',
|
||||
'Por qué invertir en Mozambique?',
|
||||
],
|
||||
[
|
||||
'Partir de uma ideia',
|
||||
'Start with an idea',
|
||||
'Partir d’une idée',
|
||||
'Partir de una idea',
|
||||
],
|
||||
[
|
||||
'Consultar oportunidades',
|
||||
'Browse opportunities',
|
||||
'Consulter les opportunités',
|
||||
'Consultar oportunidades',
|
||||
],
|
||||
[
|
||||
'Simulador Fiscal',
|
||||
'Tax simulator',
|
||||
'Simulateur fiscal',
|
||||
'Simulador fiscal',
|
||||
],
|
||||
[
|
||||
'Oportunidades de investimento',
|
||||
|
||||
@@ -30,7 +30,7 @@ const names: Record<string, string> = {
|
||||
'/contacto': 'Contacto',
|
||||
'/politica-de-privacidade': 'Política de Privacidade',
|
||||
'/termos-de-uso': 'Termos de Uso',
|
||||
'/porque-investir': 'Porquê investir em Moçambique',
|
||||
'/porque-investir': 'Porquê investir em Moçambique?',
|
||||
'/investimentos/iniciar': 'Iniciar ou continuar investimento',
|
||||
'/explorar/agronegocio': 'Explorar agronegócio',
|
||||
'/agronegocio': 'Artigo de agronegócio',
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
import {normalBook,normalCurrent} from './irpc-normal.ts';
|
||||
import {irpcBook,irpcCurrent} from './irpc-withholdings.ts';
|
||||
import {acquisitionScope} from './iva-acquisitions.ts';
|
||||
import {closureFingerprint} from './iva-closure.ts';
|
||||
import {addFractions,subtractFractions,decimalFraction,fraction,fractionPresentation,type FiscalFraction} from './fiscal-rational.ts';
|
||||
|
||||
export const annualSettlementVersion='IRPC-annual-settlement/1';
|
||||
export const annualSettlementSource='CIRPC, arts. 63 e 67 (Lei 34/2007 e natureza da retenção na redacção aplicável da Lei 12/2025); Regulamento, Decreto 9/2008, arts. 21(2–5) e 27(1–2/6). Recorte: 2026, residente no regime geral, ano civil e MZN. Colecta corrente válida, retenções efectivamente sofridas por conta e PPC comprovados. PEC/créditos positivos e tributação autónoma ficam fora deste fecho inicial. Art. 27(6): montante inferior a 100 MZN sem cobrança/reembolso; saldo aritmético exacto conservado. Saldo simulado por colecta projectada; não é declaração submetida, pagamento ou reembolso recebido.';
|
||||
type State=''|'known'|'absent';
|
||||
type Evidence={state:State;amount:string;reference:string};
|
||||
type Group={state:State;reference:string};
|
||||
export type AnnualWithholding={id:string;rowId:string;paymentId:string;sourceKey:string;subjectNuit:string;year:string;amount:string;incomeIncluded:''|'yes'|'no';reference:string};
|
||||
export type AnnualPpc={id:string;document:string;issuer:string;date:string;subjectNuit:string;year:string;currency:string;proofAmount:string;amount:string;effective:''|'yes'|'no';reference:string};
|
||||
type AnnualRecord={version:typeof annualSettlementVersion;key:string;createdAt:string;model:AnnualModel};
|
||||
export type AnnualBook={version:1;subjectNuit:string;year:string;reference:string;assessment:''|'normal'|'special';assessmentKey:string;assessmentReference:string;withholdings:Group&{rows:AnnualWithholding[]};ppc:Group&{rows:AnnualPpc[]};pec:Evidence;credits:Evidence;result?:AnnualRecord;history:AnnualRecord[]};
|
||||
const evidence=():Evidence=>({state:'',amount:'',reference:''});
|
||||
export const newAnnualBook=():AnnualBook=>({version:1,subjectNuit:'',year:'',reference:'',assessment:'',assessmentKey:'',assessmentReference:'',withholdings:{state:'',reference:'',rows:[]},ppc:{state:'',reference:'',rows:[]},pec:evidence(),credits:evidence(),history:[]});
|
||||
export const newAnnualPpc=(id:string):AnnualPpc=>({id,document:'',issuer:'',date:'',subjectNuit:'',year:'',currency:'MZN',proofAmount:'',amount:'',effective:'',reference:''});
|
||||
const zero=()=>fraction(0n),cmp=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator);
|
||||
const iso=(s:string)=>/^20\d{2}-\d{2}-\d{2}$/.test(s)&&Number.isFinite(Date.parse(s))&&new Date(s).toISOString().slice(0,10)===s;
|
||||
const moneyInput=(s:string)=>{if(!/^\d{1,18}(\.\d{1,2})?$/.test(s))throw Error('MontanteMZN em falta/inválido;máximo dois decimais,sem zero presumido.');return decimalFraction(s);};
|
||||
const canonical=(s:string)=>s.normalize('NFKC').trim().toLocaleLowerCase('pt').replace(/\s+/g,' ');
|
||||
const proofIdentity=(issuer:string,document:string,_date:string)=>JSON.stringify([canonical(issuer),canonical(document)]);
|
||||
function store(d:Record<string,unknown>){const s=JSON.parse(String(d.modelo_a_snapshot||'{"version":1,"books":{}}'));if(s.version!==1||!s.books||typeof s.books!=='object'||Array.isArray(s.books))throw Error('Livros fiscais não recuperáveis;originais conservados.');return s;}
|
||||
function books(d:Record<string,unknown>):Record<string,AnnualBook>{const m=store(d).irpcAnnual;if(m===undefined)return{};if(!m||typeof m!=='object'||Array.isArray(m))throw Error('MapaL8 não recuperável;originais conservados.');return m;}
|
||||
export function validateAnnual(b:AnnualBook){
|
||||
if(!b||b.version!==1||['subjectNuit','year','reference','assessmentKey','assessmentReference'].some(k=>typeof b[k as 'year']!=='string')||!['','normal','special'].includes(b.assessment)||!Array.isArray(b.history))throw Error('PreparaçãoL8 não recuperável.');
|
||||
for(const g of[b.withholdings,b.ppc,b.pec,b.credits])if(!g||!['','known','absent'].includes(g.state)||typeof g.reference!=='string')throw Error('EstadoL8 não recuperável.');
|
||||
for(const g of[b.pec,b.credits])if(typeof g.amount!=='string')throw Error('CréditoL8 não recuperável.');
|
||||
const w=['id','rowId','paymentId','sourceKey','subjectNuit','year','amount','incomeIncluded','reference'],p=Object.keys(newAnnualPpc(''));
|
||||
for(const[rows,keys]of[[b.withholdings.rows,w],[b.ppc.rows,p]]as const)if(!Array.isArray(rows)||new Set(rows.map(r=>r?.id)).size!==rows.length||rows.some(r=>!r||keys.some(k=>typeof(r as unknown as Record<string,unknown>)[k]!=='string')))throw Error('ComprovativosL8 não recuperáveis ou identificador repetido.');
|
||||
if(b.withholdings.rows.some(r=>!['','yes','no'].includes(r.incomeIncluded))||b.ppc.rows.some(r=>!['','yes','no'].includes(r.effective)))throw Error('QualificaçãoL8 não recuperável.');
|
||||
for(const r of[b.result,...b.history])if(r&&(r.version!==annualSettlementVersion||typeof r.key!=='string'||typeof r.createdAt!=='string'||!r.model||!Array.isArray(r.model.pending)))throw Error('HistóricoL8 não recuperável.');
|
||||
}
|
||||
export function annualBook(d:Record<string,unknown>){const b=books(d)[acquisitionScope(d)];if(b)validateAnnual(b);return b;}
|
||||
export function saveAnnualBook(d:Record<string,unknown>,b:AnnualBook){validateAnnual(b);return JSON.stringify({...store(d),irpcAnnual:{...books(d),[acquisitionScope(d)]:b}});}
|
||||
export function annualAssessment(d:Record<string,unknown>){
|
||||
const b=normalBook(d),r=b.result,m=r?.model;
|
||||
return{book:b,record:r,current:normalCurrent(d,b),key:r?closureFingerprint(r):'',subjectNuit:b.base?.subjectNuit??'',year:b.year,period:m?.periodsFx?{from:m.periodsFx.input.from,to:m.periodsFx.input.to}:m?.fiscalPeriod??m?.assessment?.period??null,kind:b.special?'special' as const:'normal' as const,colecta:b.special?m?.special?.colecta??null:m?.colecta??null,autonomous:b.special?m?.special?.expenses.autonomousTax??null:zero()};
|
||||
}
|
||||
export function reuseAnnualAssessment(d:Record<string,unknown>,b:AnnualBook):AnnualBook{const a=annualAssessment(d);return{...b,subjectNuit:b.subjectNuit||a.subjectNuit,year:b.year||a.year,assessment:a.kind,assessmentKey:a.key,assessmentReference:b.assessmentReference||a.book.assessment?.reference||''};}
|
||||
export function annualWithholdingOptions(d:Record<string,unknown>){
|
||||
const b=irpcBook(d),current=irpcCurrent(d,b);return b.rows.flatMap(r=>r.allocations.map(a=>{
|
||||
const p=b.payments.find(p=>p.id===a.paymentId),v=b.result?.rows.find(v=>v.id===r.id),issues:string[]=[];
|
||||
if(!current||!b.result)issues.push('Recalcule e guardeL5 com as entradas actuais.');
|
||||
if(r.direction!=='received'||r.origin!=='effective'||v?.direction!=='received'||v.status!=='calculated'||v.nature!=='on_account'||r.settlement!=='complete'||v.settled===null)issues.push('Apenas retenção recebida/efectiva por conta,calculada e reconciliada emL5;remessa por terceiros,definitiva ou projecção não é crédito próprio.');
|
||||
if(!p||p.kind!=='withholding_proof'||p.currency!=='MZN'||r.currency!=='MZN'||!iso(p.date)||!p.reference.trim())issues.push('Comprovativo de retenção sofrida emMZN em falta ou fora do recorte.');
|
||||
return{rowId:r.id,paymentId:a.paymentId,document:p?.reference??'',issuer:r.counterparty,date:p?.date??'',eventDate:v?.eventDate??'',year:v?.eventDate.slice(0,4)??'',amount:a.amount,proofAmount:p?.amount??'',identity:proofIdentity(r.counterparty,p?.reference??'',p?.date??''),key:closureFingerprint([r,v,p,a]),ready:!issues.length,reason:issues.join(' ')};
|
||||
}));
|
||||
}
|
||||
export function reuseAnnualWithholding(d:Record<string,unknown>,b:AnnualBook,rowId:string,paymentId:string,id:string):AnnualBook{
|
||||
const o=annualWithholdingOptions(d).find(o=>o.rowId===rowId&&o.paymentId===paymentId);if(!o)throw Error('ComprovativoL5 não encontrado;originais conservados.');
|
||||
if(b.withholdings.rows.some(r=>r.rowId===rowId&&r.paymentId===paymentId))throw Error('Retenção/prova já seleccionada;altere a parcela existente sem duplicar.');
|
||||
return{...b,withholdings:{...b.withholdings,rows:[...b.withholdings.rows,{id,rowId,paymentId,sourceKey:o.key,subjectNuit:b.subjectNuit,year:o.year,amount:o.amount,incomeIncluded:'',reference:''}]}};
|
||||
}
|
||||
function dependencies(d:Record<string,unknown>){let normal:unknown,L5:unknown;try{const a=annualAssessment(d);normal=[a.record,a.current];}catch(e){normal=String(e);}try{const b=irpcBook(d);L5=[b.rows,b.payments,b.result,irpcCurrent(d,b)];}catch(e){L5=String(e);}return[normal,L5,Object.entries(books(d)).filter(([k])=>k!==acquisitionScope(d)).map(([k,b])=>[k,b.subjectNuit,b.year,b.withholdings,b.ppc])];}
|
||||
function key(d:Record<string,unknown>,b:AnnualBook){const{result:_,history:__,...input}=b;return closureFingerprint([annualSettlementVersion,acquisitionScope(d),input,dependencies(d)]);}
|
||||
export function annualCurrent(d:Record<string,unknown>,b:AnnualBook){return !!b.result&&b.result.key===key(d,b);}
|
||||
export function calculateAnnual(d:Record<string,unknown>,b:AnnualBook){
|
||||
validateAnnual(b);const{result:_result,history:_history,...input}=b;const pending:string[]=[],warn:string[]=[];let assessment:ReturnType<typeof annualAssessment>|null=null,colecta:FiscalFraction|null=null;let options:ReturnType<typeof annualWithholdingOptions>=[];
|
||||
try{assessment=annualAssessment(d);const a=assessment,m=a.record?.model;
|
||||
if(!a.record||!a.current||a.key!==b.assessmentKey||b.assessment!==a.kind)pending.push('Colecta de origem ausente,alterada ou não corrente;reutilize a execuçãoL6/L7 aplicável,não some nem contorne efeitosL7.');
|
||||
if(!/^\d{9}$/.test(b.subjectNuit)||b.subjectNuit!==a.subjectNuit||b.year!=='2026'||b.year!==a.year||a.book.scope!=='resident_general'||m?.currency!=='MZN'||a.period?.from!=='2026-01-01'||a.period?.to!=='2026-12-31')pending.push('Entidade/NUIT,exercício ou âmbito fora do recorte residente/ano civil2026/MZN;períodos especiais permanecem separados.');
|
||||
if(!b.reference.trim()||!b.assessmentReference.trim())pending.push('Falta suporte do fecho do sujeito/exercício e da colecta seleccionada.');
|
||||
if(!a.colecta||cmp(a.colecta,zero())<0n)pending.push('Colecta aplicável indeterminada;uma parcelaL6 não substitui totalL7 pendente.');else colecta=structuredClone(a.colecta);
|
||||
if(a.kind==='special'&&(!m?.special||!a.autonomous||cmp(a.autonomous,zero())!==0n))pending.push('Tributação autónoma positiva/indeterminada exige liquidação própria;este primeiro saldo não a ignora nem a compensa.');
|
||||
}catch(e){pending.push('Origem da colecta não recuperável: '+String(e));}
|
||||
try{options=annualWithholdingOptions(d);}catch(e){if(b.withholdings.state==='known'||b.withholdings.rows.length)pending.push('OrigemL5 não recuperável: '+String(e));}
|
||||
const group=(g:Group,rows:unknown[],label:string)=>{if(!g.state||!g.reference.trim())pending.push(label+':identifique valor conhecido,ausência declarada ou informação em falta com suporte.');if(g.state==='absent'&&rows.length)pending.push(label+':ausência declarada contradiz parcelas presentes;conserve e reconcilie.');if(g.state==='known'&&!rows.length)pending.push(label+':não há comprovativos seleccionados;ausência exige declaração própria.');};
|
||||
group(b.withholdings,b.withholdings.rows,'Retenções sofridas por conta');group(b.ppc,b.ppc.rows,'PPC efectuados');
|
||||
try{if(b.withholdings.state==='absent'&&options.some(o=>o.ready&&o.year===b.year&&cmp(moneyInput(o.amount),zero())>0n))pending.push('Ausência de retenções sofridas contradiz provaL5 efectiva por conta no exercício;reconcilie sem a ignorar.');}catch(e){pending.push('Reconciliação da ausência de retenções: '+String(e));}
|
||||
for(const[label,e]of[['PEC',b.pec],['Créditos com regras próprias',b.credits]]as const){try{if(!e.state||!e.reference.trim())throw Error('presença/ausência e suporte em falta');if(e.state==='absent'){if(e.amount.trim())throw Error('ausência contradiz montante preenchido');}else if(cmp(moneyInput(e.amount),zero())!==0n)throw Error('montante positivo fora deste recorte:corresponder ordem,limite e transporte próprios;sem abatimento ou reembolso automático');}catch(err){pending.push(label+': '+String(err));}}
|
||||
const claims:Array<{id:string;kind:'withholding'|'ppc';identity:string;proofAmount:FiscalFraction|null;value:FiscalFraction|null;sourceKey:string;allocationAmount:FiscalFraction|null;document:string;issuer:string;date:string;subjectNuit:string;year:string;reason:string}>=[];
|
||||
for(const r of b.withholdings.rows){const o=options.find(o=>o.rowId===r.rowId&&o.paymentId===r.paymentId),issues:string[]=[];let value:FiscalFraction|null=null,proofAmount:FiscalFraction|null=null;
|
||||
try{if(!o||!o.ready||r.sourceKey!==o.key)throw Error(o?.reason||'provaL5 ausente ou alterada;reutilize sem duplicar');if(r.subjectNuit!==b.subjectNuit||r.year!==b.year||o.year!==b.year||!o.date.startsWith(b.year+'-'))throw Error('entidade/exercício da retenção não correspondem ao fecho');if(r.incomeIncluded!=='yes'||!r.reference.trim())throw Error('confirme o próprio beneficiário/NUIT e inclusão do rendimento na base do exercício com suporte');value=moneyInput(r.amount);proofAmount=moneyInput(o.proofAmount);if(cmp(value,moneyInput(o.amount))>0n)throw Error('parcela ultrapassa a retenção efectivamente comprovada e afectada emL5');if(b.withholdings.rows.filter(x=>x.rowId===r.rowId&&x.paymentId===r.paymentId).length!==1)throw Error('retenção/prova repetida;uma afectação por linhaL5');if(assessment?.record?.model.special?.cooperative.status==='calculated'&&cmp(value,zero())>0n)throw Error('cooperativa integralmente elegível declara ausência de rendimentos retidos;segregue o casoL7 antes do crédito anual');}catch(e){issues.push(String(e));value=null;}
|
||||
claims.push({id:r.id,kind:'withholding',identity:o?.identity??'',proofAmount,value,sourceKey:r.sourceKey,allocationAmount:o&&value?moneyInput(o.amount):null,document:o?.document??r.paymentId,issuer:o?.issuer??'',date:o?.date??'',subjectNuit:r.subjectNuit,year:r.year,reason:issues.join(' ')});
|
||||
}
|
||||
for(const r of b.ppc.rows){const issues:string[]=[];let value:FiscalFraction|null=null,proofAmount:FiscalFraction|null=null;
|
||||
try{if(!r.document.trim()||!r.issuer.trim()||!r.reference.trim()||r.effective!=='yes'||r.currency!=='MZN'||!iso(r.date)||!r.date.startsWith(b.year+'-')||r.subjectNuit!==b.subjectNuit||r.year!==b.year)throw Error('PPC exige comprovativo efectivo,MZN,data,entidade e exercício correspondentes;projecção/tesouraria não é pagamento');value=moneyInput(r.amount);proofAmount=moneyInput(r.proofAmount);if(cmp(value,proofAmount)>0n)throw Error('parcelaPPC ultrapassa o montante comprovado');}catch(e){issues.push(String(e));value=null;}
|
||||
claims.push({id:r.id,kind:'ppc',identity:proofIdentity(r.issuer,r.document,r.date),proofAmount,value,sourceKey:'',allocationAmount:null,document:r.document,issuer:r.issuer,date:r.date,subjectNuit:r.subjectNuit,year:r.year,reason:issues.join(' ')});
|
||||
}
|
||||
const elsewhere:Array<{identity:string;subjectNuit:string;year:string;value:FiscalFraction;proofAmount:FiscalFraction;sourceKey:string}>=[];
|
||||
for(const[scope,other]of Object.entries(books(d))){if(scope===acquisitionScope(d))continue;try{validateAnnual(other);for(const r of other.ppc.rows)elsewhere.push({identity:proofIdentity(r.issuer,r.document,r.date),subjectNuit:r.subjectNuit,year:r.year,value:moneyInput(r.amount),proofAmount:moneyInput(r.proofAmount),sourceKey:''});for(const r of other.withholdings.rows){const source=(store(d).irpcWithholdings??{})[scope];const row=source?.rows?.find((x:{id:string})=>x.id===r.rowId),p=source?.payments?.find((x:{id:string})=>x.id===r.paymentId);if(row&&p)elsewhere.push({identity:proofIdentity(row.counterparty,p.reference,p.date),subjectNuit:r.subjectNuit,year:r.year,value:moneyInput(r.amount),proofAmount:moneyInput(p.amount),sourceKey:r.sourceKey});}}catch(e){if(other?.subjectNuit===b.subjectNuit)pending.push('Outro mapa da mesma entidade não recuperável para conferir duplicações: '+scope+';'+String(e));}}
|
||||
for(const c of claims){if(!c.value||!c.proofAmount)continue;const same=claims.filter(x=>x.identity===c.identity&&x.value),other=elsewhere.filter(x=>x.identity===c.identity);let issue='';
|
||||
if(same.filter(x=>x.kind==='ppc').length>1||new Set(same.map(x=>x.kind)).size>1)issue='Mesmo comprovativo repetido ou usado como retenção ePPC;reconcilie sem dedução dupla.';
|
||||
if(other.some(x=>x.subjectNuit!==b.subjectNuit||x.year!==b.year))issue='Mesmo comprovativo já associado a outra entidade/exercício;reconcilie a titularidade e a afectação.';
|
||||
if([...same,...other].some(x=>x.proofAmount&&cmp(x.proofAmount,c.proofAmount!)!==0n)||cmp(addFractions([...same.flatMap(x=>x.value?[x.value]:[]),...other.map(x=>x.value)]),c.proofAmount)>0n)issue='Comprovativo utilizado além do montante disponível ou com montantes divergentes neste/outro mapa.';
|
||||
if(c.kind==='withholding'&&c.sourceKey&&c.allocationAmount&&cmp(addFractions([...same.filter(x=>x.sourceKey===c.sourceKey).flatMap(x=>x.value?[x.value]:[]),...other.filter(x=>x.sourceKey===c.sourceKey).map(x=>x.value)]),c.allocationAmount)>0n)issue='Mesma afectação L5 reutilizada além da parcela disponível, ainda que o comprovativo global seja maior.';
|
||||
if(issue)c.reason=[c.reason,issue].filter(Boolean).join(' ');
|
||||
}
|
||||
for(const c of claims)if(c.reason)pending.push((c.document||c.id)+': '+c.reason);
|
||||
const knownWithholdings=addFractions(claims.filter(c=>c.kind==='withholding'&&!c.reason&&c.value).map(c=>c.value!)),knownPpc=addFractions(claims.filter(c=>c.kind==='ppc'&&!c.reason&&c.value).map(c=>c.value!));
|
||||
const ready=pending.length===0&&colecta!==null,arithmeticBalance=ready?subtractFractions(subtractFractions(colecta!,knownWithholdings),knownPpc):null;
|
||||
let payable:FiscalFraction|null=null,recoverable:FiscalFraction|null=null,belowMinimum:FiscalFraction|null=null;let status:'payable'|'recoverable'|'balanced'|'below_minimum'|'indeterminate'='indeterminate';
|
||||
if(arithmeticBalance){const n=BigInt(arithmeticBalance.numerator),abs=fraction(n<0n?-n:n,BigInt(arithmeticBalance.denominator));payable=zero();recoverable=zero();belowMinimum=zero();if(!n)status='balanced';else if(cmp(abs,fraction(100n))<0n){status='below_minimum';belowMinimum=abs;warn.push('Art27(6):saldo inferior a100MZN,sem cobrança/reembolso neste recorte;aritmética conservada,não é transporte de crédito.');}else if(n>0n){status='payable';payable=abs;}else{status='recoverable';recoverable=abs;}}
|
||||
return{version:annualSettlementVersion,input:structuredClone(input),subjectNuit:b.subjectNuit,year:b.year,assessment:assessment?.record?{key:b.assessmentKey,kind:b.assessment,version:assessment.record.model.version,createdAt:assessment.record.createdAt,colecta,period:assessment.period,origin:assessment.record.model.origin}:null,claims,knownWithholdings,knownPpc,arithmeticBalance,payable,recoverable,belowMinimum,status,pending:[...new Set(pending)],warnings:warn,source:annualSettlementSource,officialBalancesConsumed:false,submitted:false,refundReceived:false,limitations:['L8 parcial:PEC e créditos positivos,tributação autónoma,períodos especiais e pagamentos noutra moeda exigem regras próprias.','PPC aqui é pagamento comprovado;não cálculo automático da obrigação ou calendário.','Retenção sofrida não é retenção entregue pela empresa por conta de terceiros.','Valores racionais exactos;camposM20/M22 e representação não presumidos.','Saldo simulado por colecta projectada;sem pagamento,submissão ou reembolso automático.']};
|
||||
}
|
||||
export type AnnualModel=ReturnType<typeof calculateAnnual>;
|
||||
export function recordAnnual(d:Record<string,unknown>,b:AnnualBook,now=new Date().toISOString()):AnnualBook{return{...b,history:b.result?[...b.history,structuredClone(b.result)]:b.history,result:{version:annualSettlementVersion,key:key(d,b),createdAt:now,model:calculateAnnual(d,b)}};}
|
||||
const show=(v:FiscalFraction|null)=>v?(fractionPresentation(v).approximate?'≈':'')+fractionPresentation(v).decimal+' MZN (exacto '+v.numerator+'/'+v.denominator+')':'Indeterminado';
|
||||
const stateLabel=(s:State)=>s==='known'?'Valor conhecido':s==='absent'?'Ausência declarada':'Informação em falta';
|
||||
export function annualReportRows(d:Record<string,unknown>):Array<[string,string,string,string]>{
|
||||
try{
|
||||
const b=annualBook(d),r=b?.result;if(!b||!r)return[];const m=r.model;
|
||||
const status={payable:'A pagar',recoverable:'A recuperar',balanced:'Saldo zero',below_minimum:'Inferior ao mínimo de cobrança/reembolso',indeterminate:'Indeterminado'}[m.status];
|
||||
return[
|
||||
['IRPC — L8','Fecho anual — âmbito e origem',
|
||||
'NUIT: '+m.subjectNuit+'; exercício: '+m.year+'; colecta: '+show(m.assessment?.colecta??null)+'; origem: '+(m.assessment?.kind==='special'?'L7 qualificado':'L6 normal')+'. '+(annualCurrent(d,b)?'Entradas correspondentes.':'Histórico; origem/entradas alteradas: recalcule o saldo corrente.')+' Saldo simulado, não liquidação submetida.',
|
||||
m.input.reference+'; '+m.input.assessmentReference+'; '+m.source],
|
||||
...m.claims.map(c=>[
|
||||
'IRPC — L8',(c.kind==='withholding'?'Retenção sofrida':'PPC')+' — '+(c.document||c.id),
|
||||
'Entidade: '+c.subjectNuit+'; exercício: '+c.year+'; emitente: '+c.issuer+'; data: '+c.date+'; comprovado: '+show(c.proofAmount)+'; parcela: '+(c.reason?'Indeterminado':show(c.value))+'. '+(c.reason||'Reconciliada sem utilização duplicada.'),
|
||||
c.kind==='withholding'?m.input.withholdings.reference+'; '+(m.input.withholdings.rows.find(r=>r.id===c.id)?.reference??''):m.input.ppc.reference+'; '+(m.input.ppc.rows.find(r=>r.id===c.id)?.reference??'')
|
||||
]as[string,string,string,string]),
|
||||
['IRPC — L8','Saldo anual simulado',
|
||||
'Estado: '+status+'. Retenções conhecidas: '+show(m.knownWithholdings)+'; PPC conhecidos: '+show(m.knownPpc)+'; saldo aritmético: '+show(m.arithmeticBalance)+'; a pagar: '+show(m.payable)+'; a recuperar: '+show(m.recoverable)+'. '+m.pending.join(' | ')+' '+m.warnings.join(' '),m.source],
|
||||
['IRPC — L8','Estados dos comprovativos',
|
||||
'Retenções sofridas: '+stateLabel(m.input.withholdings.state)+'; PPC: '+stateLabel(m.input.ppc.state)+'. Subtotais conhecidos não substituem informação em falta.',m.input.withholdings.reference+'; '+m.input.ppc.reference],
|
||||
['IRPC — L8','PEC e créditos separados',
|
||||
'PEC: '+stateLabel(m.input.pec.state)+'; montante declarado: '+(m.input.pec.amount||'Não preenchido')+'; créditos: '+stateLabel(m.input.credits.state)+'; montante declarado: '+(m.input.credits.amount||'Não preenchido')+'. Sem dedução, transporte ou reembolso presumidos. '+m.limitations.join(' '),m.input.pec.reference+'; '+m.input.credits.reference]
|
||||
];
|
||||
}catch(e){return[['IRPC — L8','Não recuperável',String(e),'Originais e históricos conservados.']];}
|
||||
}
|
||||
export function annualHtml(d:Record<string,unknown>){const b=annualBook(d);if(!b?.result||!annualCurrent(d,b))throw Error('Calcule e guardeL8 com as fontes actuais antes de exportar.');const esc=(s:string)=>s.replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]!));return'<!doctype html><html lang="pt"><meta charset="utf-8"><title>IRPC — L8 saldo anual simulado</title><h1>IRPC — colecta e saldo anual simulado</h1><p>Não é declaração submetida,pagamento efectuado ou reembolso recebido.</p>'+annualReportRows(d).map(r=>'<section><h2>'+esc(r[1])+'</h2><p>'+esc(r[2])+'</p><small>'+esc(r[3])+'</small></section>').join('')+'</html>';}
|
||||
@@ -5,7 +5,7 @@ export type NormalAssessmentInput={version:1;treatment:''|'general_61_1'|'other'
|
||||
export const newNormalAssessmentInput=():NormalAssessmentInput=>({version:1,treatment:'',reference:''});
|
||||
export function validateNormalAssessment(i:NormalAssessmentInput){if(!i||i.version!==1||!['','general_61_1','other'].includes(i.treatment)||typeof i.reference!=='string')throw Error('Enquadramento da colecta não recuperável;original conservado.');}
|
||||
export type NormalAssessmentModel={input:NormalAssessmentInput;period:{year:string;from:string;to:string};classification:string;rate:FiscalFraction|null;taxableBase:FiscalFraction|null;colecta:FiscalFraction|null;centExact:boolean|null;pending:string[];rule:string;source:string;finalBalance:{scope:'L8';status:'not_calculated';payable:null;recoverable:null;reason:string}};
|
||||
export function calculateNormalAssessment(input:NormalAssessmentInput,base:FiscalFraction|null,context:{year:string;scope:string;currency:string;extended?:boolean;period?:{from:string;to:string}}):NormalAssessmentModel{
|
||||
export function calculateNormalAssessment(input:NormalAssessmentInput,base:FiscalFraction|null,context:{year:string;scope:string;currency:string;extended?:boolean;short?:boolean;period?:{from:string;to:string}}):NormalAssessmentModel{
|
||||
validateNormalAssessment(input);const pending:string[]=[],period={year:context.year,from:/^20\d{2}$/.test(context.year)?context.year+'-01-01':'',to:/^20\d{2}$/.test(context.year)?context.year+'-12-31':''};
|
||||
if(context.year!=='2026')pending.push('Taxa geral correspondida neste incremento apenas ao exercício2026;sem taxa transportada para outro período.');
|
||||
if(!(context.scope==='resident_general'||context.extended&&context.scope==='ep_general')||context.currency!=='MZN')pending.push('Colecta delimitada ao sujeito residente no regime geral emMZN;outros âmbitos por corresponder.');
|
||||
@@ -13,8 +13,8 @@ export function calculateNormalAssessment(input:NormalAssessmentInput,base:Fisca
|
||||
if(!input.reference.trim())pending.push('Identifique suporte ou pressuposto da aplicação da taxa geral ao caso;uma actividade semelhante não prova o regime.');
|
||||
if(base===null)pending.push('Matéria colectável actual indeterminada;lucro tributável não é substituto da base.');
|
||||
else if(!/^-?\d{1,80}$/.test(base.numerator)||!/^\d{1,80}$/.test(base.denominator)||BigInt(base.denominator)===0n||BigInt(base.numerator)<0n)pending.push('Matéria colectável deve ser um valor conhecido não negativo e reconciliado.');
|
||||
if(context.period){period.from=context.period.from;period.to=context.period.to;const start=new Date(period.from+'T00:00:00Z'),end=new Date(period.to+'T00:00:00Z');if(!Number.isFinite(+start)||!Number.isFinite(+end)||start.toISOString().slice(0,10)!==period.from||end.toISOString().slice(0,10)!==period.to||!period.from.endsWith('-01')||!period.to.startsWith('2026-'))pending.push('Período fiscal anual não reconciliado.');else{start.setUTCFullYear(start.getUTCFullYear()+1);start.setUTCDate(start.getUTCDate()-1);if(start.toISOString().slice(0,10)!==period.to)pending.push('Colecta anual: período de12 meses por reconciliar.');}}
|
||||
if(context.period){period.from=context.period.from;period.to=context.period.to;const start=new Date(period.from+'T00:00:00Z'),end=new Date(period.to+'T00:00:00Z');if(!Number.isFinite(+start)||!Number.isFinite(+end)||start.toISOString().slice(0,10)!==period.from||end.toISOString().slice(0,10)!==period.to||!period.from.endsWith('-01')||!period.to.startsWith('2026-'))pending.push('Período fiscal anual não reconciliado.');else if(context.short){if(period.from>period.to||!period.from.startsWith('2026-')||period.from===context.year+'-01-01'&&period.to===context.year+'-12-31')pending.push('Período curto por reconciliar.');}else{start.setUTCFullYear(start.getUTCFullYear()+1);start.setUTCDate(start.getUTCDate()-1);if(start.toISOString().slice(0,10)!==period.to)pending.push('Colecta anual: período de12 meses por reconciliar.');}}
|
||||
const rate=input.treatment==='general_61_1'&&context.year==='2026'?fraction(32n):null;
|
||||
const colecta=pending.length===0&&base!==null&&rate?fraction(BigInt(base.numerator)*32n,BigInt(base.denominator)*100n):null;
|
||||
return{input:structuredClone(input),period,classification:input.treatment==='general_61_1'?'Regime normal — taxa geral do artigo61(1)':input.treatment==='other'?'Caso especial fora deste recorte':'Enquadramento por identificar',rate,taxableBase:base,colecta,centExact:colecta?(BigInt(colecta.numerator)*100n)%BigInt(colecta.denominator)===0n:null,pending,rule:'CIRPC61(1)-general-2026/1',source:context.extended?'CIRPC61(1), taxa geral32% mantida pelos diplomas inventariados até Lei12/2025; período anual documentado com termo em2026. CIRPC15(1)a/c,7(1–3): sujeito residente ou resultado imputável aEP no regime geral; ano civil, autorização ou comunicação expressamente identificadas. Sem arredondamento fiscal ou saldoL8 presumidos.':'CIRPC Lei34/2007 art61(1),PDF17/p768(71):taxa geral32%. Lei4/2012 altera61(2);Lei20/2022 PDF1/p2731 mantém61(1),altera61(2) com termo31/12/2025;Lei12/2025 PDF18/20 não altera61(1),adita61-A para mais-valias,fora deste recorte. Exercício anual2026/MZN/residente geral,matéria colectável actual×32/100 em aritmética racional exacta. Sem arredondamento fiscal ou transcriçãoM20/M22 presumidos.',finalBalance:{scope:'L8',status:'not_calculated',payable:null,recoverable:null,reason:'Saldo final a pagar ou recuperar por determinar emL8:retenções,pagamentos e créditos do fecho anual não apurados nem abatidos à colecta neste incremento. Colecta não equivale ao saldo final.'}};
|
||||
return{input:structuredClone(input),period,classification:input.treatment==='general_61_1'?'Regime normal — taxa geral do artigo61(1)':input.treatment==='other'?'Caso especial fora deste recorte':'Enquadramento por identificar',rate,taxableBase:base,colecta,centExact:colecta?(BigInt(colecta.numerator)*100n)%BigInt(colecta.denominator)===0n:null,pending,rule:'CIRPC61(1)-general-2026/1',source:context.short?'CIRPC7(4)/61(1):período curto documentado em2026,matéria colectável efectiva ×32%;sem anualizar lucro/base ou proporcionalizar a taxa;saldo finalL8 indeterminado.':context.extended?'CIRPC61(1), taxa geral32% mantida pelos diplomas inventariados até Lei12/2025; período anual documentado com termo em2026. CIRPC15(1)a/c,7(1–3): sujeito residente ou resultado imputável aEP no regime geral; ano civil, autorização ou comunicação expressamente identificadas. Sem arredondamento fiscal ou saldoL8 presumidos.':'CIRPC Lei34/2007 art61(1),PDF17/p768(71):taxa geral32%. Lei4/2012 altera61(2);Lei20/2022 PDF1/p2731 mantém61(1),altera61(2) com termo31/12/2025;Lei12/2025 PDF18/20 não altera61(1),adita61-A para mais-valias,fora deste recorte. Exercício anual2026/MZN/residente geral,matéria colectável actual×32/100 em aritmética racional exacta. Sem arredondamento fiscal ou transcriçãoM20/M22 presumidos.',finalBalance:{scope:'L8',status:'not_calculated',payable:null,recoverable:null,reason:'Saldo final a pagar ou recuperar por determinar emL8:retenções,pagamentos e créditos do fecho anual não apurados nem abatidos à colecta neste incremento. Colecta não equivale ao saldo final.'}};
|
||||
}
|
||||
|
||||
@@ -15,13 +15,13 @@ export type NormalBaseModel={input:NormalBaseInput;taxableProfit:FiscalFraction|
|
||||
const zero=()=>fraction(0n);
|
||||
function amount(s:string){if(!/^\d{1,18}(?:\.\d{1,2})?$/.test(s))throw Error();return decimalFraction(s);}
|
||||
const units=(f:FiscalFraction)=>BigInt(f.numerator)*100n/BigInt(f.denominator);
|
||||
export function calculateNormalBase(input:NormalBaseInput,profit:FiscalFraction|null,year:string,currentLossReference?:string):NormalBaseModel{
|
||||
export function calculateNormalBase(input:NormalBaseInput,profit:FiscalFraction|null,year:string,currentLossReference?:string,short=false):NormalBaseModel{
|
||||
validateNormalBase(input);const i=structuredClone(input),pending:string[]=[],losses:NormalBaseModel['losses']=[];
|
||||
if(year!=='2026')pending.push('Matéria colectável delimitada ao exercício2026.');
|
||||
if(!/^\d{9}$/.test(i.subjectNuit)||!i.identityReference.trim())pending.push('Identifique NUIT e suporte do sujeito passivo do lucro e das perdas.');
|
||||
if(i.method!=='direct'||!i.methodReference.trim())pending.push('Método declarativo/directo e suporte por identificar;apuramento indirecto fora deste recorte (15(2),41(2)).');
|
||||
if(!profit)pending.push('Lucro tributável actual indeterminado;nenhuma dedução transforma informação em falta em zero.');
|
||||
else if(units(profit)<0n&&!currentLossReference?.trim())pending.push('Resultado fiscal negativo conhecido;tratamento da perda do próprio exercício fora deste recorte,sem matéria colectável zero ou reporte automático.');
|
||||
else if(BigInt(profit.numerator)<0n&&!currentLossReference?.trim())pending.push('Resultado fiscal negativo conhecido;tratamento da perda do próprio exercício fora deste recorte,sem matéria colectável zero ou reporte automático.');
|
||||
if(!i.lossesState||!i.lossesReference.trim())pending.push('Situação e completude das perdas anteriores em falta;sem ausência presumida.');
|
||||
if(i.lossesState==='absent'&&i.losses.length)pending.push('Ausência declarada de perdas contradiz os registos existentes;reconcilie sem apagar histórico.');
|
||||
if(i.lossesState==='known'&&!i.losses.length)pending.push('Perdas declaradas conhecidas sem discriminação por exercício.');
|
||||
@@ -45,13 +45,14 @@ export function calculateNormalBase(input:NormalBaseInput,profit:FiscalFraction|
|
||||
if(issues.length){r.status='indeterminate';r.reason=issues.join(' ');pending.push(l.year+': '+r.reason);}
|
||||
losses.push(r);
|
||||
}
|
||||
if(short&&losses.some(l=>l.requestedAmount&&BigInt(l.requestedAmount.numerator)>0n))pending.push('Período curto:sequência dos períodos posteriores por reconciliar;41(5) exclui da contagem o período de transição7(4)d inferior a6meses,sem agregar todos os períodos curtos ou presumir prazo por ano civil.');
|
||||
const requestedLosses=addFractions(losses.filter(l=>l.status==='eligible').map(l=>l.requestedAmount!));
|
||||
if(profit&&units(requestedLosses)>(units(profit)>0n?units(profit):0n))pending.push('Utilizações propostas excedem o lucro tributável disponível;reparta explicitamente sem criar base negativa ou escolher uma ordem de perdas.');
|
||||
if(profit&&BigInt(requestedLosses.numerator)*BigInt(profit.denominator)>(BigInt(profit.numerator)>0n?BigInt(profit.numerator)*BigInt(requestedLosses.denominator):0n))pending.push('Utilizações propostas excedem o lucro tributável disponível;reparta explicitamente sem criar base negativa ou escolher uma ordem de perdas.');
|
||||
let benefitDeduction:FiscalFraction|null=null;const benefit=i.benefits;
|
||||
if(!benefit.state||!benefit.reference.trim())pending.push('Benefícios/deduções à matéria colectável por identificar (15(4));créditos à colecta e retenções não são esta dedução.');
|
||||
else if(benefit.state==='absent'){if(benefit.amount.trim())pending.push('Ausência de benefícios contradiz montante preenchido.');else benefitDeduction=zero();}
|
||||
else{try{const value=amount(benefit.amount);if(units(value)!==0n)pending.push('Benefício de montante conhecido:regra,condições,limite e ordem próprios por implementar;sem subtracção livre do valor.');else benefitDeduction=value;}catch{pending.push('Montante conhecido das deduções por preencher ou inválido.');}}
|
||||
const ready=pending.length===0&&profit!==null,deductedLosses=ready?requestedLosses:null,taxableBase=ready?subtractFractions(subtractFractions(units(profit!)<0n?zero():profit!,requestedLosses),benefitDeduction!):null;
|
||||
const ready=pending.length===0&&profit!==null,deductedLosses=ready?requestedLosses:null,taxableBase=ready?subtractFractions(subtractFractions(BigInt(profit!.numerator)<0n?zero():profit!,requestedLosses),benefitDeduction!):null;
|
||||
for(const l of losses){if(l.available){l.deducted=ready?(l.status==='eligible'?l.requestedAmount!:zero()):null;l.remaining=l.deducted?subtractFractions(l.available,l.deducted):null;}}
|
||||
return{input:i,taxableProfit:profit,requestedLosses,deductedLosses,benefitDeduction,taxableBase,losses,pending,source:'CIRPC15(1)a/15(2–4),41(1–7),Lei34/2007 PDF5/p768(59),PDF12/p768(66). Recorte2026,residente geral,método declarativo,perdas próprias em exercícios anuais ordinários;cinco exercícios posteriores,sem transferência41-A,regimes especiais ou benefícios positivos implementados. Pedido de utilização expresso e limitado ao saldo/lucro;semFIFO obrigatório ou limite percentual inventado. Matéria colectável simulada,não colecta/imposto a pagar,semM20/M22/submissão ou consumo persistente do saldo oficial.'};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
import {addFractions,fraction,subtractFractions,fractionPresentation,type FiscalFraction} from './fiscal-rational.ts';
|
||||
import {fiscalMoney} from './irpc-normal-schedules.ts';
|
||||
export const normalCostsVersion='IRPC-normal-adjustments/6';
|
||||
export const costRules={
|
||||
allowance:['Ajudas de custo/deslocação em viatura própria','expenseCorrections','36(1)e'],
|
||||
representation:['Despesas de representação','expenseCorrections','36(1)f/36(3)'],
|
||||
advertising:['Publicidade ordinária — limite anual partilhado','expenseCorrections','36(1)n,Lei20/2009'],
|
||||
vehicle:['Outros encargos com viatura ligeira de passageiros','expenseCorrections','36(4)'],
|
||||
fuel:['Combustível — prova do activo/locação e consumo normal','expenseCorrections','36(1)i/36(4)'],
|
||||
rental:['Aluguer sem condutor — parcela de quota não aceite documentada','expenseCorrections','36(1)h/36(4)'],
|
||||
credit:['Provisão/perda por imparidade de créditos ordinários','expenseCorrections','28(1)a/29'],
|
||||
stock:['Provisão/perda por imparidade de existências','expenseCorrections','28(1)b'],
|
||||
litigation:['Provisão para processo judicial em curso','expenseCorrections','28(1)c'],
|
||||
provision_reversal:['Reversão de provisão antes deduzida','incomeCorrections','28(2)'],
|
||||
taxed_reversal:['Reversão contabilística de provisão antes tributada','incomeCorrections','17/28;sem dupla tributação da parcela comprovada'],
|
||||
prior_cost:['Custo de exercício anterior incluído no resultado actual','timing','18(2)'],
|
||||
prior_income:['Proveito de exercício anterior incluído no resultado actual','timing','18(2)'],
|
||||
estimated_work_loss:['Perda estimada em obra plurianual em curso','expenseCorrections','36(1)m,Lei20/2009'],
|
||||
work:['Resultado de obra plurianual — percentagem/encerramento','timing','19(1–6)'],
|
||||
}as const;
|
||||
export type CostRule=keyof typeof costRules;
|
||||
export type CostRow={id:string;rule:''|CostRule;document:string;line:string;amount:string;sourceCode:string;reference:string;conditions:''|'yes';facts:Record<string,string>};
|
||||
export type NormalCostsInput={version:1;rows:CostRow[];advertisingReference:string;salesOrdinary:''|'yes';creditBase:string;creditPrevious:string;creditReference:string;creditRegime:''|'ordinary'|'regulated'};
|
||||
export const newNormalCosts=():NormalCostsInput=>({version:1,rows:[],advertisingReference:'',salesOrdinary:'',creditBase:'',creditPrevious:'',creditReference:'',creditRegime:''});
|
||||
export const newCostRow=(id:string):CostRow=>({id,rule:'',document:'',line:'',amount:'',sourceCode:'',reference:'',conditions:'',facts:{}});
|
||||
export function validateNormalCosts(i:NormalCostsInput){
|
||||
if(!i||i.version!==1||!Array.isArray(i.rows)||['advertisingReference','creditBase','creditPrevious','creditReference'].some(k=>typeof i[k as 'creditBase']!=='string')||!['','yes'].includes(i.salesOrdinary)||!['','ordinary','regulated'].includes(i.creditRegime))throw Error('Mapa de custos/provisões/periodização não recuperável.');
|
||||
if(new Set(i.rows.map(r=>r.id)).size!==i.rows.length)throw Error('Identificador repetido no mapa de custos.');
|
||||
for(const r of i.rows)if(!r||['id','rule','document','line','amount','sourceCode','reference','conditions'].some(k=>typeof r[k as 'id']!=='string')||r.rule!==''&&!Object.hasOwn(costRules,r.rule)||!['','yes'].includes(r.conditions)||!r.facts||typeof r.facts!=='object'||Array.isArray(r.facts)||Object.values(r.facts).some(v=>typeof v!=='string'))throw Error('Linha de custos/provisões/periodização não recuperável.');
|
||||
}
|
||||
type Source={currency:string;accountingLines:Array<{code:string;total:string;accountingEffect:string}>;cashSchedule?:Array<{salesReceivablesBalance:string|null;openingReceivablesBalance:string}>};
|
||||
export type CostClaim={document:string;line:string;sourceCode:string;amount:string};
|
||||
const z=()=>fraction(0n),cmp=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator);
|
||||
const mul=(a:FiscalFraction,n:bigint,d=1n)=>fraction(BigInt(a.numerator)*n,BigInt(a.denominator)*d);
|
||||
const min=(...v:FiscalFraction[])=>v.reduce((a,b)=>cmp(a,b)<0n?a:b),max0=(v:FiscalFraction)=>cmp(v,z())<0n?z():v;
|
||||
const costMoney=(v:FiscalFraction|null)=>{if(!v)return'Indeterminado';const p=fractionPresentation(v);return(p.approximate?'≈':'')+p.decimal+' MZN'+(p.approximate?' (exacto '+v.numerator+'/'+v.denominator+')':'');};
|
||||
const identity=(r:{document:string;line:string})=>r.document.trim()+'\u0000'+r.line.trim();
|
||||
export function reusableCreditBalance(source:Source|null){const l=source?.cashSchedule?.at(-1);if(!l||l.salesReceivablesBalance===null)return null;try{return addFractions([fiscalMoney(l.salesReceivablesBalance),fiscalMoney(l.openingReceivablesBalance)]);}catch{return null;}}
|
||||
export function calculateNormalCosts(input:NormalCostsInput,source:Source|null,existing:CostClaim[],period:{from:string;to:string},short=false){
|
||||
validateNormalCosts(input);const rows=input.rows,claims=rows.flatMap(r=>[{...r},...(r.rule==='work'?[{id:r.id,document:r.document,line:r.line+'/custos',sourceCode:r.facts.costSource??'',amount:r.facts.bookCost??''}]:[])]),pending:string[]=[];
|
||||
const sourceAmount=(code:string,effect:string)=>{const l=source?.accountingLines.find(l=>l.code===code);if(!l||l.accountingEffect!==effect)throw Error('Seleccione uma linha contabilística compatível.');return fiscalMoney(l.total);};
|
||||
const pool=(rule:CostRule)=>addFractions(rows.filter(r=>r.rule===rule).map(r=>fiscalMoney(r.amount)));
|
||||
const pools:Record<string,{label:string;base:FiscalFraction;previous:FiscalFraction|null;annualLimit:FiscalFraction;accumulatedLimit:FiscalFraction|null;reference:string}>={};
|
||||
const results=rows.map(r=>{const issues:string[]=[],rule=r.rule?costRules[r.rule]:null,topic=rule?.[1]??'',f=r.facts;let amount:FiscalFraction|null=null,accepted:FiscalFraction|null=null,adjustment:FiscalFraction|null=null,limit:FiscalFraction|null=null;const details:string[]=[];
|
||||
const a=(key:string)=>{if(!f[key]?.trim())throw Error('Falta parâmetro: '+(factLabels[key]??key));return fiscalMoney(f[key]);};
|
||||
const yesno=(key:string)=>{if(!['yes','no'].includes(f[key]))throw Error('Falta condição documentada: '+(factLabels[key]??key));return f[key]==='yes';};
|
||||
const ref=(key:string)=>{if(!f[key]?.trim())throw Error('Falta suporte: '+(factLabels[key]??key));};
|
||||
const balance=()=>{ref('balanceKey');if(rows.some(q=>q!==r&&q.facts.balanceKey===f.balanceKey))throw Error('Saldo/objecto fiscal repetido entre linhas; agregue as parcelas no mesmo mapa para não reutilizar o limite.');return a('previous');};
|
||||
const checkOrigin=(code:string,value:FiscalFraction,effect:string)=>{if(cmp(value,z())===0n&&!code)return;if(['depreciation','interest_expense'].includes(code))throw Error('Parcela de amortização/juros exige reconciliação própria com o mapa existente; sem dupla qualificação neste incremento.');const total=sourceAmount(code,effect);const allocated=addFractions([...existing,...claims].filter(c=>c.sourceCode===code).map(c=>fiscalMoney(c.amount)));if(cmp(allocated,total)>0n)throw Error('Parcelas dos mapas excedem a linha de origem; reconcilie sem duplicar ajustamentos.');};
|
||||
if(!rule||!r.document.trim()||!r.line.trim()||!r.reference.trim()||r.conditions!=='yes')issues.push('Regra, documento/linha, condições e suporte em falta.');
|
||||
if([...existing,...claims.filter(c=>c!==r&&c.id!==r.id)].some(c=>identity(c)===identity(r)))issues.push('Documento/linha repetidos entre mapas.');
|
||||
if(claims.filter(c=>identity(c)===identity(r)).length>1)issues.push('Documento/linha repetidos no mapa.');
|
||||
if(short&&['credit','advertising'].includes(r.rule))issues.push('Limite anual neste período curto por corresponder;sem proporcionalização ou anualização presumida.');
|
||||
if(source?.currency!=='MZN'||!period.to.startsWith('2026-'))issues.push('Recorte anual emMZN com termo em2026 por reconciliar.');
|
||||
try{amount=fiscalMoney(r.amount);if(cmp(amount,z())<=0n&&r.rule!=='work')throw Error('Identifique parcela positiva conhecida.');
|
||||
const isIncome=['provision_reversal','taxed_reversal','prior_income','work'].includes(r.rule);const omitted=r.rule==='provision_reversal'&&f.inResult==='no';if(!omitted)checkOrigin(r.sourceCode,amount,isIncome?'income':'expense');else if(r.sourceCode)throw Error('Reversão não incluída no resultado não deve repetir uma linha de proveitos.');
|
||||
switch(r.rule){
|
||||
case 'allowance':{const billed=a('billed'),taxed=a('taxedNotBilled');if(cmp(addFractions([billed,taxed]),amount)>0n)throw Error('Parcelas facturadas e tributadas emIRPS não podem sobrepor-se ou exceder o encargo.');const limited=subtractFractions(subtractFractions(amount,billed),taxed);adjustment=mul(limited,1n,2n);accepted=subtractFractions(amount,adjustment);limit=mul(limited,1n,2n);details.push('50% só da parcela não facturada a clientes nem tributada emIRPS; parcelas mutuamente exclusivas.');break;}
|
||||
case 'representation':accepted=mul(amount,1n,5n);adjustment=subtractFractions(amount,accepted);details.push('20% aceite;80% acrescido. Eventual tributação autónoma não calculada, âmbitoL7.');break;
|
||||
case 'advertising':{if(f.campaign!=='no')throw Error('Campanha de lançamento com horizonte superior a um ano: periodização36-A e articulação do limite não correspondidas; não tratar como publicidade ordinária.');if(input.salesOrdinary!=='yes'||!input.advertisingReference.trim())throw Error('Confirme completude da publicidade e correspondência do volume de vendas normal do exercício à receita declarada.');const total=pool('advertising');limit=mul(sourceAmount('revenue','income'),1n,100n);pools.advertising={label:'Publicidade — limite anual partilhado',base:sourceAmount('revenue','income'),previous:null,annualLimit:limit,accumulatedLimit:null,reference:input.advertisingReference};const eligible=min(total,limit);accepted=fraction(BigInt(amount.numerator)*BigInt(eligible.numerator)*BigInt(total.denominator),BigInt(amount.denominator)*BigInt(eligible.denominator)*BigInt(total.numerator));adjustment=subtractFractions(amount,accepted);details.push('Limite único anual1% das vendas normais; repartição aritmética proporcional entre parcelas para a simulação, sem ordem fiscal obrigatória.');break;}
|
||||
case 'vehicle':{if(!yesno('passenger')){accepted=amount;details.push('Viatura fora da categoria ligeira de passageiros;36(4)não aplicado, restantes condições ordinárias documentadas.');}else{accepted=yesno('publicOrRental')?amount:mul(amount,1n,2n);details.push('50% dos outros encargos de passageiros, excepto serviço público de transportes/locação na actividade normal; não inclui quotas, aluguer sem condutor ou combustível já discriminados.');}adjustment=subtractFractions(amount,accepted);break;}
|
||||
case 'fuel':case 'rental':{let eligible:FiscalFraction;if(r.rule==='fuel'){eligible=a('supportedNormal');if(cmp(eligible,amount)>0n)throw Error('Consumo normal comprovado excede o encargo.');details.push('36i: parcela ligada a activo próprio/locado e consumo normal comprovados.');}else{const excluded=a('nonAcceptedQuota');ref('quotaReference');if(cmp(excluded,amount)>0n)throw Error('Parcela de quota não aceite excede a renda.');eligible=subtractFractions(amount,excluded);details.push('36h: reutiliza parcela de quota não aceite documentada; o portal não apura automaticamente essa quota de viatura.');}if(yesno('passenger')&&!yesno('publicOrRental')){if(cmp(eligible,amount)!==0n)throw Error('Articulação da parcela excluída por36h/i com os50% de36(4) ainda não correspondida; este caso combinado fica pendente, sem somar nem repartir correcções por presunção.');eligible=mul(eligible,1n,2n);details.push('36(4):50% do encargo; sem parcela excluída concorrente porh/i.');}accepted=eligible;adjustment=subtractFractions(amount,accepted);break;}
|
||||
case 'credit':{if(input.creditRegime!=='ordinary')throw Error('Regime das provisões por identificar ou sujeito a supervisão financeira/seguradora28d; sem limites29 aplicados por aproximação.');if(!input.creditReference.trim())throw Error('Saldo de créditos ordinários e provisão fiscal anterior por documentar.');if(!input.creditBase.trim())throw Error('Créditos ordinários existentes no fim do exercício em falta.');if(!input.creditPrevious.trim())throw Error('Provisão fiscal anterior dos créditos em falta; não presumir zero.');const base=fiscalMoney(input.creditBase),previous=fiscalMoney(input.creditPrevious),total=pool('credit'),annual=mul(base,15n,1000n),accumulated=mul(base,6n,100n);pools.credit={label:'Créditos — limites anual e acumulado',base,previous,annualLimit:annual,accumulatedLimit:accumulated,reference:input.creditReference};if(cmp(previous,accumulated)>0n)throw Error('Provisão fiscal anterior excede6% dos créditos finais; reconcilie subsistência/reversão28(2), sem saldo presumido.');limit=min(annual,subtractFractions(accumulated,previous));const eligible=min(total,limit);accepted=fraction(BigInt(amount.numerator)*BigInt(eligible.numerator)*BigInt(total.denominator),BigInt(amount.denominator)*BigInt(eligible.denominator)*BigInt(total.numerator));adjustment=subtractFractions(amount,accepted);details.push('29:1,5% anual,6% acumulado sobre créditos da actividade normal existentes no fim; saldo fiscal anterior conhecido. Repartição proporcional do limite único, sem consumir saldo oficial.');break;}
|
||||
case 'stock':case 'litigation':{let previous:FiscalFraction;if(r.rule==='litigation'){if(!yesno('caseOngoing')){accepted=z();adjustment=amount;details.push('Não há processo judicial em curso; provisão não elegível por28c.');break;}if(!yesno('chargeDeductible')){accepted=z();adjustment=amount;details.push('Obrigação não daria lugar a custo dedutível; provisão não aceite por28c.');break;}}else if(!yesno('lossObserved')){accepted=z();adjustment=amount;details.push('Perda de valor não efectivamente observada; estimativa não aceite por28b.');break;}previous=balance();limit=a(r.rule==='stock'?'observedLoss':'obligation');if(cmp(previous,limit)>0n)throw Error('Saldo fiscal anterior excede a cobertura actual; reconcilie a reversão28(2).');accepted=min(amount,subtractFractions(limit,previous));adjustment=subtractFractions(amount,accepted);details.push(r.rule==='stock'?'28b:limite das perdas efectivamente observadas, incluindo saldo anterior.':'28c:obrigações de processo judicial em curso que seriam custos dedutíveis, com saldo anterior reconciliado.');break;}
|
||||
case 'provision_reversal':case 'taxed_reversal':{const previous=balance();if(cmp(amount,previous)>0n)throw Error('Reversão excede a parcela fiscal anterior demonstrada.');if(!yesno('eventEnded'))throw Error('Evento não cessou/não houve utilização diferente; fundamento da reversão por corresponder.');const inResult=yesno('inResult');if(r.rule==='taxed_reversal'&&!inResult)throw Error('Só excluir proveito de reversão já incluído na contabilidade e antes não deduzido.');accepted=amount;adjustment=r.rule==='taxed_reversal'?mul(amount,-1n):inResult?z():amount;details.push(r.rule==='taxed_reversal'?'Parcela antes tributada comprovada; exclui a reversão contabilística sem duplicar dedução.':'28(2):proveito da provisão antes deduzida; só acresce quando ainda não incluído no resultado.');break;}
|
||||
case 'prior_cost':case 'prior_income':{if(!/^20\d{2}$/.test(f.originalYear)||Number(f.originalYear)>=2026)throw Error('Exercício de origem deve ser anterior ao exercício actual.');ref('closingEvidence');const unknown=yesno('unknownAtClose');accepted=unknown?amount:z();adjustment=unknown?z():r.rule==='prior_cost'?amount:mul(amount,-1n);details.push(unknown?'18(2):imprevisível ou manifestamente desconhecido no encerramento anterior; imputável ao actual.':'18(2):conhecido/previsível no encerramento anterior; excluído do actual, sem alterar declarações/históricos anteriores.');break;}
|
||||
case 'estimated_work_loss':accepted=z();adjustment=amount;details.push('36m:perda meramente estimada em obra em curso não dedutível; custo efectivo não confundido com estimativa.');break;
|
||||
case 'work':{const price=a('price'),totalCost=a('totalCost'),incurred=a('incurred'),priorRevenue=a('priorRevenue'),priorCost=a('priorCost'),bookCost=a('bookCost');ref('projectKey');if(rows.some(q=>q!==r&&q.facts.projectKey===f.projectKey))throw Error('Obra repetida; agregue os valores acumulados sem duplicar resultados.');checkOrigin(f.costSource??'',bookCost,'expense');if(cmp(totalCost,z())<=0n||cmp(incurred,totalCost)>0n||cmp(priorCost,incurred)>0n||cmp(priorRevenue,price)>0n)throw Error('Preço, custo total, incorrido e valores fiscais anteriores incoerentes.');if(!yesno('consistentMethod'))throw Error('Mudança de critério exige correspondência à autorização19(6).');const mandatory=yesno('partialBilling')||yesno('ownFractionalDelivery');let revenue:FiscalFraction,cost:FiscalFraction;
|
||||
if(f.method==='percentage'){revenue=fraction(BigInt(price.numerator)*BigInt(incurred.numerator)*BigInt(totalCost.denominator),BigInt(price.denominator)*BigInt(incurred.denominator)*BigInt(totalCost.numerator));cost=incurred;}
|
||||
else if(f.method==='closing'){if(mandatory)throw Error('Facturação parcial com acabamento correspondente/entrega fraccionada: critério da percentagem obrigatório19(2).');const concluded=cmp(mul(incurred,100n),mul(totalCost,95n))>=0n||yesno('publicReception');revenue=concluded?price:z();cost=concluded?incurred:z();}
|
||||
else throw Error('Seleccione percentagem de acabamento ou encerramento.');if(cmp(priorRevenue,revenue)>0n||cmp(priorCost,cost)>0n)throw Error('Acumulados fiscais anteriores excedem o resultado reconhecível pelo critério; reconcilie sem correcção retrospectiva presumida.');const deferred=a('deferredReceipt');if(cmp(deferred,z())!==0n)throw Error('Receita antecipada19(5) de montante não zero exige correspondência própria.');const currentRevenue=subtractFractions(revenue,priorRevenue),currentCost=subtractFractions(cost,priorCost);accepted=currentCost;adjustment=addFractions([subtractFractions(currentRevenue,amount),subtractFractions(bookCost,currentCost)]);limit=currentRevenue;details.push('19:grau=incorrido/custo total;valores fiscais do exercício obtidos dos acumulados menos o já reconhecido. Proveito fiscal corrente:'+costMoney(currentRevenue)+';custo fiscal corrente:'+costMoney(currentCost)+';sem imposto/pagamento ou perda estimada presumidos.');break;}
|
||||
default:throw Error('Categoria por identificar.');
|
||||
}
|
||||
}catch(e){issues.push(e instanceof Error?e.message:String(e));accepted=null;adjustment=null;}
|
||||
if(issues.length){accepted=null;adjustment=null;pending.push((r.document||r.id)+': '+issues.join(' '));}return{...structuredClone(r),topic,amountValue:amount,accepted,adjustment,limit,status:issues.length?'indeterminate' as const:'calculated' as const,reason:issues.join(' ')||details.join(' '),ruleSource:rule?'CIRPC'+rule[2]:''};
|
||||
});
|
||||
return{input:structuredClone(input),rows:results,pools,pending,effects:results.map(r=>({id:r.id,topic:r.topic,amount:r.amountValue,effect:r.adjustment,reason:r.reason})),net:addFractions(results.flatMap(r=>r.adjustment?[r.adjustment]:[])),source:'CIRPC18(2)/19/28/29/36;Lei34/2007,Lei20/2009,alterações4/2012 e19/2013 e diplomas posteriores inventariados. Recorte2026/MZN,condições documentadas,sem efeitos retroactivos ou consumo de saldos oficiais;L7/L8 separados.'};
|
||||
}
|
||||
export type NormalCostsModel=ReturnType<typeof calculateNormalCosts>;
|
||||
const factLabels:Record<string,string>={billed:'Facturado a clientes',taxedNotBilled:'Tributado emIRPS e não facturado',campaign:'Campanha plurianual',passenger:'Ligeira de passageiros',publicOrRental:'Serviço público/locação na actividade normal',supportedNormal:'Consumo normal comprovado',nonAcceptedQuota:'Quota não aceite documentada',quotaReference:'Suporte da quota',balanceKey:'Identificação do saldo/objecto',previous:'Parcela fiscal anterior',lossObserved:'Perda efectivamente observada',observedLoss:'Perda total observada',caseOngoing:'Processo judicial em curso',chargeDeductible:'Obrigação fiscalmente dedutível',obligation:'Obrigação coberta',eventEnded:'Evento cessou/utilização diferente',inResult:'Incluído no resultado',originalYear:'Exercício de origem',unknownAtClose:'Imprevisível/desconhecido no encerramento',closingEvidence:'Suporte do encerramento',projectKey:'Obra',method:'Critério',price:'Preço',totalCost:'Custo total estimado',incurred:'Custos incorporados acumulados',priorRevenue:'Proveitos fiscais anteriores',priorCost:'Custos fiscais anteriores',costSource:'Origem dos custos',bookCost:'Custo contabilizado corrente',partialBilling:'Facturação parcial com acabamento correspondente',ownFractionalDelivery:'Venda/entrega fraccionada por conta própria',consistentMethod:'Critério uniforme e mantido',publicReception:'Recepção provisória pública',deferredReceipt:'Receita antecipada proposta'};
|
||||
const originLabels:Record<string,string>={revenue:'Receitas do plano',cost_of_sales:'Custo das vendas',operating_expenses:'Despesas operacionais',personnel:'Pessoal',depreciation:'Depreciação contabilística',interest_expense:'Juros financeiros'};
|
||||
export function normalCostReport(m:NormalCostsModel):Array<[string,string,string,string]>{const money=costMoney;return[['IRPC normal — L6','Custos com limites, provisões e periodização',`Efeito líquido das parcelas resolvidas:${money(m.net)};${m.pending.join(' | ')}`,m.source],...Object.values(m.pools).map(p=>['IRPC normal — L6',p.label,`Base documentada:${money(p.base)};limite anual:${money(p.annualLimit)};saldo fiscal anterior:${p.previous?money(p.previous):'Não aplicável'};limite acumulado:${p.accumulatedLimit?money(p.accumulatedLimit):'Não aplicável'};limite partilhado entre todas as parcelas, sem consumo do saldo oficial.`,p.reference]as[string,string,string,string]),...m.rows.map(r=>['IRPC normal — L6',(r.rule?costRules[r.rule][0]:'Categoria por identificar')+' — '+r.document+'/'+r.line,`Estado:${r.status==='calculated'?'Calculado no recorte':'Informação insuficiente'};montante identificado:${money(r.amountValue)};parcela aceite/custo fiscal ou reversão:${money(r.accepted)};limite/base ou proveito fiscal:${r.limit?money(r.limit):r.status==='calculated'?'Sem limite monetário próprio; ver regra':'Em falta/não aplicável à parcela'};ajustamento com sinal:${money(r.adjustment)};${r.reason}`,`${r.ruleSource};${r.reference};origem:${originLabels[r.sourceCode]??'Fora do resultado, documentado'};parâmetros:${Object.entries(r.facts).filter(([k])=>factLabels[k]).map(([k,v])=>factLabels[k]+': '+(v==='yes'?'Sim':v==='no'?'Não':v==='percentage'?'Percentagem de acabamento':v==='closing'?'Encerramento':originLabels[v]??(v||'Em falta'))).join('; ')};sem alteração do histórico ou saldo oficial.`]as[string,string,string,string])];}
|
||||
@@ -0,0 +1,84 @@
|
||||
import {addFractions,decimalFraction,fraction,subtractFractions,fractionPresentation,type FiscalFraction} from './fiscal-rational.ts';
|
||||
import {fiscalMoney,type NormalAsset} from './irpc-normal-schedules.ts';
|
||||
export const normalDepreciationVersion='IRPC-normal-adjustments/7';
|
||||
export const depreciationCatalog={
|
||||
computer:{label:'Computadores, impressoras, UPS e material informático',table:'II',code:'3/9',rate:'25',kind:'equipment',page:17},
|
||||
server:{label:'Servidores',table:'II',code:'3/9.1',rate:'20',kind:'equipment',page:17},
|
||||
security:{label:'Equipamento de vigilância e segurança',table:'II',code:'3/23',rate:'20',kind:'equipment',page:18},
|
||||
machine:{label:'Máquinas não especificadas',table:'II',code:'3/22',rate:'10',kind:'equipment',page:18},
|
||||
furniture:{label:'Mobiliário',table:'II',code:'5/7',rate:'10',kind:'furniture',page:18},
|
||||
commercial_building:{label:'Edifícios comerciais e administrativos',table:'II',code:'1/2.2',rate:'2',kind:'building',page:16},
|
||||
passenger_vehicle:{label:'Veículos automóveis ligeiros e mistos',table:'II',code:'4/9.2',rate:'25',kind:'vehicle',page:18},
|
||||
software:{label:'Programas de computadores',table:'II',code:'5/8',rate:'25',kind:'software',page:18},
|
||||
hotel_decoration:{label:'Decorações interiores — hotéis e actividades similares, classe84.2',table:'I',code:'84.2/B',rate:'20',kind:'furniture',page:16},
|
||||
laundry_machine:{label:'Maquinaria específica de lavandarias/tinturarias',table:'I',code:'84.3/A',rate:'12.5',kind:'equipment',page:16},
|
||||
}as const;
|
||||
export type DepreciationCategory=keyof typeof depreciationCatalog;
|
||||
export type DepreciationAsset={id:string;assetKey:string;description:string;document:string;line:string;category:''|DepreciationCategory|'other'|'nondepreciable';valuation:''|'historical_new'|'used'|'revalued'|'other';specificRate:''|'yes'|'no';method:''|'constant'|'declining'|'low_value';rate:string;factor:string;timing:''|'annual'|'months';start:string;exitState:''|'absent'|'known';exitDate:string;cost:string;land:string;residual:string;accounting:string;previousAccounting:string;previousFiscal:string;priorAvailable:string;previousReference:string;newTangible:''|'yes'|'no';consistentMethod:''|'yes'|'no';switchToStraight:''|'yes'|'no';priorFullQuotas:''|'yes'|'no';vehicleException:''|'yes'|'no';limitedRights:''|'yes'|'no';individual:''|'yes'|'no';conditions:''|'yes';reference:string};
|
||||
export type NormalDepreciationInput={version:1;completenessReference:string;assets:DepreciationAsset[]};
|
||||
export const newNormalDepreciation=():NormalDepreciationInput=>({version:1,completenessReference:'',assets:[]});
|
||||
export const newDepreciationAsset=(id:string):DepreciationAsset=>({id,assetKey:'',description:'',document:'',line:'',category:'',valuation:'',specificRate:'',method:'',rate:'',factor:'',timing:'',start:'',exitState:'',exitDate:'',cost:'',land:'',residual:'',accounting:'',previousAccounting:'',previousFiscal:'',priorAvailable:'',previousReference:'',newTangible:'',consistentMethod:'',switchToStraight:'',priorFullQuotas:'',vehicleException:'',limitedRights:'',individual:'',conditions:'',reference:''});
|
||||
export function reuseNormalAssets(assets:NormalAsset[]):NormalDepreciationInput{return{version:1,completenessReference:'',assets:assets.map(a=>({...newDepreciationAsset(a.id),assetKey:a.id,description:a.description,category:a.category,document:a.reference,line:a.id,method:'constant',timing:'annual',specificRate:'no',consistentMethod:'yes',conditions:a.conditions,rate:a.rate,cost:a.cost,residual:a.residual,accounting:a.accounting,previousFiscal:a.previousFiscal,start:a.inUseFrom,reference:a.reference}))};}
|
||||
export function validateNormalDepreciation(i:NormalDepreciationInput){
|
||||
if(!i||i.version!==1||typeof i.completenessReference!=='string'||!Array.isArray(i.assets)||new Set(i.assets.map(a=>a.id)).size!==i.assets.length)throw Error('Mapa de amortizações não recuperável.');
|
||||
for(const a of i.assets){if(!a||Object.keys(newDepreciationAsset('')).some(k=>typeof a[k as keyof DepreciationAsset]!=='string')||!['','other','nondepreciable',...Object.keys(depreciationCatalog)].includes(a.category)||!['','historical_new','used','revalued','other'].includes(a.valuation)||!['','constant','declining','low_value'].includes(a.method)||!['','annual','months'].includes(a.timing)||!['','absent','known'].includes(a.exitState)||!['','yes'].includes(a.conditions)||['specificRate','newTangible','consistentMethod','switchToStraight','priorFullQuotas','vehicleException','limitedRights','individual'].some(k=>!['','yes','no'].includes(a[k as 'specificRate'])))throw Error('Activo ou parâmetros de amortização não recuperáveis.');}
|
||||
}
|
||||
const zero=()=>fraction(0n),cmp=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator);
|
||||
const min=(...a:FiscalFraction[])=>a.reduce((v,w)=>cmp(v,w)<0n?v:w),positive=(a:FiscalFraction)=>cmp(a,zero())<0n?zero():a;
|
||||
const multiply=(a:FiscalFraction,b:FiscalFraction)=>fraction(BigInt(a.numerator)*BigInt(b.numerator),BigInt(a.denominator)*BigInt(b.denominator));
|
||||
const ratio=(a:FiscalFraction,b:FiscalFraction)=>fraction(BigInt(a.numerator)*BigInt(b.denominator),BigInt(a.denominator)*BigInt(b.numerator));
|
||||
const date=(v:string)=>/^20\d{2}-\d{2}-\d{2}$/.test(v)&&Number.isFinite(Date.parse(v))&&new Date(v).toISOString().slice(0,10)===v;
|
||||
const month=(v:string)=>Number(v.slice(0,4))*12+Number(v.slice(5,7))-1;
|
||||
const show=(v:FiscalFraction|null)=>{if(!v)return'Indeterminado';const p=fractionPresentation(v);return(p.approximate?'≈':'')+p.decimal+' MZN'+(p.approximate?' (exacto '+v.numerator+'/'+v.denominator+')':'');};
|
||||
export function calculateNormalDepreciation(input:NormalDepreciationInput,source:{currency:string;accountingLines:Array<{code:string;total:string}>}|null,period:{from:string;to:string},claims:Array<{sourceCode:string;document:string;line:string;amount:string}>,short=false,acceleratedIds:ReadonlySet<string>=new Set()){
|
||||
validateNormalDepreciation(input);const pending:string[]=[];
|
||||
if(!input.completenessReference.trim())pending.push('Reconciliação integral dos activos e quotas anteriores com a depreciação da origem em falta.');
|
||||
if(source?.currency!=='MZN'||!date(period.from)||!date(period.to)||!period.to.startsWith('2026-')||(!short&&month(period.to)-month(period.from)!==11||short&&(month(period.to)<month(period.from)||month(period.to)-month(period.from)>=11)))pending.push('Período anual emMZN com termo em2026 por reconciliar; períodos curtos permanecem separados.');
|
||||
const assets=input.assets.map(a=>{const issues:string[]=[],notes:string[]=[];let accounting:FiscalFraction|null=null,basis:FiscalFraction|null=null,taxBasis:FiscalFraction|null=null,quota:FiscalFraction|null=null,deduction:FiscalFraction|null=null,adjustment:FiscalFraction|null=null,priorUsed:FiscalFraction|null=null,priorRemaining:FiscalFraction|null=null,remainingFiscal:FiscalFraction|null=null,eligibleCurrent:FiscalFraction|null=null,months:number|null=null;const entry=Object.hasOwn(depreciationCatalog,a.category)?depreciationCatalog[a.category as DepreciationCategory]:null;
|
||||
if(short&&a.category!=='nondepreciable'&&(a.timing!=='months'||a.method==='low_value'))issues.push('Período curto exige duodécimos;opção integral art17 neste período por corresponder.');
|
||||
const money=(s:string,label:string)=>{if(!s.trim())throw Error(label+' em falta; não presumir zero.');return fiscalMoney(s);};
|
||||
const yesno=(v:string,label:string)=>{if(!['yes','no'].includes(v))throw Error(label+' por documentar.');return v==='yes';};
|
||||
if(!a.assetKey.trim()||!a.description.trim()||!a.document.trim()||!a.line.trim()||!a.reference.trim()||a.conditions!=='yes')issues.push('Identificação do activo, documento/linha, condições ordinárias e suporte em falta.');
|
||||
if(input.assets.some(b=>b!==a&&(b.assetKey.trim()===a.assetKey.trim()||b.document.trim()===a.document.trim()&&b.line.trim()===a.line.trim()))||claims.some(c=>c.document.trim()===a.document.trim()&&c.line.trim()===a.line.trim()))issues.push('Activo ou documento/linha repetido entre mapas; reconcilie sem dedução duplicada.');
|
||||
try{accounting=money(a.accounting,'Depreciação contabilística corrente');const cost=money(a.cost,'Custo histórico');
|
||||
if(a.category==='nondepreciable'){basis=cost;taxBasis=zero();quota=zero();deduction=zero();adjustment=accounting;notes.push('CIRPC26/27:elemento expressamente qualificado como não sujeito a deperecimento; depreciação contabilística integralmente acrescida.');}
|
||||
else{
|
||||
if(a.valuation!=='historical_new')throw Error('Tipo de aquisição/base por identificar ou fora do recorte de bens novos a custo histórico; usados/abertura de escrita7(2) e reavaliados15 exigem regra própria.');
|
||||
if(!entry)throw Error('Categoria/tabela ainda não correspondida; sem taxa livre ou código provisório.');
|
||||
if(entry){const specific=yesno(a.specificRate,'Existência de taxa específica da tabelaI');if(entry.table==='II'&&specific)throw Error('Taxa específica da tabelaI prevalece; seleccione a categoria específica correspondente.');if(entry.table==='I'&&!specific)throw Error('Categoria específica da tabelaI sem enquadramento documentado.');}
|
||||
if(!date(a.start)||a.start<'2014-01-01')throw Error('Entrada em funcionamento/utilização desde2014 por identificar; activos anteriores exigem correspondência histórica própria.');
|
||||
if(!yesno(a.consistentMethod,'Método uniforme desde o início'))throw Error('Mudança de método/razão excepcional requer correspondência própria do artigo10.');
|
||||
if(a.exitState==='known'&&(!date(a.exitDate)||a.exitDate<a.start)||!a.exitState||a.exitState==='absent'&&a.exitDate.trim())throw Error('Estado/data de transmissão,inutilização ou termo de vida útil incoerente ou em falta.');
|
||||
if(!a.previousReference.trim())throw Error('Suporte das quotas contabilísticas/fiscais anteriores e da parcela temporariamente tributada em falta.');
|
||||
const priorBook=money(a.previousAccounting,'Quotas contabilísticas anteriores'),priorFiscal=money(a.previousFiscal,'Quotas fiscais anteriores'),available=money(a.priorAvailable,'Parcela anterior temporariamente tributada recuperável');
|
||||
if(cmp(priorFiscal,priorBook)>0n||cmp(available,subtractFractions(priorBook,priorFiscal))>0n)throw Error('Quotas anteriores incoerentes; parcela recuperável não pode exceder a diferença contabilizada e não deduzida, excluindo encargos permanentemente não aceites.');
|
||||
const residual=money(a.residual,'Residual'),land=entry?.kind==='building'?money(a.land,'Terreno/parte não depreciável'):zero();if(entry?.kind!=='building'&&a.land.trim()&&cmp(fiscalMoney(a.land),zero())!==0n)throw Error('Terreno não corresponde a esta categoria de activo.');basis=subtractFractions(subtractFractions(cost,residual),land);if(cmp(basis,zero())<=0n)throw Error('Base depreciável positiva por reconciliar.');if(entry?.kind!=='building'&&cmp(land,zero())!==0n)throw Error('Terreno só deve ser separado no imóvel correspondente.');taxBasis=basis;
|
||||
if(entry?.kind==='vehicle'&&!yesno(a.vehicleException,'Afectação a serviço público de transportes/locação na actividade normal')){taxBasis=min(basis,positive(subtractFractions(fraction(800000n),residual)));notes.push('CIRPC27e:limite de aquisição800000MZN,sem afectar a depreciação contabilística de origem.');}
|
||||
if(entry?.kind==='software'&&!yesno(a.limitedRights,'Aquisição onerosa e direitos de utilização exclusiva por tempo limitado'))throw Error('Direitos de software/intangível sem condições do artigo16 documentadas.');
|
||||
if(cmp(priorFiscal,taxBasis)>0n)throw Error('Quotas fiscais anteriores excedem a base fiscal; reconcilie o saldo anterior.');const remaining=subtractFractions(taxBasis,priorFiscal),priorEligibleBook=min(taxBasis,multiply(priorBook,ratio(taxBasis,basis)));if(cmp(available,positive(subtractFractions(priorEligibleBook,priorFiscal)))>0n)throw Error('Parcela anterior recuperável inclui quota permanentemente não aceite ou excede a contabilização fiscalmente elegível.');eligibleCurrent=min(multiply(accounting,ratio(taxBasis,basis)),positive(subtractFractions(taxBasis,priorEligibleBook)));
|
||||
let maxRate:FiscalFraction|null=entry?decimalFraction(entry.rate):null,maxLifeMonths:FiscalFraction|null=maxRate?ratio(fraction(2400n),maxRate):null;
|
||||
if(a.method==='low_value'){if(cmp(cost,fraction(20000n))>0n||!yesno(a.individual,'Activo individual fora de conjunto depreciado como um todo')||cmp(priorFiscal,zero())!==0n||a.start<period.from||a.start>period.to)throw Error('Art17:valor unitário até20000MZN,activo individual e início no período,sem amortização fiscal anterior; condições em falta/incompatíveis.');quota=remaining;months=month(period.to)-month(a.start)+1;notes.push('Art17:opção de depreciação integral em um período,limitada ao que está contabilizado e ao saldo fiscal.');}
|
||||
else{
|
||||
if(!entry||!maxRate||!maxLifeMonths)throw Error('Taxa aplicável não identificada.');
|
||||
if(a.method==='constant'){if(!/^\d+(?:\.\d{1,6})?$/.test(a.rate))throw Error('Taxa constante escolhida por identificar.');const selected=decimalFraction(a.rate);if(cmp(selected,multiply(maxRate,fraction(1n,2n)))<0n||cmp(selected,maxRate)>0n)throw Error('Taxa constante fora do recorte entre metade da máxima e a máxima;quotas inferiores exigem correspondência própria dos limites de vida útil, artigos5/7.');quota=multiply(taxBasis,multiply(selected,fraction(acceleratedIds.has(a.id)?3n:1n,acceleratedIds.has(a.id)?200n:100n)));if(acceleratedIds.has(a.id))notes.push('CBF16:L7 qualificado,incremento50% da taxa normal;mantidos contabilização e saldo fiscal.');notes.push('Quota constante pela taxa escolhida:'+a.rate+'%;tabela'+entry.table+'/'+entry.code+'.');}
|
||||
else if(a.method==='declining'){if(!yesno(a.newTangible,'Activo tangível novo adquirido a terceiros/construído')||['building','furniture','software'].includes(entry.kind)||entry.kind==='vehicle'&&a.vehicleException!=='yes')throw Error('Art6:quotas degressivas só nos activos tangíveis novos elegíveis;edifícios,mobiliário/equipamento social,intangíveis e veículos sem excepção ficam separados.');const life=ratio(fraction(100n),maxRate),maxFactor=cmp(life,fraction(5n))<0n?fraction(3n,2n):cmp(life,fraction(6n))<=0n?fraction(2n):fraction(5n,2n);if(!/^\d+(?:\.\d{1,6})?$/.test(a.factor))throw Error('Coeficiente degressivo escolhido em falta.');const factor=decimalFraction(a.factor);if(cmp(factor,zero())<=0n||cmp(factor,maxFactor)>0n)throw Error('Coeficiente degressivo excede o máximo do artigo8:1,5/2/2,5 conforme vida útil mínima.');quota=multiply(remaining,multiply(maxRate,multiply(factor,fraction(1n,100n))));notes.push('Art8:saldo fiscal por amortizar ×taxa máxima'+entry.rate+'% ×coeficiente'+a.factor+';máximo'+fractionPresentation(maxFactor).decimal+'.');
|
||||
if(yesno(a.switchToStraight,'Opção pela regra de saldo/vida útil restante8(2)')){if(!yesno(a.priorFullQuotas,'Condição das quotas anteriores8(2)')||!a.start.endsWith('-01-01')||period.from!=='2026-01-01'||a.timing!=='annual')throw Error('Art8(2):condição das quotas anteriores por documentar;este recorte da opção exige início emJaneiro e período anual civil.');const remainingYears=subtractFractions(life,fraction(BigInt(2026-Number(a.start.slice(0,4)))));if(cmp(remainingYears,zero())<=0n)throw Error('Art8(2):vida útil mínima esgotada;sem dividir por anos inexistentes.');const linear=ratio(remaining,remainingYears);if(cmp(quota,linear)<0n){quota=linear;notes.push('Art8(2):usado saldo/número de anos de vida útil mínima restantes,com condições anteriores documentadas.');}}
|
||||
}else throw Error('Método de amortização por identificar.');
|
||||
if(!a.timing)throw Error('Opção anual/duodécimos por identificar.');
|
||||
if(a.timing==='annual'){if(a.exitState==='known'&&a.exitDate<=period.to)throw Error('Evento de saída em período anual:seleccione duodécimos e reconcilie a regra aplicável;sem quota anual presumida.');const lifeEnd=month(a.start)+Number(BigInt(maxLifeMonths.numerator)/BigInt(maxLifeMonths.denominator));if(lifeEnd>month(period.from)&&lifeEnd<=month(period.to)&&cmp(remaining,zero())>0n)throw Error('Vida útil máxima termina dentro do período;opção anual e quotas anteriores exigem correspondência própria. Duodécimos em vigor são calculados até ao limite temporal.');months=a.start>period.to?0:12;}
|
||||
else{const start=Math.max(month(period.from),month(a.start)),end=Math.min(month(period.to)+1,a.exitState==='known'?month(a.exitDate):month(period.to)+1,month(a.start)+Number(BigInt(maxLifeMonths.numerator)/BigInt(maxLifeMonths.denominator)));months=Math.max(0,end-start);quota=multiply(quota,fraction(BigInt(months),12n));notes.push('Art9:entrada incluída desde o mês da utilização;saída exclui o mês do evento;'+months+'duodécimos.');}
|
||||
const elapsed=Math.max(0,month(period.from)-month(a.start));if(cmp(fraction(BigInt(elapsed)),maxLifeMonths)>=0n){quota=zero();notes.push('Art5:vida útil máxima esgotada,sem excepção aplicada;nenhuma recuperação de quota fora desse limite.');}else if(a.start>period.to){quota=zero();notes.push('Art3:activo ainda não entrou emuso no período;sem amortização fiscal.');}
|
||||
}
|
||||
deduction=min(quota!,remaining,addFractions([eligibleCurrent,available]));priorUsed=positive(subtractFractions(deduction,eligibleCurrent));priorRemaining=subtractFractions(available,priorUsed);remainingFiscal=subtractFractions(remaining,deduction);adjustment=subtractFractions(accounting,deduction);notes.push('Art3(3):dedução limitada ao contabilizado no período ou antes desde o uso;quotas anteriores recuperáveis usadas:'+show(priorUsed)+';saldo anterior aritmético:'+show(priorRemaining)+'. Sem consumo oficial nem recuperação de quota não contabilizada/permanentemente excluída.');
|
||||
}
|
||||
}catch(e){issues.push(e instanceof Error?e.message:String(e));}
|
||||
if(issues.length){deduction=null;adjustment=null;priorUsed=null;priorRemaining=null;remainingFiscal=null;pending.push((a.description||a.id)+': '+issues.join(' '));}
|
||||
return{...structuredClone(a),catalog:entry,accountingValue:accounting,basis,taxBasis,quota,deduction,adjustment,eligibleCurrent,priorUsed,priorRemaining,remainingFiscal,months,status:issues.length?'indeterminate' as const:'calculated' as const,reason:issues.join(' ')||notes.join(' ')};
|
||||
});
|
||||
let accountingTotal:FiscalFraction|null=null;try{accountingTotal=addFractions(assets.map(a=>{if(!a.accountingValue)throw Error();return a.accountingValue;}));const origin=fiscalMoney(source?.accountingLines.find(l=>l.code==='depreciation')?.total??'');if(cmp(accountingTotal,origin)!==0n)pending.push('Soma das quotas contabilísticas dos activos não corresponde à depreciação financeira declarada.');}catch{pending.push('Depreciação contabilística da origem por reconciliar.');}
|
||||
if(claims.some(c=>c.sourceCode==='depreciation'))pending.push('Depreciação partilhada com outros ajustamentos de origem;reconcilie as parcelas para não duplicar o mesmo encargo.');
|
||||
const knownAdjustment=addFractions(assets.flatMap(a=>a.adjustment?[a.adjustment]:[])),adjustment=pending.length===0?knownAdjustment:null;
|
||||
return{input:structuredClone(input),assets,accountingTotal,knownAdjustment,adjustment,pending,source:'Decreto72/2013,art3–10/16/17,tabelasI/II;CIRPC26/27. Recorte anualMZN com termo2026,custo histórico,sem reavaliação,turnos intensivos,concessões/fusões ou excepções presumidas. Fotografia7;mapa interno,não formulário oficial de amortizações.'};
|
||||
}
|
||||
export type NormalDepreciationModel=ReturnType<typeof calculateNormalDepreciation>;
|
||||
export function normalDepreciationReport(m:NormalDepreciationModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Amortizações — tabelas, métodos, duodécimos e quotas anteriores',`Quotas contabilísticas:${show(m.accountingTotal)};ajustamento das parcelas conhecidas:${show(m.knownAdjustment)};ajustamento reconciliado:${show(m.adjustment)};${m.pending.join(' | ')}`,m.source],...m.assets.map(a=>['IRPC normal — L6',a.description+' — '+a.document+'/'+a.line,`Estado:${a.status==='calculated'?'Calculado no recorte':'Informação insuficiente'};contabilístico:${show(a.accountingValue)};parcela contabilística elegível:${show(a.eligibleCurrent)};base fiscal:${show(a.taxBasis)};quota calculada:${show(a.quota)};dedução fiscal:${show(a.deduction)};ajustamento com sinal:${show(a.adjustment)};duodécimos:${a.months??'Não aplicável'};quota anterior utilizada:${show(a.priorUsed)};saldo anterior aritmético:${show(a.priorRemaining)};${a.reason}`,`${a.catalog?'Decreto72/2013,tabela'+a.catalog.table+',código'+a.catalog.code+',PDF'+a.catalog.page:'Categoria sem código de tabela aplicado'};${a.reference};quotas anteriores:${a.previousReference};método:${a.method==='constant'?'Constante':a.method==='declining'?'Degressivo':a.method==='low_value'?'Valor reduzido':'Por identificar'};sem alteração dos documentos/saldos oficiais ou históricos.`]as[string,string,string,string])];}
|
||||
@@ -0,0 +1,84 @@
|
||||
import {addFractions,decimalFraction,fraction,fractionPresentation,subtractFractions,type FiscalFraction} from './fiscal-rational.ts';
|
||||
import type {normalFinancialSource} from './irpc-normal.ts';
|
||||
import type {SchedulesModel} from './irpc-normal-schedules.ts';
|
||||
import type {NormalCostsModel} from './irpc-normal-costs.ts';
|
||||
import type {NormalDepreciationModel} from './irpc-normal-depreciation.ts';
|
||||
import type {NormalBaseModel} from './irpc-normal-base.ts';
|
||||
export const normalFormPreparationVersion='IRPC-normal-adjustments/9';
|
||||
export const m20Accounts={
|
||||
'7.1':'Venda de bens','7.2':'Prestação de serviços','7.3':'Investimentos realizados pela própria empresa','7.4':'Reversões do período','7.5':'Rendimentos suplementares','7.6':'Outros rendimentos e ganhos operacionais','7.8':'Rendimentos e ganhos financeiros','7.9':'Ganho por aumento do justo valor',
|
||||
'6.1.1':'Custos dos inventários vendidos ou consumidos','6.2':'Gastos com pessoal','6.3':'Fornecimentos e serviços de terceiros','6.4':'Perda por imparidade / ajustamento','6.5':'Amortizações do período','6.6':'Provisões do período','6.7':'Perda por redução do justo valor','6.8':'Outros gastos e perdas operacionais','6.9':'Gastos e perdas financeiras','8.5':'Imposto sobre o rendimento',
|
||||
}as const;
|
||||
export type FormAllocation={id:string;sourceCode:string;account:''|keyof typeof m20Accounts;amount:string;reference:string};
|
||||
export type NormalFormPreparationInput={version:1;edition:''|'accepted_pdf_and_m20a1';reference:string;completenessReference:string;allocations:FormAllocation[];incomeTax:{state:''|'known'|'absent';amount:string;placement:''|'included'|'outside';reference:string};reducedRate:{state:''|'known'|'absent';reference:string}};
|
||||
export const newNormalFormPreparation=():NormalFormPreparationInput=>({version:1,edition:'',reference:'',completenessReference:'',allocations:[],incomeTax:{state:'',amount:'',placement:'',reference:''},reducedRate:{state:'',reference:''}});
|
||||
export const newFormAllocation=(id:string):FormAllocation=>({id,sourceCode:'',account:'',amount:'',reference:''});
|
||||
const allowed:Record<string,string[]>={revenue:['7.1','7.2','7.3','7.4','7.5','7.6','7.8','7.9'],cost_of_sales:['6.1.1'],personnel:['6.2'],depreciation:['6.5'],interest_expense:['6.9'],operating_expenses:['6.3','6.4','6.6','6.7','6.8','8.5']};
|
||||
export const normalFormAccountsFor=(source:string)=>allowed[source]??[];
|
||||
export function validateNormalFormPreparation(i:NormalFormPreparationInput){
|
||||
if(!i||i.version!==1||!['','accepted_pdf_and_m20a1'].includes(i.edition)||typeof i.reference!=='string'||typeof i.completenessReference!=='string'||!Array.isArray(i.allocations)||new Set(i.allocations.map(a=>a.id)).size!==i.allocations.length||i.allocations.some(a=>!a||Object.keys(newFormAllocation('')).some(k=>typeof a[k as keyof FormAllocation]!=='string')||a.account!==''&&!Object.hasOwn(m20Accounts,a.account))||!i.incomeTax||!['','known','absent'].includes(i.incomeTax.state)||!['','included','outside'].includes(i.incomeTax.placement)||typeof i.incomeTax.amount!=='string'||typeof i.incomeTax.reference!=='string'||!i.reducedRate||!['','known','absent'].includes(i.reducedRate.state)||typeof i.reducedRate.reference!=='string')throw Error('Preparação M20/M22 não recuperável;originais conservados.');
|
||||
}
|
||||
const zero=()=>fraction(0n),neg=(v:FiscalFraction)=>fraction(-BigInt(v.numerator),BigInt(v.denominator)),positive=(v:FiscalFraction)=>BigInt(v.numerator)>=0n;
|
||||
const eq=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)===BigInt(b.numerator)*BigInt(a.denominator);
|
||||
function money(s:string){if(!/^\d{1,18}(?:\.\d{1,6})?$/.test(s))throw Error('Montante não negativo conhecido em falta;zero não é presumido.');return decimalFraction(s);}
|
||||
export function normalFormRepresentation(v:FiscalFraction|null,unit:'whole'|'cent'='cent',parentheses=false){
|
||||
if(!v)return{exact:null,display:'Indeterminado',represented:null,ready:false,reason:'Valor em falta;sem zero presumido.'};
|
||||
const n=BigInt(v.numerator),d=BigInt(v.denominator);if(d<=0n)throw Error('Representação racional inválida.');const p=fractionPresentation(v),whole=n%d===0n,cent=n*100n%d===0n;
|
||||
const abs=n<0n?-n:n,scaled=abs*100n/d;const exact=n+'/'+d+' MZN',value=whole?(parentheses&&n<0n?'('+String(-n/d)+')':String(n/d)):unit==='cent'&¢?(n<0n?'-':'')+scaled/100n+'.'+String(scaled%100n).padStart(2,'0'):null;
|
||||
return{exact,display:whole?(value+' MZN'):(p.approximate?'≈':'')+p.decimal+' MZN (exacto '+n+'/'+d+')',represented:value,ready:value!==null,reason:whole?'Valor exacto em meticais inteiros,sem arredondamento.':unit==='whole'?'Exemplar M20 exige meticais sem centavos;regra de representação da fracção por corresponder.':cent?'Valor exacto ao cêntimo na preparação M22 já demonstrada;sem arredondamento fiscal ou declaração oficial presumidos.':'Fracção de cêntimo conservada;regra de representação fiscal por corresponder.'};
|
||||
}
|
||||
type Financial=ReturnType<typeof normalFinancialSource>;
|
||||
export function reuseDirectFormAllocations(source:Financial){return(source?.accountingLines??[]).filter(l=>['cost_of_sales','personnel','depreciation','interest_expense'].includes(l.code)).map(l=>({id:'source-'+l.code,sourceCode:l.code,account:allowed[l.code][0]as keyof typeof m20Accounts,amount:l.total,reference:'Reutilizado da linha financeira '+l.origin+';conferir completude da conta no suporte da preparação.'}));}
|
||||
type Model={accountingProfit:FiscalFraction|null;taxableProfit:FiscalFraction|null;taxableBase:FiscalFraction|null;colecta?:FiscalFraction|null;rows:Array<{rule:string;document:string;line:string;adjustment:FiscalFraction|null}>;schedules?:SchedulesModel;depreciation?:NormalDepreciationModel;costs?:NormalCostsModel;base?:NormalBaseModel};
|
||||
export function prepareNormalForms(input:NormalFormPreparationInput,m:Model,source:Financial){
|
||||
validateNormalFormPreparation(input);const pending:string[]=[],edition=input.edition==='accepted_pdf_and_m20a1'&&!!input.reference.trim();
|
||||
if(!edition)pending.push('Identifique os exemplares M22 PDF e M20A.1 inventariados;sem equivalência automática com as outras edições.');
|
||||
if(!input.completenessReference.trim())pending.push('Suporte da completude contabilística e discriminação da origem em falta.');
|
||||
const allocations=input.allocations.map(a=>{let value:FiscalFraction|null=null;const issues:string[]=[];try{value=money(a.amount);}catch(e){issues.push(String(e));}if(!normalFormAccountsFor(a.sourceCode).includes(a.account)||!source?.accountingLines.some(l=>l.code===a.sourceCode)||!a.reference.trim())issues.push('Origem/conta e suporte compatíveis por identificar.');return{...structuredClone(a),value:issues.length?null:value,reason:issues.join(' ')};});
|
||||
const lines=(source?.accountingLines??[]).map(l=>{const rows=allocations.filter(a=>a.sourceCode===l.code),sum=addFractions(rows.flatMap(a=>a.value?[a.value]:[])),ready=rows.length>0&&rows.every(a=>a.value!==null)&&eq(sum,money(l.total));const reason=ready?'Parcelas reconciliadas exactamente com a linha de origem.':'Discriminação em falta,incompleta ou superior à origem;sem duplicar montantes.';if(!ready)pending.push(l.origin+': '+reason);return{code:l.code,total:l.total,allocated:sum,ready,reason};});
|
||||
for(const a of allocations)if(a.reason)pending.push(a.id+': '+a.reason);
|
||||
if(!source)pending.push('Resultado financeiro do período/moeda em falta;preparação não cria um resultado substituto.');
|
||||
const tax=input.incomeTax;let bookTax:FiscalFraction|null=null;
|
||||
if(!tax.reference.trim()||!tax.state)pending.push('Imposto sobre rendimento contabilizado:valor/ausência e suporte por identificar;colecta não substitui gasto contabilístico.');
|
||||
else if(tax.state==='absent'){if(tax.amount.trim()||tax.placement)pending.push('Ausência de imposto contabilizado contradiz montante/localização preenchidos.');else bookTax=zero();}
|
||||
else{try{bookTax=money(tax.amount);if(!tax.placement)throw Error();}catch{bookTax=null;pending.push('Imposto contabilizado conhecido exige montante e indicação se já incluído ou exterior ao resultado do plano.');}}
|
||||
const allocatedTax=addFractions(allocations.filter(a=>a.account==='8.5'&&a.value).map(a=>a.value!));
|
||||
if(bookTax&&(!eq(allocatedTax,tax.placement==='included'?bookTax:zero()))){pending.push('Conta8.5 não reconciliada com imposto já incluído/exterior ao plano;sem subtracção duplicada.');bookTax=null;}
|
||||
const includedTaxEvidence=(m.schedules?.effects??[]).filter(e=>m.schedules!.input.rows.find(r=>r.id===e.id)?.rule==='tax_own');
|
||||
if(bookTax&&tax.placement!=='included'&&includedTaxEvidence.some(e=>e.effect&&BigInt(e.effect.numerator)>0n)){pending.push(tax.state==='absent'?'Ausência de imposto contabilizado contradiz imposto próprio já identificado nos custos do plano.':'Imposto incluído e exterior coexistem:discriminação das duas componentes ainda por corresponder;sem misturar ou subtrair duas vezes.');bookTax=null;}
|
||||
const classificationReady=edition&&!!input.completenessReference.trim()&&source!==null&&lines.length>0&&lines.every(l=>l.ready)&&allocations.every(a=>a.value!==null),outsideTax=bookTax&&tax.placement==='outside'?bookTax:zero();
|
||||
const m20=Object.entries(m20Accounts).map(([account,label])=>{const related=allocations.filter(a=>a.account===account),categorySources=Object.keys(allowed).filter(k=>allowed[k].includes(account));const complete=edition&&!!input.completenessReference.trim()&&source!==null&&categorySources.every(k=>lines.some(l=>l.code===k&&l.ready));let value=complete?addFractions(related.flatMap(a=>a.value?[a.value]:[])):null;if(account==='8.5')value=complete&&bookTax?bookTax:null;return{account,label,value,representation:normalFormRepresentation(value,'whole'),reference:related.map(a=>a.reference).join(' | '),reason:complete?'Classificação documentada e reconciliada no M20A.1/quadro4.':'Campo dependente da discriminação contabilística;sem zero por falta de parcelas.'};});
|
||||
const netResult=classificationReady&&bookTax&&m.accountingProfit?subtractFractions(m.accountingProfit,outsideTax):null;
|
||||
const entries:Array<{code:string|null;origin:string;value:FiscalFraction|null;reason:string}>=[];
|
||||
const add=(code:string|null,origin:string,value:FiscalFraction|null,reason='')=>entries.push({code,origin,value,reason});
|
||||
for(const r of m.rows)add(r.rule==='noncontractual_fine'||r.rule==='compensatory_interest'?'215':null,r.document+'/'+r.line,r.adjustment,'CIRPC36(1)c;PDF M22/quadro10 campo215.');
|
||||
for(const e of m.schedules?.effects??[]){const r=m.schedules!.input.rows.find(r=>r.id===e.id)!;if(['capital_in','capital_out'].includes(r.rule)&&e.effect&&eq(e.effect,zero()))continue;const code=({patrimonial_gain:'201',patrimonial_cost:'202',tax_other:'213',undocumented:'223'}as Record<string,string>)[r.rule]??null;add(code,r.document+'/'+r.line,e.effect,code?'Correspondência do rótulo do PDF M22.':r.rule==='tax_own'?'Imposto próprio36(1)a:campo específico por corresponder;campo213 do PDF refere apenas responsabilidade de outrem.':'Periodização/variação sem campo correspondido neste recorte;efeito preservado no cálculo.');}
|
||||
if(m.depreciation)for(const asset of m.depreciation.assets){const a=asset.adjustment;add(a&&positive(a)?'206':null,'Mapa de amortizações — '+asset.description,a,a&&positive(a)?'Reintegrações/amortizações não aceites:PDF campo206.':'Recuperação de quota anterior/ajustamento negativo:campo de dedução específico ainda por corresponder.');}
|
||||
else if(m.schedules?.depreciation){const a=m.schedules.depreciation;add(positive(a)?'206':null,'Amortizações do mapa inicial',a);}
|
||||
for(const r of m.costs?.rows??[]){const code=({allowance:'219',representation:'220',advertising:'221',vehicle:'226',fuel:'225',rental:'224',credit:'209',stock:'209',litigation:'209',taxed_reversal:'239'}as Record<string,string>)[r.rule]??null;add(code,r.document+'/'+r.line,r.adjustment,code?'Correspondência do tratamento demonstrado ao rótulo do PDF M22.':'Tratamento demonstrado sem campo específico correspondido;não usar campo livre por presunção.');}
|
||||
if(bookTax&&tax.placement==='outside')add(null,'Imposto contabilístico exterior ao plano',bookTax,'Imposto próprio36(1)a:campo específico por corresponder;213 do exemplar é de outrem. Resultado líquido conhecido,sem código presumido ou alteração do motor fiscal.');
|
||||
const ownTaxEffects=(m.schedules?.effects??[]).filter(e=>m.schedules!.input.rows.find(r=>r.id===e.id)?.rule==='tax_own');
|
||||
const includedTaxCorresponds=!bookTax||tax.placement!=='included'||ownTaxEffects.every(e=>e.effect!==null)&&eq(addFractions(ownTaxEffects.flatMap(e=>e.effect?[e.effect]:[])),bookTax);
|
||||
if(!includedTaxCorresponds)pending.push('Imposto já incluído agora discriminado não corresponde ao ajustamento tax_own existente;conferir esse caso sem alterar cálculos ou históricos.');
|
||||
const unmapped=entries.filter(e=>!e.code&&(!e.value||!eq(e.value,zero())));for(const e of unmapped)pending.push(e.origin+': '+e.reason);
|
||||
const field=(code:string,label:string,value:FiscalFraction|null,reason:string,notApplicable=false)=>({code,label,value,application:notApplicable?'not_applicable':value?'known':'missing',representation:notApplicable?{...normalFormRepresentation(null),display:'Sem aplicação',reason:'Lucro/perda conhecido:não preencher o campo de sinal oposto.'}:normalFormRepresentation(value),reason,transcriptionReady:edition&&code!=='200'&&normalFormRepresentation(value).ready});
|
||||
const mappedValue=(code:string,negative=false)=>{if(code==='206'&&m.depreciation?.adjustment===null)return null;const es=entries.filter(e=>e.code===code);if(es.some(e=>e.value===null)||!es.length&&m.taxableProfit===null)return null;const value=addFractions(es.flatMap(e=>e.value?[negative?neg(e.value):e.value]:[]));return positive(value)?value:null;};
|
||||
const fields=[field('200','Resultado do exercício',netResult,'Valor contabilístico reconciliado próprio;transporte automático M20→M22 impedido só pela divergência201/Q8 versus200/Q10.')];
|
||||
const labels:Record<string,string>={'201':'Variações patrimoniais positivas','202':'Variações patrimoniais negativas','206':'Amortizações não aceites','209':'Provisões/imparidade além dos limites','213':'Impostos e encargos da responsabilidade de outrem','215':'Multas e juros compensatórios','219':'Parcela não aceite de ajudas de custo','220':'Parcela não aceite de representação','221':'Publicidade além do limite','223':'Despesas não documentadas','224':'Parcela não aceite de aluguer','225':'Combustíveis sem prova/consumo normal','226':'Encargos não aceites com viaturas','239':'Reposição/redução de provisões tributadas'};
|
||||
for(const[code,label]of Object.entries(labels))fields.push(field(code,label,mappedValue(code,['202','239'].includes(code)),'PDF M22/quadro10;valor do ajustamento demonstrado,sem reaplicar percentagens do rótulo.'));
|
||||
const v=(code:string)=>fields.find(f=>f.code===code)!.value,patrimonial=netResult&&v('201')&&v('202')?subtractFractions(addFractions([netResult,v('201')!]),v('202')!):null;
|
||||
fields.push(field('203','Resultado após variações patrimoniais',patrimonial,'200+201−202,sem transferência entre edições.'));
|
||||
const up=entries.filter(e=>!['201','202'].includes(e.code??'')&&e.value&&positive(e.value)&&!eq(e.value,zero())),down=entries.filter(e=>!['201','202'].includes(e.code??'')&&e.value&&!positive(e.value));
|
||||
const sumsReady=includedTaxCorresponds&&m.taxableProfit!==null&&entries.every(e=>e.value!==null)&&unmapped.length===0&&patrimonial!==null;
|
||||
const additions=sumsReady?addFractions([patrimonial!,...up.map(e=>e.value!)]):null,deductions=sumsReady?addFractions(down.map(e=>neg(e.value!))):null,reconstructed=additions&&deductions?subtractFractions(additions,deductions):null;
|
||||
const matches=reconstructed!==null&&m.taxableProfit!==null&&eq(reconstructed,m.taxableProfit);if(reconstructed&&!matches)pending.push('Percurso M22 não reconcilia com o lucro tributável existente;rever localização do imposto e campos,sem alterar os cálculos demonstrados.');
|
||||
fields.push(field('238','Soma após acréscimos',additions,'Campo203+campos204–237;indeterminado se há efeito sem correspondência.'),field('258','Soma das deduções',deductions,'Campos239–257;sem presumir campo para dedução não correspondida.'));
|
||||
const p=m.taxableProfit,loss=p&&!positive(p)?neg(p):null,profit=p&&positive(p)?p:null;
|
||||
for(const[code,label,value]of [['259','Prejuízo fiscal',loss],['260','Lucro tributável',profit],['269','Prejuízo fiscal — regime geral',loss],['270','Lucro tributável — regime geral',profit],['276','Prejuízos fiscais deduzidos',m.base?.deductedLosses??null],['277','Benefícios fiscais a deduzir',m.base?.benefitDeduction??null],['278','Matéria colectável — regime geral',m.taxableBase],['300','Imposto à taxa normal',m.colecta??null]]as const)fields.push(field(code,label,value,'Reutiliza o cálculo demonstrado;campos independentes da divergência de transporte.',p!==null&&value===null&&['259','260','269','270'].includes(code)));
|
||||
const reducedAbsent=input.reducedRate.state==='absent'&&!!input.reducedRate.reference.trim();fields.push(field('301','Imposto à taxa reduzida',reducedAbsent?zero():null,'Ausência declarada com suporte;caso conhecido pertence aL7.'),field('302','Colecta total',reducedAbsent?m.colecta??null:null,'300+301 apenas com ausência de taxa reduzida demonstrada;sem saldoL8.'));
|
||||
if(!reducedAbsent)pending.push('Parcela de taxa reduzida em falta ou conhecida:colecta total302 depende desse âmbitoL7;colecta normal300 preservada.');
|
||||
fields.push(field('309–316','Liquidação e saldo final',null,'L8:retenções,pagamentos,créditos e saldo final não apurados.'));
|
||||
return{input:structuredClone(input),allocations,lines,m20,netResult,netRepresentation:normalFormRepresentation(netResult,'whole',true),entries,unmapped,fields,reconciliation:{reconstructedProfit:reconstructed,existingProfit:m.taxableProfit,matches},pending,source:'PDF M22 SHA2564b61bd83d1fbcfd3b7b5c5523cea5923f7d0f65dc4c004eff58e5db38f763c88,Q10–12;M20A.1 SHA2561ceca6f4c6d77853c1b2b445876599b42093175fa89eecf40590180956d83a9e,Q4/M12/D13–D35. Rótulos e estrutura reutilizados;sem valores de terceiros,fórmulas do exemplar ou submissão.',transport:{ready:false,reason:'M20A.1 D35 remete paraM22 campo201/quadro8;PDF M22 usa200/quadro10. Impedimento restrito ao transporte deste resultado;campos independentes continuam preparados.'}};
|
||||
}
|
||||
export type NormalFormPreparationModel=ReturnType<typeof prepareNormalForms>;
|
||||
export function normalFormPreparationReport(m:NormalFormPreparationModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Representação e preparação M20/M22',m.pending.join(' | ')||'Preparação parcial dos campos correspondidos;sem declaração oficial ou submissão.',m.source],...m.m20.map(f=>['IRPC normal — L6','M20 A.1 conta'+f.account+' — '+f.label,`${f.representation.display};exacto:${f.representation.exact??'Indeterminado'};representável:${f.representation.ready?'Sim':'Pendente'};${f.representation.reason}`,`${f.reference};${f.reason}`]as[string,string,string,string]),['IRPC normal — L6','Resultado líquido M20',m.netRepresentation.display+';'+m.netRepresentation.reason,'Imposto contabilístico identificado;sem usar colecta como despesa presumida.'],...m.fields.map(f=>['IRPC normal — L6','M22 PDF campo'+f.code+' — '+f.label,`${f.representation.display};exacto:${f.representation.exact??'Indeterminado'};preparação de transcrição:${f.transcriptionReady?'Exacta neste recorte':'Pendente/sem aplicação'};${f.representation.reason}`,f.reason]as[string,string,string,string]),...m.unmapped.map(e=>['IRPC normal — L6','Ajustamento sem campo correspondido — '+e.origin,normalFormRepresentation(e.value).display,e.reason]as[string,string,string,string]),['IRPC normal — L6','Transporte entre edições',m.transport.reason,`Lucro reconstruído:${normalFormRepresentation(m.reconciliation.reconstructedProfit).display};lucro existente:${normalFormRepresentation(m.reconciliation.existingProfit).display};reconciliação:${m.reconciliation.matches?'Exacta':'Pendente'};sem alteração de cálculos.`]];}
|
||||
@@ -0,0 +1,39 @@
|
||||
import {addFractions,fraction,type FiscalFraction} from './fiscal-rational.ts';
|
||||
import {convertIrpcAmount,irpcFxDependency,type IrpcFxAmount,type IrpcFxEvidence,irpcFxEvidenceLabel} from './irpc-fx.ts';
|
||||
import type {rawNormalFinancialSource} from './irpc-normal.ts';
|
||||
export const normalPeriodFxVersion='IRPC-normal-adjustments/8';
|
||||
export type NormalPeriodFxInput={version:1;kind:''|'annual'|'start'|'cessation'|'same_year'|'transition';from:string;to:string;planStart:string;reference:string;conversionReference:string;mznMapsReference:string;months:Array<IrpcFxAmount&{period:number}>};
|
||||
export const newNormalPeriodFx=():NormalPeriodFxInput=>({version:1,kind:'',from:'',to:'',planStart:'',reference:'',conversionReference:'',mznMapsReference:'',months:[]});
|
||||
export function validateNormalPeriodFx(i:NormalPeriodFxInput){
|
||||
if(!i||i.version!==1||!['','annual','start','cessation','same_year','transition'].includes(i.kind)||['from','to','planStart','reference','conversionReference','mznMapsReference'].some(k=>typeof i[k as 'from']!=='string')||!Array.isArray(i.months)||new Set(i.months.map(m=>m.period)).size!==i.months.length||i.months.some(m=>!Number.isSafeInteger(m.period)||m.period<1||typeof m.currency!=='string'||m.fxSelection!==undefined&&(!m.fxSelection||typeof m.fxSelection!=='object')||m.fxLink!==undefined&&(!m.fxLink||typeof m.fxLink.id!=='string'||typeof m.fxLink.fingerprint!=='string')))throw Error('Correspondência do período/moeda não recuperável;originais preservados.');
|
||||
}
|
||||
const iso=(s:string)=>/^20\d{2}-\d{2}-\d{2}$/.test(s)&&Number.isFinite(Date.parse(s))&&new Date(s).toISOString().slice(0,10)===s;
|
||||
const month=(s:string)=>Number(s.slice(0,4))*12+Number(s.slice(5,7))-1;
|
||||
const monthEnd=(s:string)=>{const d=new Date(s+'T00:00:00Z');d.setUTCMonth(d.getUTCMonth()+1,0);return d.toISOString().slice(0,10);};
|
||||
const amount=(v:FiscalFraction)=>{const n=BigInt(v.numerator)*100n,d=BigInt(v.denominator);if(n%d!==0n)throw Error('Conversão com fracção de cêntimo: representação fiscal por corresponder,sem arredondamento novo.');const c=n/d,a=c<0n?-c:c;return(c<0n?'-':'')+a/100n+'.'+String(a%100n).padStart(2,'0');};
|
||||
type Source=NonNullable<ReturnType<typeof rawNormalFinancialSource>>;
|
||||
export function mapNormalPeriodFx(d:Record<string,unknown>,input:NormalPeriodFxInput,raw:Source|null){
|
||||
validateNormalPeriodFx(input);const pending:string[]=[],short=input.kind!==''&&input.kind!=='annual';let count=0;
|
||||
if(!input.kind||!input.reference.trim())pending.push('Tipo,evento e suporte da correspondência do período por identificar.');
|
||||
if(!iso(input.from)||!iso(input.to)||input.from>input.to||!input.from.endsWith('-01')||monthEnd(input.to.slice(0,7)+'-01')!==input.to||!input.to.startsWith('2026-'))pending.push('Recorte:meses completos,termo em2026;datas parciais ou inválidas permanecem por corresponder.');
|
||||
else{count=month(input.to)-month(input.from)+1;if(count<1||count>12||short&&count>=12||!short&&count!==12)pending.push('Número de meses incompatível com o tipo de período.');}
|
||||
if(short&&(!input.from.startsWith('2026-')||input.kind==='start'&&input.to!=='2026-12-31'||['cessation','transition'].includes(input.kind)&&input.from!=='2026-01-01'))pending.push('Datas incompatíveis com início,cessação ou transição no ano civil2026.');
|
||||
if(!iso(input.planStart)||!input.planStart.endsWith('-01'))pending.push('Identifique o primeiro mês civil do plano;meses orçamentais não têm data fiscal presumida.');
|
||||
if(!input.mznMapsReference.trim())pending.push('Confirme que parcelas,activos,quotas,saldos e mapas fiscais existentes estão reconciliados emMZN com este período;sem converter novamente esses dados.');
|
||||
if(!raw)pending.push('Plano financeiro reconciliado em falta.');
|
||||
const selected=raw?.accountingLines[0]?.monthlyAmounts.filter(m=>iso(input.planStart)&&month(input.planStart)+m.period-1>=month(input.from)&&month(input.planStart)+m.period-1<=month(input.to))??[];
|
||||
if(selected.length!==count||!count)pending.push('Meses do plano não cobrem integralmente o período indicado;sem anualização ou preenchimento de meses em falta.');
|
||||
if(raw?.currency!=='MZN'&&!input.conversionReference.trim())pending.push('Identifique pressuposto documentado da conversão mensal para a simulação;selecção cambial não confirma,por si,a regra fiscal de conversão anual.');
|
||||
for(const m of input.months)if(!selected.some(x=>x.period===m.period))pending.push('Selecção cambial sem mês seleccionado no período: '+m.period);
|
||||
const rows:Array<{code:string;period:number;date:string;originalAmount:string;originalCurrency:string;value:FiscalFraction|null;evidence:IrpcFxEvidence|null;reason:string}>=[];
|
||||
const lines=raw?.accountingLines.map(l=>{const monthlyAmounts=l.monthlyAmounts.filter(m=>selected.some(x=>x.period===m.period)).map(m=>{let value:FiscalFraction|null=null,evidence:IrpcFxEvidence|null=null,reason='';const day=iso(input.planStart)?new Date(Date.UTC(Number(input.planStart.slice(0,4)),Number(input.planStart.slice(5,7))-1+m.period-1,1)).toISOString().slice(0,10):'';
|
||||
try{const sign=m.amount.startsWith('-')?-1n:1n,original=sign<0n?m.amount.slice(1):m.amount;const selection=input.months.find(x=>x.period===m.period);if(raw.currency!=='MZN'&&(!selection||selection.currency!==raw.currency))throw Error('Selecção cambial deste mês/moeda em falta;sem usar taxa de outro mês por defeito.');const converted=convertIrpcAmount(d,original,selection??{currency:'MZN'});value=fraction(BigInt(converted.value.numerator)*sign,BigInt(converted.value.denominator));evidence=converted.evidence;amount(value);}catch(e){value=null;reason=String(e);pending.push(l.code+'/mês'+m.period+': '+reason);}
|
||||
rows.push({code:l.code,period:m.period,date:day,originalAmount:m.amount,originalCurrency:raw.currency,value,evidence,reason});return{period:m.period,amount:value?amount(value):'0.00'};});
|
||||
const total=addFractions(rows.filter(r=>r.code===l.code&&r.value).map(r=>r.value!));return{...l,monthlyAmounts,total:amount(total)};
|
||||
})??[];
|
||||
const ready=pending.length===0;const profit=addFractions(lines.map(l=>{const f=rows.filter(r=>r.code===l.code&&r.value).map(r=>r.value!);const sum=addFractions(f);return l.accountingEffect==='income'?sum:fraction(-BigInt(sum.numerator),BigInt(sum.denominator));}));
|
||||
return{input:structuredClone(input),short,months:count,originalCurrency:raw?.currency??'',rows,pending,source:ready&&raw?{...raw,currency:'MZN',cashSchedule:raw.currency==='MZN'?raw.cashSchedule.filter(r=>selected.some(m=>m.period===r.period)):[],periods:count,accountingLines:lines,accountingProfitBeforeTax:amount(profit)}:null,rule:'CIRPC7(4)a–d;Decreto72/2013 art9(3)a–c para os casos correspondidos. Meses completos do plano,sem anualização. Conversão para simulação reutiliza mecanismo cambial entregue e pressupostos explícitos;sem confirmação fiscal anual presumida.'};
|
||||
}
|
||||
export type NormalPeriodFxModel=ReturnType<typeof mapNormalPeriodFx>;
|
||||
export function normalPeriodFxDependency(d:Record<string,unknown>,i:NormalPeriodFxInput){return i.months.map(m=>irpcFxDependency(d,m)).filter(Boolean).join(' | ');}
|
||||
export function normalPeriodFxReport(m:NormalPeriodFxModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Período e moeda do plano',`${m.input.from}–${m.input.to};${m.months}meses;origem:${m.originalCurrency};resultado emMZN:${m.source?.accountingProfitBeforeTax??'Indeterminado'};${m.originalCurrency!=='MZN'?'Conversão para simulação com pressupostos documentados;regra fiscal anual não confirmada automaticamente.':''}${m.pending.join(' | ')}`,`${m.input.reference};${m.input.conversionReference};${m.input.mznMapsReference};${m.rule}`],...m.rows.map(r=>['IRPC normal — L6',`${({revenue:'Receitas',cost_of_sales:'Custo das vendas',operating_expenses:'Despesas operacionais',personnel:'Pessoal',depreciation:'Depreciação contabilística',interest_expense:'Juros reconhecidos'}as Record<string,string>)[r.code]??r.code}/mês${r.period} (${r.date})`,`Original:${r.originalAmount} ${r.originalCurrency};MZN:${r.value?amount(r.value):'Indeterminado'};${r.reason}`,r.evidence?irpcFxEvidenceLabel(r.evidence):'OrigemMZN;sem conversão']as[string,string,string,string])];}
|
||||
@@ -1,3 +1,5 @@
|
||||
import type {NormalDepreciationModel} from './irpc-normal-depreciation.ts';
|
||||
import type {NormalCostsModel} from './irpc-normal-costs.ts';
|
||||
import type {SchedulesModel} from './irpc-normal-schedules.ts';
|
||||
import {addFractions,decimalFraction,fraction,type FiscalFraction} from './fiscal-rational.ts';
|
||||
|
||||
@@ -24,7 +26,7 @@ const zero=()=>fraction(0n,1n);
|
||||
function money(s:string){if(!/^-?\d+(?:\.\d{1,2})?$/.test(s))throw Error('Montante inválido');const v=decimalFraction(s.startsWith('-')?s.slice(1):s);return s.startsWith('-')?fraction(-BigInt(v.numerator),BigInt(v.denominator)):v;}
|
||||
const units=(f:FiscalFraction)=>BigInt(f.numerator)*100n/BigInt(f.denominator);
|
||||
const difference=(a:FiscalFraction,b:FiscalFraction)=>fraction(BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator),BigInt(a.denominator)*BigInt(b.denominator));
|
||||
export function closeNormalProfit(input:NormalProfitInput,source:Source|null,rows:Array<{sourceCode:string;adjustment:FiscalFraction|null;status:string}>,accounting:FiscalFraction|null,additions:FiscalFraction,contextReady:boolean,schedules?:SchedulesModel):NormalProfitModel{
|
||||
export function closeNormalProfit(input:NormalProfitInput,source:Source|null,rows:Array<{sourceCode:string;adjustment:FiscalFraction|null;status:string}>,accounting:FiscalFraction|null,additions:FiscalFraction,contextReady:boolean,schedules?:SchedulesModel,costs?:NormalCostsModel,depreciation?:NormalDepreciationModel):NormalProfitModel{
|
||||
validateNormalProfit(input);const pending:string[]=[],lines:NormalProfitModel['lines']=[],topics:NormalProfitModel['topics']=[];
|
||||
if(!contextReady)pending.push('Âmbito,exercício,moeda ou correspondência anual ainda insuficientes.');
|
||||
if(!input.completenessReference.trim())pending.push('Documente que o plano e os ajustamentos abrangem o sujeito passivo/exercício completo;uma oportunidade isolada não equivale automaticamente ao conjunto da empresa.');
|
||||
@@ -36,7 +38,7 @@ export function closeNormalProfit(input:NormalProfitInput,source:Source|null,row
|
||||
try{const amount=money(l.total);remainder=difference(amount,addedBack);if(units(amount)<0n||units(remainder)<0n)issues.push('Valor negativo ou acréscimos superiores à origem;reconcilie a linha sem compensação presumida.');
|
||||
if(!state||!reference.trim())issues.push('Conferência fiscal e suporte da linha em falta.');
|
||||
if(state==='absent'&&(units(amount)!==0n||units(addedBack)!==0n))issues.push('Ausência declarada contradiz o montante conhecido da origem.');
|
||||
if(state==='known'&&l.code==='depreciation'&&units(amount)!==0n&&schedules?.depreciation==null)issues.push('Depreciação contabilística conhecida;amortização fiscal por corresponder,não presumir igualdade.');
|
||||
if(state==='known'&&l.code==='depreciation'&&units(amount)!==0n&&(depreciation?depreciation.adjustment:schedules?.depreciation)==null)issues.push('Depreciação contabilística conhecida;amortização fiscal por corresponder,não presumir igualdade.');
|
||||
if(state==='known'&&l.code==='interest_expense'&&units(remainder)!==0n&&schedules?.interest==null)issues.push('Juros financeiros remanescentes conhecidos;dedutibilidade e eventuais limites por corresponder. Só os juros compensatórios já acrescidos estão cobertos.');
|
||||
if(!['revenue','cost_of_sales','operating_expenses','personnel','depreciation','interest_expense'].includes(l.code))issues.push('Linha financeira sem correspondência neste recorte.');
|
||||
}catch{issues.push('Montante da linha por reconciliar.');}
|
||||
@@ -49,12 +51,14 @@ export function closeNormalProfit(input:NormalProfitInput,source:Source|null,row
|
||||
if(!t.state||!t.reference.trim())reason='Informação em falta;sem zero presumido.';
|
||||
else if(t.state==='absent'){if(t.amount.trim())reason='Ausência declarada com montante preenchido;reconcilie os dois estados.';else{value=zero();reason='Ausência expressamente declarada com suporte;parcela zero apenas por esta declaração.';}}
|
||||
else{try{value=money(t.amount);if(units(value)!==0n)reason='Montante conhecido,mas tratamento específico ainda por corresponder;conservado sem aplicação presumida.';else reason='Valor conhecido zero com suporte;distinto de ausência declarada.';}catch{reason='Montante conhecido por preencher ou inválido.';}}
|
||||
const mapped=schedules?.effects.filter(e=>e.topic===key)??[];
|
||||
const covered=schedules&&mapped.length>0&&mapped.every(e=>e.effect!==null)&&value!==null&&t.state==='known'&&units(addFractions(mapped.flatMap(e=>e.amount?[e.amount]:[])))===units(value);
|
||||
const mapped=[...(schedules?.effects??[]),...(costs?.effects??[])].filter(e=>e.topic===key);
|
||||
const covered=(schedules||costs)&&mapped.length>0&&mapped.every(e=>e.effect!==null)&&value!==null&&t.state==='known'&&units(addFractions(mapped.flatMap(e=>e.amount?[e.amount]:[])))===units(value);
|
||||
if(covered)reason='Montante reconciliado com as regras do mapa complementar; efeito fiscal discriminado por linha.';
|
||||
if(value===null||units(value)!==0n&&!covered||t.state==='absent'&&!!t.amount.trim()||mapped.length>0&&!covered)pending.push(label+': '+(mapped.length&&!covered?'Mapa complementar não reconciliado com este estado/montante. ': '')+reason);
|
||||
topics.push({...structuredClone(t),key,label,value,reason});
|
||||
}
|
||||
if(schedules)pending.push(...schedules.pending);
|
||||
return{input:structuredClone(input),lines,topics,pending,taxableProfit:pending.length===0&&accounting?addFractions([accounting,additions,...(schedules?[schedules.net]:[])]):null,source:schedules?'CIRPC17/18/20/21/22/24/36; Decreto72/2013 art3–7. Mapa complementar de efeitos com sinal reconciliado por tema, juros financeiros ordinários e quotas anuais constantes documentadas. Simulação emMZN/2026; benefícios e casos especiais separados emL7, saldo anual emL8.':'CIRPC17(1)/18/20/22/36(1)c;recorte anual2026,residente geral,MZN. Resultado antes de imposto + acréscimos36(1)c;demais correcções/variações sem efeito apenas quando ausência ou zero conhecidos expressamente suportados. Receita/custos ordinários classificados pelo utilizador;depreciação fiscal e juros financeiros remanescentes fora deste percurso. Lucro tributável simulado,não matéria colectável,colecta ou declaraçãoM20/22.'};
|
||||
if(costs)pending.push(...costs.pending);
|
||||
if(depreciation&&!schedules)pending.push(...depreciation.pending);
|
||||
return{input:structuredClone(input),lines,topics,pending,taxableProfit:pending.length===0&&accounting?addFractions([accounting,additions,...(schedules?[schedules.net]:[]),...(costs?[costs.net]:[]),...(depreciation&&!schedules&&depreciation.adjustment?[depreciation.adjustment]:[])]):null,source:schedules?'CIRPC17/18/20/21/22/24/36; Decreto72/2013 art3–7. Mapa complementar de efeitos com sinal reconciliado por tema, juros financeiros ordinários e quotas anuais constantes documentadas. Simulação emMZN/2026; benefícios e casos especiais separados emL7, saldo anual emL8.':'CIRPC17(1)/18/20/22/36(1)c;recorte anual2026,residente geral,MZN. Resultado antes de imposto + acréscimos36(1)c;demais correcções/variações sem efeito apenas quando ausência ou zero conhecidos expressamente suportados. Receita/custos ordinários classificados pelo utilizador;depreciação fiscal e juros financeiros remanescentes fora deste percurso. Lucro tributável simulado,não matéria colectável,colecta ou declaraçãoM20/22.'};
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ const z=()=>fraction(0n);
|
||||
export const fiscalMoney=(s:string)=>{if(!/^\d{1,18}(?:\.\d{1,2})?$/.test(s))throw Error('Montante não negativo com até dois decimais necessário.');return decimalFraction(s);};
|
||||
const cmp=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator);
|
||||
export type SchedulesModel=ReturnType<typeof calculateSchedules>;
|
||||
export function calculateSchedules(s:NormalSchedules,source:{accountingLines:Array<{code:string;total:string;accountingEffect:string}>}|null,oldRows:Array<{sourceCode:string;document:string;line:string;amount:string;adjustment:FiscalFraction|null}>){
|
||||
export function calculateSchedules(s:NormalSchedules,source:{accountingLines:Array<{code:string;total:string;accountingEffect:string}>}|null,oldRows:Array<{sourceCode:string;document:string;line:string;amount:string;adjustment:FiscalFraction|null}>,depreciationOverride?:{value:FiscalFraction|null;pending:string[]}){
|
||||
validateSchedules(s);const pending:string[]=[],effects:Array<{id:string;topic:string;amount:FiscalFraction|null;effect:FiscalFraction|null;reason:string}>=[];
|
||||
for(const r of s.rows){const issues:string[]=[],rule=r.rule?scheduleRules[r.rule]:null;let amount:FiscalFraction|null=null,effect:FiscalFraction|null=null;
|
||||
if(!rule||!r.reference.trim()||!r.document.trim()||!r.line.trim()||r.conditions!=='yes')issues.push('Regra, documento/linha, suporte e condições por identificar.');
|
||||
@@ -56,7 +56,7 @@ export function calculateSchedules(s:NormalSchedules,source:{accountingLines:Arr
|
||||
}
|
||||
let interest:FiscalFraction|null=null;const interestOrigin=source?.accountingLines.find(l=>l.code==='interest_expense');
|
||||
try{const corrected=s.rows.filter(r=>r.sourceCode==='interest_expense'&&r.rule&&(scheduleRules[r.rule][1]==='expenseCorrections'||r.rule==='future_cost'));const corrections=corrected.map(r=>{const e=effects.find(e=>e.id===r.id);if(!e?.effect)throw Error();return e.effect;});const remaining=subtractFractions(fiscalMoney(interestOrigin?.total??''),addFractions([...oldRows.filter(r=>r.sourceCode==='interest_expense').flatMap(r=>r.adjustment?[r.adjustment]:[]),...corrections]));interest=fiscalMoney(s.interest.amount);if(cmp(interest,remaining)!==0n||!s.interest.reference.trim()||s.interest.conditions!=='yes')throw Error();}catch{interest=null;}
|
||||
const assets=s.assets.map(a=>{const issues:string[]=[];let accounting:FiscalFraction|null=null,fiscal:FiscalFraction|null=null,adjustment:FiscalFraction|null=null;
|
||||
const assets=(depreciationOverride?[]:s.assets).map(a=>{const issues:string[]=[];let accounting:FiscalFraction|null=null,fiscal:FiscalFraction|null=null,adjustment:FiscalFraction|null=null;
|
||||
try{const cost=fiscalMoney(a.cost),residual=fiscalMoney(a.residual),previous=fiscalMoney(a.previousFiscal),rate=fiscalMoney(a.rate);accounting=fiscalMoney(a.accounting);const depreciable=subtractFractions(cost,residual);if(cmp(depreciable,z())<0n||cmp(previous,depreciable)>0n||cmp(rate,z())<=0n||cmp(rate,fraction(100n))>0n)throw Error();const annual=fraction(BigInt(depreciable.numerator)*BigInt(rate.numerator),BigInt(depreciable.denominator)*BigInt(rate.denominator)*100n);const available=subtractFractions(depreciable,previous);fiscal=cmp(annual,available)>0n?available:annual;
|
||||
if(cmp(fiscal,accounting)>0n)issues.push('Quota fiscal superior à contabilizada neste exercício; dedução de quotas anteriormente tributadas exige mapa próprio, sem presunção.');
|
||||
}catch{issues.push('Custo, residual, taxa, acumulado fiscal e depreciação contabilizada por reconciliar.');}
|
||||
@@ -64,8 +64,9 @@ export function calculateSchedules(s:NormalSchedules,source:{accountingLines:Arr
|
||||
if(!/^20\d{2}-\d{2}-\d{2}$/.test(a.inUseFrom)||!Number.isFinite(Date.parse(a.inUseFrom))||new Date(a.inUseFrom).toISOString().slice(0,10)!==a.inUseFrom||a.inUseFrom>(s.period.from||'2026-01-01')||a.inUseFrom<'2014-01-01'||!a.description.trim()||!a.tableReference.trim()||!a.reference.trim()||a.conditions!=='yes')issues.push('Identifique activo próprio, em uso no início do período, tabela/taxa aplicável, vida útil e condições do método constante anual; casos especiais/duodécimos separados.');
|
||||
if(['computer','server'].includes(a.category)&&/^20\d{2}-\d{2}-\d{2}$/.test(a.inUseFrom)){const limit=new Date(a.inUseFrom+'T00:00:00Z');if(Number.isFinite(+limit)){limit.setUTCFullYear(limit.getUTCFullYear()+(a.category==='computer'?8:10));if((s.period.from||'2026-01-01')>=limit.toISOString().slice(0,10))issues.push('Período máximo de vida útil excedido, artigo5; excepção específica não implementada.');}}
|
||||
if(!issues.length&&accounting&&fiscal)adjustment=subtractFractions(accounting,fiscal);if(issues.length)pending.push(a.description+': '+issues.join(' '));return{...structuredClone(a),accountingValue:accounting,fiscal,adjustment,reason:issues.join(' ')||'Decreto72/2013 art3–7; quota constante anual documentada, limitada ao saldo fiscal depreciável; diferença para a depreciação contabilística.'};});
|
||||
let depreciation:FiscalFraction|null=null;try{const total=addFractions(assets.map(a=>a.accountingValue??z()));if(s.assetsReference.trim()&&assets.every(a=>a.adjustment!==null)&&cmp(total,fiscalMoney(source?.accountingLines.find(l=>l.code==='depreciation')?.total??''))===0n)depreciation=addFractions(assets.map(a=>a.adjustment!));}catch{/* linha de origem desconhecida */}
|
||||
let depreciation:FiscalFraction|null=depreciationOverride?.value??null;if(!depreciationOverride)try{const total=addFractions(assets.map(a=>a.accountingValue??z()));if(s.assetsReference.trim()&&assets.every(a=>a.adjustment!==null)&&cmp(total,fiscalMoney(source?.accountingLines.find(l=>l.code==='depreciation')?.total??''))===0n)depreciation=addFractions(assets.map(a=>a.adjustment!));}catch{/* linha de origem desconhecida */}
|
||||
if(assets.length&&(oldRows.some(r=>r.sourceCode==='depreciation')||s.rows.some(r=>r.sourceCode==='depreciation'))){depreciation=null;pending.push('Depreciação repartida entre mapas de ajustamentos e activos: reconcilie as parcelas sem sobreposição antes de aplicar a quota fiscal.');}
|
||||
if(assets.length&&depreciation===null)pending.push('Mapa de activos sem reconciliação integral com a depreciação da origem; efeito fiscal não aplicado.');
|
||||
if(depreciationOverride)pending.push(...depreciationOverride.pending);
|
||||
return{input:structuredClone(s),effects,interest,depreciation,assets,pending,net: addFractions([...effects.flatMap(r=>r.effect?[r.effect]:[]),...(depreciation?[depreciation]:[])]),source:'CIRPC18/21/22/24/36; Decreto72/2013 art3–7. Entradas documentadas, sem taxas de activos sugeridas nem casos especiais presumidos.'};
|
||||
}
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
import {irpcSpecialCombinationsVersion} from './irpc-special-combinations.ts';
|
||||
import {irpcSpecialVersion,irpcSpecialMonthlyVersion,irpcSpecialStartPeriodVersion,irpcSpecialCessationPriorVersion,specialCalculationVersion,validateSpecial,calculateSpecial,specialReportRows,specialDependency,type SpecialInput,type SpecialModel} from './irpc-special.ts';
|
||||
import {normalFormPreparationVersion,validateNormalFormPreparation,prepareNormalForms,normalFormPreparationReport,type NormalFormPreparationInput,type NormalFormPreparationModel} from './irpc-normal-form-preparation.ts';
|
||||
import {normalPeriodFxVersion,validateNormalPeriodFx,mapNormalPeriodFx,normalPeriodFxDependency,normalPeriodFxReport,type NormalPeriodFxInput,type NormalPeriodFxModel} from './irpc-normal-period-fx.ts';
|
||||
import {normalDepreciationVersion,validateNormalDepreciation,calculateNormalDepreciation,normalDepreciationReport,type NormalDepreciationInput,type NormalDepreciationModel} from './irpc-normal-depreciation.ts';
|
||||
import {normalCostsVersion,validateNormalCosts,calculateNormalCosts,normalCostReport,type NormalCostsInput,type NormalCostsModel} from './irpc-normal-costs.ts';
|
||||
import {normalFormFields} from './irpc-normal-forms.ts';
|
||||
import {normalSchedulesVersion,normalSchedulePeriod,validateSchedules,calculateSchedules,type NormalSchedules,type SchedulesModel} from './irpc-normal-schedules.ts';
|
||||
import {normalAssessmentVersion,validateNormalAssessment,calculateNormalAssessment,type NormalAssessmentInput,type NormalAssessmentModel} from './irpc-normal-assessment.ts';
|
||||
@@ -11,18 +17,24 @@ import {addFractions,decimalFraction,fraction,fractionPresentation,type FiscalFr
|
||||
export const irpcNormalVersion='IRPC-normal-adjustments/1';
|
||||
export const irpcNormalSource='CIRPC Lei34/2007 art17(1),PDF6/p768(60):resultado e correcções;art36(1)c,PDF10/p768(64):multas e encargos por infracções sem origem contratual,incluindo juros compensatórios. Lei4/2012 PDF2 altera17(6)/acrescenta36(1)o;Lei19/2013 PDF2 mantém36(1)a–o e acrescenta p/q. Lei12/2025 altera3/5/20/62/67/75,adita61-A e revoga39/47/75(2)/76;sem alteração deste recorte36(1)c. Não é apuramento integral nem Modelo20/22.';
|
||||
export type NormalAdjustment={id:string;sourceCode:string;document:string;line:string;amount:string;rule:''|'noncontractual_fine'|'compensatory_interest'|'other';included:''|'yes'|'no';reference:string};
|
||||
export type NormalBook={version:1;year:string;mappingReference:string;scope:''|'resident_general'|'ep_general'|'other';scopeReference:string;rows:NormalAdjustment[];profit?:NormalProfitInput;base?:NormalBaseInput;assessment?:NormalAssessmentInput;schedules?:NormalSchedules;result?:NormalRecord;history?:NormalRecord[]};
|
||||
type NormalModel={fiscalPeriod?:ReturnType<typeof normalSchedulePeriod>;schedules?:SchedulesModel;currentLoss?:FiscalFraction|null;assessment?:NormalAssessmentModel;colecta?:FiscalFraction|null;base?:NormalBaseModel;profit?:NormalProfitModel;version:string;year:string;currency:string;origin:'projected';accountingProfit:FiscalFraction|null;additions:FiscalFraction;partialAdjustedResult:FiscalFraction|null;taxableProfit:FiscalFraction|null;taxableBase:FiscalFraction|null;tax:null;rows:Array<NormalAdjustment&{status:'calculated'|'indeterminate'|'outside_scope';adjustment:FiscalFraction|null;reason:string}>;pending:string[];source:string};
|
||||
export type NormalBook={version:1;year:string;mappingReference:string;scope:''|'resident_general'|'ep_general'|'other';scopeReference:string;rows:NormalAdjustment[];special?:SpecialInput;profit?:NormalProfitInput;base?:NormalBaseInput;assessment?:NormalAssessmentInput;schedules?:NormalSchedules;costs?:NormalCostsInput;depreciation?:NormalDepreciationInput;forms?:NormalFormPreparationInput;periodsFx?:NormalPeriodFxInput;result?:NormalRecord;history?:NormalRecord[]};
|
||||
export type NormalModel={special?:SpecialModel;formPreparation?:NormalFormPreparationModel;periodsFx?:NormalPeriodFxModel;depreciation?:NormalDepreciationModel;costs?:NormalCostsModel;fiscalPeriod?:{kind:string;from:string;to:string;reference:string;pending:string[]};schedules?:SchedulesModel;currentLoss?:FiscalFraction|null;assessment?:NormalAssessmentModel;colecta?:FiscalFraction|null;base?:NormalBaseModel;profit?:NormalProfitModel;version:string;year:string;currency:string;origin:'projected';accountingProfit:FiscalFraction|null;additions:FiscalFraction;partialAdjustedResult:FiscalFraction|null;taxableProfit:FiscalFraction|null;taxableBase:FiscalFraction|null;tax:null;rows:Array<NormalAdjustment&{status:'calculated'|'indeterminate'|'outside_scope';adjustment:FiscalFraction|null;reason:string}>;pending:string[];source:string};
|
||||
type NormalRecord={key:string;createdAt:string;model:NormalModel};
|
||||
export const newNormalBook=():NormalBook=>({version:1,year:'',mappingReference:'',scope:'',scopeReference:'',rows:[]});
|
||||
export const newNormalAdjustment=(id:string):NormalAdjustment=>({id,sourceCode:'',document:'',line:'',amount:'',rule:'',included:'',reference:''});
|
||||
export function normalFinancialSource(d:Record<string,unknown>){
|
||||
export function rawNormalFinancialSource(d:Record<string,unknown>){
|
||||
const p=restoreBusinessPlanSnapshot(String(d.business_plan_snapshot??''));if(!p)return null;
|
||||
const forecast=forecastBusinessPlan(p),bridge=buildFinancialFiscalBridge(forecast);
|
||||
return{...bridge,periods:forecast.rows.length,origin:'projected' as const,scope:acquisitionScope(d)};
|
||||
}
|
||||
export function normalFinancialSource(d:Record<string,unknown>){const raw=rawNormalFinancialSource(d),input=normalBook(d).periodsFx;return input?mapNormalPeriodFx(d,input,raw).source:raw;}
|
||||
function store(d:Record<string,unknown>){const s=JSON.parse(String(d.modelo_a_snapshot||'{"version":1,"books":{}}'));if(s.version!==1||!s.books||typeof s.books!=='object'||Array.isArray(s.books))throw Error('Livros fiscais não recuperáveis;originais preservados.');return s;}
|
||||
export function validateNormal(b:NormalBook){
|
||||
if(b?.special!==undefined)validateSpecial(b.special);
|
||||
if(b?.forms!==undefined)validateNormalFormPreparation(b.forms);
|
||||
if(b?.periodsFx!==undefined)validateNormalPeriodFx(b.periodsFx);
|
||||
if(b?.depreciation!==undefined)validateNormalDepreciation(b.depreciation);
|
||||
if(b?.costs!==undefined)validateNormalCosts(b.costs);
|
||||
if(b?.schedules!==undefined)validateSchedules(b.schedules);
|
||||
if(b?.assessment!==undefined)validateNormalAssessment(b.assessment);
|
||||
if(b?.base!==undefined)validateNormalBase(b.base);
|
||||
@@ -30,23 +42,27 @@ export function validateNormal(b:NormalBook){
|
||||
if(!b||b.version!==1||['year','mappingReference','scopeReference'].some(k=>typeof b[k as 'year']!=='string')||!['','resident_general','ep_general','other'].includes(b.scope)||!Array.isArray(b.rows)||b.history!==undefined&&!Array.isArray(b.history))throw Error('Preparação IRPC normal não recuperável.');
|
||||
for(const r of b.rows)if(!r||Object.keys(newNormalAdjustment('')).some(k=>typeof r[k as keyof NormalAdjustment]!=='string')||!['','noncontractual_fine','compensatory_interest','other'].includes(r.rule)||!['','yes','no'].includes(r.included))throw Error('Ajustamento IRPC não recuperável;original conservado.');
|
||||
if(new Set(b.rows.map(r=>r.id)).size!==b.rows.length)throw Error('Identificador de ajustamento duplicado.');
|
||||
for(const r of [b.result,...(b.history??[])])if(r&&(!r.model||![irpcNormalVersion,normalProfitVersion,normalBaseVersion,normalAssessmentVersion,normalSchedulesVersion].includes(r.model.version)||typeof r.key!=='string'||typeof r.createdAt!=='string'||!Array.isArray(r.model.rows)||!Array.isArray(r.model.pending)))throw Error('Histórico IRPC normal não recuperável.');
|
||||
for(const r of [b.result,...(b.history??[])])if(r&&(!r.model||![irpcSpecialCombinationsVersion,irpcSpecialStartPeriodVersion,irpcSpecialCessationPriorVersion,irpcSpecialMonthlyVersion,irpcSpecialVersion,irpcNormalVersion,normalProfitVersion,normalBaseVersion,normalAssessmentVersion,normalSchedulesVersion,normalCostsVersion,normalDepreciationVersion,normalPeriodFxVersion,normalFormPreparationVersion].includes(r.model.version)||typeof r.key!=='string'||typeof r.createdAt!=='string'||!Array.isArray(r.model.rows)||!Array.isArray(r.model.pending)))throw Error('Histórico IRPC normal não recuperável.');
|
||||
}
|
||||
export function normalBook(d:Record<string,unknown>):NormalBook{
|
||||
const m=store(d).irpcNormal;if(m===undefined)return newNormalBook();if(!m||typeof m!=='object'||Array.isArray(m))throw Error('Mapa IRPC normal não recuperável.');const b=m[acquisitionScope(d)]??newNormalBook();validateNormal(b);return b;
|
||||
}
|
||||
export function saveNormalBook(d:Record<string,unknown>,b:NormalBook){validateNormal(b);const s=store(d);if(s.irpcNormal!==undefined&&(!s.irpcNormal||typeof s.irpcNormal!=='object'||Array.isArray(s.irpcNormal)))throw Error('Mapa IRPC normal não recuperável.');return JSON.stringify({...s,irpcNormal:{...s.irpcNormal,[acquisitionScope(d)]:b}});}
|
||||
function key(d:Record<string,unknown>,b:NormalBook){return JSON.stringify([b.schedules?normalSchedulesVersion:b.assessment?normalAssessmentVersion:b.base?normalBaseVersion:b.profit?normalProfitVersion:irpcNormalVersion,acquisitionScope(d),d.business_plan_snapshot??'',b.year,b.mappingReference,b.scope,b.scopeReference,b.rows,...(b.profit?[b.profit]:[]),...(b.base?[b.base]:[]),...(b.assessment?[b.assessment]:[]),...(b.schedules?[b.schedules]:[])]);}
|
||||
function key(d:Record<string,unknown>,b:NormalBook){return JSON.stringify([b.special?specialCalculationVersion(b.special):b.forms?normalFormPreparationVersion:b.periodsFx?normalPeriodFxVersion:b.depreciation?normalDepreciationVersion:b.costs?normalCostsVersion:b.schedules?normalSchedulesVersion:b.assessment?normalAssessmentVersion:b.base?normalBaseVersion:b.profit?normalProfitVersion:irpcNormalVersion,acquisitionScope(d),d.business_plan_snapshot??'',b.year,b.mappingReference,b.scope,b.scopeReference,b.rows,...(b.profit?[b.profit]:[]),...(b.base?[b.base]:[]),...(b.assessment?[b.assessment]:[]),...(b.schedules?[b.schedules]:[]),...(b.costs?[b.costs]:[]),...(b.depreciation?[b.depreciation]:[]),...(b.periodsFx?[b.periodsFx,normalPeriodFxDependency(d,b.periodsFx)]:[]),...(b.forms?[b.forms]:[]),...(b.special?[b.special,specialDependency(d)]:[])]);}
|
||||
export function normalCurrent(d:Record<string,unknown>,b:NormalBook){return !!b.result&&b.result.key===key(d,b);}
|
||||
const zero=()=>fraction(0n,1n);
|
||||
const cents=(s:string)=>{if(!/^-?\d+(?:\.\d{1,2})?$/.test(s))throw Error('Montante MZN inválido;máximo dois decimais.');const v=decimalFraction(s.startsWith('-')?s.slice(1):s);return s.startsWith('-')?fraction(-BigInt(v.numerator),BigInt(v.denominator)):v;};
|
||||
const integerCents=(v:FiscalFraction)=>BigInt(v.numerator)*100n/BigInt(v.denominator);
|
||||
export function calculateNormal(d:Record<string,unknown>,b:NormalBook):NormalModel{
|
||||
validateNormal(b);const pending:string[]=[],source=normalFinancialSource(d),fiscalPeriod=b.schedules?normalSchedulePeriod(b.schedules,b.scope):undefined;
|
||||
validateNormal(b);const pending:string[]=[],raw=rawNormalFinancialSource(d),periodsFx=b.periodsFx?mapNormalPeriodFx(d,b.periodsFx,raw):undefined,source=periodsFx?periodsFx.source:raw,fiscalPeriod=periodsFx?{kind:b.periodsFx!.kind,from:b.periodsFx!.from,to:b.periodsFx!.to,reference:b.periodsFx!.reference,pending:periodsFx.pending}:b.schedules?normalSchedulePeriod(b.schedules,b.scope):undefined;
|
||||
if(periodsFx&&b.periodsFx!.kind==='annual'&&b.periodsFx!.from!=='2026-01-01'){
|
||||
const formal=b.schedules?normalSchedulePeriod(b.schedules,b.scope):null;
|
||||
if(!formal||formal.pending.length||formal.from!==b.periodsFx!.from||formal.to!==b.periodsFx!.to)fiscalPeriod!.pending.push('Ano diferente do civil exige o período autorizado/comunicado já documentado nos mapas,com as mesmas datas.');
|
||||
}
|
||||
if(fiscalPeriod)pending.push(...fiscalPeriod.pending);
|
||||
if(!source)pending.push('Falta plano financeiro reconciliado.');
|
||||
if(source?.currency!=='MZN')pending.push('Ponte em MZN necessária;sem conversão fiscal anual presumida.');
|
||||
if(!/^2026$/.test(b.year)||!b.mappingReference.trim()||source?.periods!==12)pending.push('Documente correspondência dos 12 meses do plano ao exercício2026;outros exercícios/horizontes permanecem separados.');
|
||||
if(!/^2026$/.test(b.year)||!b.mappingReference.trim()||source?.periods!==(periodsFx?.months??12))pending.push('Documente correspondência dos 12 meses do plano ao exercício2026;outros exercícios/horizontes permanecem separados.');
|
||||
if(!(b.scope==='resident_general'||b.schedules&&b.scope==='ep_general')||!b.scopeReference.trim())pending.push('Identifique sujeito residente no regime geral,fora de transparência/regimes especiais;EP e outros âmbitos não abrangidos.');
|
||||
const rows:NormalModel['rows']=b.rows.map(r=>({...structuredClone(r),status:'indeterminate',adjustment:null,reason:''}));
|
||||
const amounts=new Map<string,FiscalFraction>(),groups=new Map<string,NormalModel['rows']>();
|
||||
@@ -67,22 +83,28 @@ export function calculateNormal(d:Record<string,unknown>,b:NormalBook):NormalMod
|
||||
for(const r of rows){if(!r.reason){r.status='calculated';r.adjustment=amounts.get(r.id)!;r.reason='Acréscimo integral de custo incluído no resultado de partida,qualificado pelo utilizador como '+(r.rule==='noncontractual_fine'?'multa/encargo de infracção sem origem contratual':'juros compensatórios')+';CIRPC36(1)c. Projecção pelos pressupostos do plano.';}else pending.push(r.document+': '+r.reason);}
|
||||
const additions=addFractions(rows.flatMap(r=>r.adjustment?[r.adjustment]:[]));
|
||||
const accountingProfit=source?.currency==='MZN'?cents(source.accountingProfitBeforeTax):null;
|
||||
const contextReady=(!fiscalPeriod||fiscalPeriod.pending.length===0)&&!!source&&source.currency==='MZN'&&source.periods===12&&b.year==='2026'&&!!b.mappingReference.trim()&&(b.scope==='resident_general'||!!b.schedules&&b.scope==='ep_general')&&!!b.scopeReference.trim();
|
||||
const contextReady=(!fiscalPeriod||fiscalPeriod.pending.length===0)&&!!source&&source.currency==='MZN'&&source.periods===(periodsFx?.months??12)&&b.year==='2026'&&!!b.mappingReference.trim()&&(b.scope==='resident_general'||!!b.schedules&&b.scope==='ep_general')&&!!b.scopeReference.trim();
|
||||
if(rows.length===0&&!b.profit)pending.push('Sem ajustamentos documentados;ausência de registos não prova inexistência de correcções.');
|
||||
if(!b.profit)pending.push('L6 parcial:resultado ajustado apenas destes acréscimos;restantes custos/variações patrimoniais,amortizações,perdas,deduções e colecta por tratar. Lucro tributável,matéria colectável e imposto indeterminados.');
|
||||
const schedules=b.schedules?calculateSchedules(b.schedules,source,rows):undefined;
|
||||
const profit=b.profit?closeNormalProfit(b.profit,source,rows,accountingProfit,additions,contextReady,schedules):undefined;
|
||||
const depreciation=b.depreciation?calculateNormalDepreciation(b.depreciation,source,fiscalPeriod??{from:b.year+'-01-01',to:b.year+'-12-31'},[...b.rows,...(b.schedules?.rows??[]),...(b.costs?.rows??[])],!!periodsFx?.short):undefined;
|
||||
const schedules=b.schedules?calculateSchedules(b.schedules,source,rows,depreciation?{value:depreciation.adjustment,pending:depreciation.pending}:undefined):undefined;
|
||||
const costs=b.costs?calculateNormalCosts(b.costs,source,[...b.rows,...(b.schedules?.rows??[])],fiscalPeriod??{from:'2026-01-01',to:b.year+'-12-31'},!!periodsFx?.short):undefined;
|
||||
const profit=b.profit?closeNormalProfit(b.profit,source,rows,accountingProfit,additions,contextReady,schedules,costs,depreciation):undefined;
|
||||
if(profit&&periodsFx)profit.source='CIRPC17/18/20/21/22/24/36;'+periodsFx.rule+' L7 mantém benefícios/casos especiais;L8 mantém saldo final.';
|
||||
if(profit)pending.push(...profit.pending,...(!b.base?['Matéria colectável,perdas reportadas,deduções e imposto não apurados neste percurso.']:[]));
|
||||
const base=b.base?calculateNormalBase(b.base,profit?.taxableProfit??null,b.year,b.schedules?.currentLossReference):undefined;
|
||||
const base=b.base?calculateNormalBase(b.base,profit?.taxableProfit??null,b.year,b.schedules?.currentLossReference,!!periodsFx?.short):undefined;
|
||||
if(base)pending.push(...base.pending,...(!b.assessment?['Colecta/imposto a pagar,créditos anuais eM20/M22 não determinados;matéria colectável não é imposto.']:[]));
|
||||
const assessment=b.assessment?calculateNormalAssessment(b.assessment,base?.taxableBase??null,{year:b.year,scope:b.scope,extended:!!b.schedules,currency:source?.currency??'',...(fiscalPeriod?{period:{from:fiscalPeriod.from,to:fiscalPeriod.to}}:{})}):undefined;
|
||||
const assessment=b.assessment?calculateNormalAssessment(b.assessment,base?.taxableBase??null,{year:b.year,scope:b.scope,extended:!!b.schedules||!!periodsFx,short:!!periodsFx?.short,currency:source?.currency??'',...(fiscalPeriod?{period:{from:fiscalPeriod.from,to:fiscalPeriod.to}}:{})}):undefined;
|
||||
if(assessment)pending.push(...assessment.pending,assessment.finalBalance.reason);
|
||||
const currentLoss=b.schedules&&profit?.taxableProfit&&BigInt(profit.taxableProfit.numerator)<0n?fraction(-BigInt(profit.taxableProfit.numerator),BigInt(profit.taxableProfit.denominator)):null;
|
||||
return{...(schedules?{schedules,currentLoss,fiscalPeriod}:{}),...(assessment?{assessment,colecta:assessment.colecta}:{}),...(base?{base}:{}),...(profit?{profit}:{}),version:b.schedules?normalSchedulesVersion:b.assessment?normalAssessmentVersion:b.base?normalBaseVersion:b.profit?normalProfitVersion:irpcNormalVersion,year:b.year,currency:source?.currency??'',origin:'projected',accountingProfit,additions,partialAdjustedResult:contextReady&&rows.length>0&&rows.every(r=>r.status==='calculated')&&accountingProfit?addFractions([accountingProfit,additions]):null,taxableProfit:profit?.taxableProfit??null,taxableBase:base?.taxableBase??null,tax:null,rows,pending,source:irpcNormalSource+(b.schedules?' Mapas complementares: CIRPC18/21/22/24/36; Decreto72/2013 art3–7. EP: CIRPC15(1)c, apenas resultado imputável ao estabelecimento no regime geral, anual2026/MZN.':'')};
|
||||
const model:NormalModel={...(periodsFx?{periodsFx}:{}),...(depreciation?{depreciation}:{}),...(costs?{costs}:{}),...(schedules?{schedules,currentLoss,fiscalPeriod}:{}),...(assessment?{assessment,colecta:assessment.colecta}:{}),...(base?{base}:{}),...(profit?{profit}:{}),version:b.special?specialCalculationVersion(b.special):b.forms?normalFormPreparationVersion:b.periodsFx?normalPeriodFxVersion:b.depreciation?normalDepreciationVersion:b.costs?normalCostsVersion:b.schedules?normalSchedulesVersion:b.assessment?normalAssessmentVersion:b.base?normalBaseVersion:b.profit?normalProfitVersion:irpcNormalVersion,year:b.year,currency:source?.currency??'',origin:'projected',accountingProfit,additions,partialAdjustedResult:contextReady&&rows.length>0&&rows.every(r=>r.status==='calculated')&&accountingProfit?addFractions([accountingProfit,additions]):null,taxableProfit:profit?.taxableProfit??null,taxableBase:base?.taxableBase??null,tax:null,rows,pending,source:irpcNormalSource+(periodsFx?' '+periodsFx.rule:b.schedules?' Mapas complementares: CIRPC18/21/22/24/36; Decreto72/2013 art3–7. EP: CIRPC15(1)c, apenas resultado imputável ao estabelecimento no regime geral, anual2026/MZN.':'')};
|
||||
if(b.special)model.special=calculateSpecial(d,b,model,source);
|
||||
if(b.forms){model.formPreparation=prepareNormalForms(b.forms,model,source);model.pending.push(...model.formPreparation.pending.map(p=>'Preparação M20/M22: '+p));}
|
||||
return model;
|
||||
}
|
||||
export function recordNormal(d:Record<string,unknown>,b:NormalBook,now=new Date().toISOString()):NormalBook{return{...b,history:b.result?[...(b.history??[]),structuredClone(b.result)]:b.history??[],result:{key:key(d,b),createdAt:now,model:calculateNormal(d,b)}};}
|
||||
const money=(v:FiscalFraction|null)=>v?fractionPresentation(v).decimal+' MZN':'Indeterminado';
|
||||
function normalBaseReport(m:NormalBaseModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Matéria colectável — deduções/perdas',`Lucro tributável:${money(m.taxableProfit)};perdas propostas elegíveis:${money(m.requestedLosses)};perdas deduzidas nesta simulação:${money(m.deductedLosses)};benefícios deduzidos:${money(m.benefitDeduction)};matéria colectável simulada:${money(m.taxableBase)};imposto a pagar:Indeterminado. ${m.pending.join(' | ')}`,`NUIT:${m.input.subjectNuit};${m.input.identityReference};método:${m.input.method==='direct'?'Declarativo/directo':m.input.method==='indirect'?'Indirecto':'Por identificar'};${m.input.methodReference};perdas:${m.input.lossesState==='absent'?'Ausência declarada':m.input.lossesState==='known'?'Conhecidas':'Informação em falta'};${m.input.lossesReference};objecto:${m.input.unchangedObject==='yes'?'Sem alteração declarada':m.input.unchangedObject==='no'?'Alteração declarada':'Por esclarecer'};${m.input.objectReference};${m.source}`],['IRPC normal — L6','Benefícios à matéria colectável',`Estado:${m.input.benefits.state==='known'?'Valor conhecido':m.input.benefits.state==='absent'?'Ausência declarada':'Informação em falta'};montante original:${m.input.benefits.amount||'Não preenchido'};dedução:${money(m.benefitDeduction)};não inclui créditos à colecta ou retenções sofridas.`,m.input.benefits.reference],...m.losses.map(l=>['IRPC normal — L6','Perda fiscal de '+l.year,`Estado:${l.status==='eligible'?'Elegível neste recorte':l.status==='excluded'?'Excluída neste exercício':'Indeterminada'};apurada:${l.assessed};utilizada antes:${l.previouslyUsed};saldo:${money(l.available)};utilização proposta:${l.requested};dedução nesta simulação:${money(l.deducted)};saldo aritmético posterior:${money(l.remaining)};último exercício ordinário:${l.lastOrdinaryYear??'Por determinar'};${l.reason}`,`NUIT:${l.subjectNuit};${l.reference};sem consumo do saldo oficial nem reporte automático.`]as[string,string,string,string])];}
|
||||
function normalAssessmentReport(m:NormalAssessmentModel):Array<[string,string,string,string]>{return[['IRPC normal — L6','Colecta — regime normal',`Matéria colectável:${money(m.taxableBase)};taxa:${m.rate?m.rate.numerator+'%':'Por identificar'};colecta simulada:${money(m.colecta)};${m.classification};${m.centExact===false?'Valor racional exacto com fracção de cêntimo;sem arredondamento fiscal aplicado.':''}${m.pending.join(' | ')}`,`Exercício:${m.period.year};período:${m.period.from}–${m.period.to};${m.input.reference};${m.rule};${m.source}`],['IRPC normal — L6','Saldo final — âmbito L8','A pagar:Indeterminado;a recuperar:Indeterminado. '+m.finalBalance.reason,'Sequência:lucro tributável → matéria colectável → colecta → saldo final;retenções,pagamentos e créditos anuais reservados aL8.']];}
|
||||
export function normalReportRows(d:Record<string,unknown>):Array<[string,string,string,string]>{try{const b=normalBook(d),r=b.result;if(!r)return[];const m=r.model;return[['IRPC normal — L6','Ajustamentos ao resultado financeiro',`Exercício:${m.year};resultado contabilístico antes de imposto:${money(m.accountingProfit)};acréscimos demonstrados:${money(m.additions)};resultado parcial ajustado:${money(m.partialAdjustedResult)};${m.profit?'lucro tributável simulado:'+money(m.taxableProfit)+(m.base?';matéria colectável simulada:'+money(m.taxableBase)+(m.assessment?';colecta simulada:'+money(m.colecta??null)+';saldo final a pagar ou recuperar:Indeterminado (L8).':';imposto a pagar:Indeterminado.'):';matéria colectável/imposto:Indeterminados.'):'lucro tributável/matéria colectável/imposto:Indeterminados.'} Projecção com pressupostos;${m.pending.join(' | ')}`,`${normalCurrent(d,b)?'Entradas correspondentes':'Histórico;origem ou entradas alteradas'};${r.createdAt};${m.source}`],...(m.base?normalBaseReport(m.base):[]),...(m.assessment?normalAssessmentReport(m.assessment):[]),...(m.schedules?[['IRPC normal — L6','Mapas complementares',`Efeito líquido adicional:${money(m.schedules.net)};perda fiscal do próprio exercício:${money(m.currentLoss??null)};sem reporte ou consumo automático. ${m.schedules.pending.join(' | ')}`,m.schedules.source]as[string,string,string,string],...m.schedules.effects.map(e=>{const i=m.schedules!.input.rows.find(r=>r.id===e.id)!;return['IRPC normal — L6',i.document+'/'+i.line,`Montante:${money(e.amount)};efeito:${money(e.effect)};${e.reason}`,`${i.reference};exercício de imputação:${i.fiscalYear||'Não aplicável'}`]as[string,string,string,string];}),...m.schedules.assets.map(a=>['IRPC normal — L6',a.description,`Depreciação contabilística:${money(a.accountingValue)};quota fiscal:${money(a.fiscal)};acréscimo:${money(a.adjustment)};${a.reason}`,`${a.tableReference};${a.reference}`]as[string,string,string,string]),['IRPC normal — L6','Juros financeiros ordinários',`Remanescente aceite no recorte:${money(m.schedules.interest)};não corresponde a juros de mora/compensatórios L5.`,m.schedules.input.interest.reference]as[string,string,string,string]]:[]),...(m.schedules?[...normalFormFields(m).fields.map(f=>['IRPC normal — L6','M22 campo '+f.code+' — '+f.label,`${f.display};exacto:${f.value?f.value.numerator+'/'+f.value.denominator:'Indeterminado'};transcrição:${f.transcriptionReady?'Preparação parcial com valor exacto ao cêntimo':'Pendente ou sem aplicação'};${f.reason}`,normalFormFields(m).source]as[string,string,string,string]),...normalFormFields(m).m20.fields.map(f=>['IRPC normal — L6','M20 A.1 — conta '+f.account+' — '+f.label,`${f.display};representação em meticais inteiros:${f.transcriptionReady?'Exacta':'Pendente'};${f.reason}`,`${f.reference};${normalFormFields(m).m20.source}`]as[string,string,string,string]),['IRPC normal — L6','M20 — correspondência',normalFormFields(m).m20.reason,normalFormFields(m).m20.source]as[string,string,string,string]]:[]),...m.rows.map(r=>['IRPC normal — L6',r.document+'/'+r.line,`${({calculated:'Calculado neste recorte',indeterminate:'Indeterminado',outside_scope:'Fora deste recorte'})[r.status]};montante:${r.amount};acréscimo:${money(r.adjustment)};${r.reason}`,`Origem:${({revenue:'Receitas',cost_of_sales:'Custo das vendas',operating_expenses:'Despesas operacionais',personnel:'Pessoal',depreciation:'Depreciação contabilística',interest_expense:'Juros reconhecidos'}as Record<string,string>)[r.sourceCode]??'Por corresponder'};incluído:${r.included==='yes'?'Sim':r.included==='no'?'Não':'Por demonstrar'};suporte:${r.reference}`]as[string,string,string,string]),...(m.profit?[...m.profit.lines.map(l=>['IRPC normal — L6','Conferência: '+l.label,`Estado:${l.state==='known'?'Valor conhecido':l.state==='absent'?'Ausência declarada':'Informação em falta'};origem:${l.amount};acréscimos:${money(l.addedBack)};remanescente:${money(l.remainder)};${l.reason}`,l.reference]as[string,string,string,string]),...m.profit.topics.map(t=>['IRPC normal — L6',t.label,`Estado:${t.state==='known'?'Valor conhecido':t.state==='absent'?'Ausência declarada':'Informação em falta'};montante:${money(t.value)};${t.reason}`,t.reference]as[string,string,string,string]),['IRPC normal — L6','Âmbito da conferência',m.profit.input.completenessReference,m.profit.source]as[string,string,string,string]]:[])];}catch(e){return[['IRPC normal — L6','Não recuperável',String(e),'Originais conservados.']];}}
|
||||
export function normalHtml(d:Record<string,unknown>){const b=normalBook(d);if(!normalCurrent(d,b))throw Error('Calcule e guarde as entradas actuais antes de exportar.');const esc=(s:string)=>s.replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]!));return'<!doctype html><html lang="pt"><meta charset="utf-8"><title>IRPC normal — ajustamentos</title><h1>L6 — mapa parcial de ajustamentos</h1><p>Projecção pelos pressupostos do plano. Não é demonstração contabilística,liquidação ou Modelo20/22.</p>'+normalReportRows(d).map(r=>'<section><h2>'+esc(r[1])+'</h2><p>'+esc(r[2])+'</p><small>'+esc(r[3])+'</small></section>').join('')+'</html>';}
|
||||
export function normalReportRows(d:Record<string,unknown>):Array<[string,string,string,string]>{try{const b=normalBook(d),r=b.result;if(!r)return[];const m=r.model;return[['IRPC normal — L6','Ajustamentos ao resultado financeiro',`Exercício:${m.year};resultado contabilístico antes de imposto:${money(m.accountingProfit)};acréscimos demonstrados:${money(m.additions)};resultado parcial ajustado:${money(m.partialAdjustedResult)};${m.profit?'lucro tributável simulado:'+money(m.taxableProfit)+(m.base?';matéria colectável simulada:'+money(m.taxableBase)+(m.assessment?';colecta simulada:'+money(m.colecta??null)+';saldo final a pagar ou recuperar:Indeterminado (L8).':';imposto a pagar:Indeterminado.'):';matéria colectável/imposto:Indeterminados.'):'lucro tributável/matéria colectável/imposto:Indeterminados.'} Projecção com pressupostos;${m.pending.join(' | ')}`,`${normalCurrent(d,b)?'Entradas correspondentes':'Histórico;origem ou entradas alteradas'};${r.createdAt};${m.source}`],...(m.special?specialReportRows(m.special):[]),...(m.formPreparation?normalFormPreparationReport(m.formPreparation):[]),...(m.periodsFx?normalPeriodFxReport(m.periodsFx):[]),...(m.depreciation?normalDepreciationReport(m.depreciation):[]),...(m.costs?normalCostReport(m.costs):[]),...(m.base?normalBaseReport(m.base):[]),...(m.assessment?normalAssessmentReport(m.assessment):[]),...(m.schedules?[['IRPC normal — L6','Mapas complementares',`Efeito líquido adicional:${money(m.schedules.net)};perda fiscal do próprio exercício:${money(m.currentLoss??null)};sem reporte ou consumo automático. ${m.schedules.pending.join(' | ')}`,m.schedules.source]as[string,string,string,string],...m.schedules.effects.map(e=>{const i=m.schedules!.input.rows.find(r=>r.id===e.id)!;return['IRPC normal — L6',i.document+'/'+i.line,`Montante:${money(e.amount)};efeito:${money(e.effect)};${e.reason}`,`${i.reference};exercício de imputação:${i.fiscalYear||'Não aplicável'}`]as[string,string,string,string];}),...m.schedules.assets.map(a=>['IRPC normal — L6',a.description,`Depreciação contabilística:${money(a.accountingValue)};quota fiscal:${money(a.fiscal)};acréscimo:${money(a.adjustment)};${a.reason}`,`${a.tableReference};${a.reference}`]as[string,string,string,string]),['IRPC normal — L6','Juros financeiros ordinários',`Remanescente aceite no recorte:${money(m.schedules.interest)};não corresponde a juros de mora/compensatórios L5.`,m.schedules.input.interest.reference]as[string,string,string,string]]:[]),...(m.schedules&&!m.formPreparation?[...normalFormFields(m).fields.map(f=>['IRPC normal — L6','M22 campo '+f.code+' — '+f.label,`${f.display};exacto:${f.value?f.value.numerator+'/'+f.value.denominator:'Indeterminado'};transcrição:${f.transcriptionReady?'Preparação parcial com valor exacto ao cêntimo':'Pendente ou sem aplicação'};${f.reason}`,normalFormFields(m).source]as[string,string,string,string]),...normalFormFields(m).m20.fields.map(f=>['IRPC normal — L6','M20 A.1 — conta '+f.account+' — '+f.label,`${f.display};representação em meticais inteiros:${f.transcriptionReady?'Exacta':'Pendente'};${f.reason}`,`${f.reference};${normalFormFields(m).m20.source}`]as[string,string,string,string]),['IRPC normal — L6','M20 — correspondência',normalFormFields(m).m20.reason,normalFormFields(m).m20.source]as[string,string,string,string]]:[]),...m.rows.map(r=>['IRPC normal — L6',r.document+'/'+r.line,`${({calculated:'Calculado neste recorte',indeterminate:'Indeterminado',outside_scope:'Fora deste recorte'})[r.status]};montante:${r.amount};acréscimo:${money(r.adjustment)};${r.reason}`,`Origem:${({revenue:'Receitas',cost_of_sales:'Custo das vendas',operating_expenses:'Despesas operacionais',personnel:'Pessoal',depreciation:'Depreciação contabilística',interest_expense:'Juros reconhecidos'}as Record<string,string>)[r.sourceCode]??'Por corresponder'};incluído:${r.included==='yes'?'Sim':r.included==='no'?'Não':'Por demonstrar'};suporte:${r.reference}`]as[string,string,string,string]),...(m.profit?[...m.profit.lines.map(l=>['IRPC normal — L6','Conferência: '+l.label,`Estado:${l.state==='known'?'Valor conhecido':l.state==='absent'?'Ausência declarada':'Informação em falta'};origem:${l.amount};acréscimos:${money(l.addedBack)};remanescente:${money(l.remainder)};${l.reason}`,l.reference]as[string,string,string,string]),...m.profit.topics.map(t=>['IRPC normal — L6',t.label,`Estado:${t.state==='known'?'Valor conhecido':t.state==='absent'?'Ausência declarada':'Informação em falta'};montante:${money(t.value)};${t.reason}`,t.reference]as[string,string,string,string]),['IRPC normal — L6','Âmbito da conferência',m.profit.input.completenessReference,m.profit.source]as[string,string,string,string]]:[])];}catch(e){return[['IRPC normal — L6','Não recuperável',String(e),'Originais conservados.']];}}
|
||||
export function normalHtml(d:Record<string,unknown>){const b=normalBook(d);if(!normalCurrent(d,b))throw Error('Calcule e guarde as entradas actuais antes de exportar.');const esc=(s:string)=>s.replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]!));return'<!doctype html><html lang="pt"><meta charset="utf-8"><title>IRPC normal — ajustamentos</title><h1>IRPC — L6 de referência e tratamentos L7 quando qualificados</h1><p>Projecção pelos pressupostos do plano. Não é demonstração contabilística,liquidação ou Modelo20/22.</p>'+normalReportRows(d).map(r=>'<section><h2>'+esc(r[1])+'</h2><p>'+esc(r[2])+'</p><small>'+esc(r[3])+'</small></section>').join('')+'</html>';}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
export const irpcSpecialCombinationsVersion='IRPC-normal-adjustments/14';
|
||||
export const specialCombinationsSource='CBF4/13,compilação oficial APIEX pp66/70:benefícios específicos não cumuláveis entre si ou com genéricos,salvo excepção expressa;CBF16 é genérico. CIRPC12/14 e61(1):cooperativa abrangida,redução50% da taxa geral32%=16%,base integralmente elegível,sem rendimentos sujeitos a retenção. Recorte de combinação destes tratamentos já qualificados:primeiro a diferença fiscalCBF16,depois a matéria colectável e a taxa16%;imposto autónomo61(4) separado a35%,sem redução cooperativa. Não se aplica automaticamente benefício específico,outro benefício ou excepção sem correspondência.';
|
||||
export type SpecialCombinationsInput={version:1;reference:string;specificState:''|'absent'|'known';specificReference:string;specificException:''|'absent'|'claimed';otherState:''|'absent'|'known';otherReference:string};
|
||||
export const newSpecialCombinations=():SpecialCombinationsInput=>({version:1,reference:'',specificState:'',specificReference:'',specificException:'',otherState:'',otherReference:''});
|
||||
export function validateSpecialCombinations(i:SpecialCombinationsInput){
|
||||
if(!i||i.version!==1||['reference','specificReference','otherReference'].some(k=>typeof i[k as 'reference']!=='string')||!['','absent','known'].includes(i.specificState)||!['','absent','claimed'].includes(i.specificException)||!['','absent','known'].includes(i.otherState))throw Error('Mapa de cumulações não recuperável;históricos conservados.');
|
||||
}
|
||||
export function qualifySpecialCombinations(i:SpecialCombinationsInput,genericRequested=true){
|
||||
validateSpecialCombinations(i);const pending:string[]=[];let incompatible=false;
|
||||
if(!i.reference.trim())pending.push('Falta suporte da combinação dos tratamentos registados no mesmo sujeito/projecto/período.');
|
||||
if(!i.specificState||!i.specificReference.trim())pending.push('Benefícios específicosCBF:identifique presença ou ausência documentada;localização não prova estatuto.');
|
||||
if(!i.otherState||!i.otherReference.trim())pending.push('Outros benefícios além dos tratamentosL7 registados:identifique presença ou ausência com suporte.');
|
||||
if(i.specificState==='absent'&&i.specificException)pending.push('Ausência de benefício específico contradiz excepção preenchida;reconcilie a declaração.');
|
||||
if(i.specificState==='known'){
|
||||
if(i.specificException==='absent'&&genericRequested){incompatible=true;pending.push('IncompatibilidadeCBF4/13:benefício específico declarado e genéricoCBF16 sem excepção expressa;nenhum benefício é escolhido ou removido automaticamente.');}
|
||||
else pending.push(i.specificException==='absent'?'Benefício específico declarado sem cálculo próprio correspondido;não é ignorado na totalização.':i.specificException==='claimed'?'Excepção expressa invocada:ligar artigo,âmbito,período e limites à combinação antes de calcular;esta excepção ainda não está correspondida.':'Benefício específico declarado:identifique excepção expressa ou ausência;sem presumir acumulação.');
|
||||
}
|
||||
if(i.otherState==='known')pending.push('Outro benefício declarado ainda sem cálculo/ordem/limite correspondidos;sem o aplicar ou ignorar por presunção.');
|
||||
return{status:incompatible?'incompatible' as const:pending.length?'indeterminate' as const:'compatible' as const,ready:pending.length===0,pending,source:specialCombinationsSource};
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
import {irpcSpecialCombinationsVersion,qualifySpecialCombinations,validateSpecialCombinations,specialCombinationsSource,type SpecialCombinationsInput} from './irpc-special-combinations.ts';
|
||||
import type {NormalBook,NormalModel} from './irpc-normal.ts';
|
||||
import {calculateNormalBase} from './irpc-normal-base.ts';
|
||||
import {calculateNormalAssessment} from './irpc-normal-assessment.ts';
|
||||
import {calculateNormalDepreciation,type NormalDepreciationModel} from './irpc-normal-depreciation.ts';
|
||||
import {addFractions,subtractFractions,decimalFraction,fraction,fractionPresentation,type FiscalFraction} from './fiscal-rational.ts';
|
||||
|
||||
export const irpcSpecialVersion='IRPC-normal-adjustments/10';
|
||||
export const irpcSpecialMonthlyVersion='IRPC-normal-adjustments/11';
|
||||
export const irpcSpecialStartPeriodVersion='IRPC-normal-adjustments/12';
|
||||
export const irpcSpecialCessationPriorVersion='IRPC-normal-adjustments/13';
|
||||
export const specialCessationPriorSource='CBF3/9/10/16;CIRPC7(4);Decreto72/2013 art3(3),9(1–3) e10:residente,ano civil2026 ou período curto de cessação com meses completosL6. Activo novo a custo histórico,entrada2025/2026,método constante/taxa normal máxima e duodécimos desde a entrada. Taxa ×1,5,limites contabilizado elegível e saldo fiscal;quotas anteriores e parcela temporariamente tributada documentadas emL6,sem recalcular o passado nem consumir saldos oficiais. Saída do activo só quando declarada,excluindo o mês do evento;cessação não presume transmissão. Sem cumulação.';
|
||||
export const specialStartPeriodSource='CBF3/9/10/16;CIRPC7(4);Decreto72/2013 art3(3)/9(3):período curto por início de actividade de residente em2026. Taxa normal máxima ×1,5 ×meses efectivos/12 reutilizados de L6,sem anualização;activo novo emuso no período,método constante,sem saída/quotas anteriores/cumulação. Limites contabilizado elegível e saldo fiscal;apenas diferença adicional.';
|
||||
export const specialMonthlySource='CBF16 com Decreto72/2013 art9:taxa normal máxima ×1,5 ×duodécimos/12,meses reutilizados do mapaL6. Exercício anual civil2026,entrada emuso no ano,método constante,sem saída/quotas anteriores/cumulação. Dedução limitada ao contabilizado elegível e saldo fiscal;apenas diferença adicional,não nova amortização contabilística.';
|
||||
export const specialSources={expenses:'CIRPC,Lei34/2007,art61(4),PDF17/p768(71):35% sobre encargos não devidamente documentados e despesas confidenciais/ilícitas,sem prejuízo do36(1)g. Exercício2026;sem regra inferida da falta de anexo.',cooperative:'CIRPC,Lei34/2007,art12/14,PDF5/p768(59),e61(1):cooperativas agrárias,de artesanato e culturais;redução de50% da taxa geral32%=16%;rendimentos sujeitos a retenção excluídos deste benefício. Recorte2026,residente,parcela ordinária integralmente elegível.',acceleration:'CBF,Lei4/2009,art3/4/9/10/16;compilação oficial APIEX pp66–68/72:incremento50% das taxas normais nos imóveis novos do projecto e,nas mesmas condições,imóveis reabilitados/máquinas e equipamentos industriais ou agro-industriais. Decreto72/2013 art3(3):limite contabilizado e saldo fiscal. Recorte constante pela taxa normal máxima da tabela,primeiro exercício anual2026,sem cumulação presumida.'}as const;
|
||||
export type Qualification={state:''|'known'|'absent'|'not_applicable';eligible:''|'yes'|'no';from:string;to:string;reference:string;periodReference:string};
|
||||
export const newQualification=():Qualification=>({state:'',eligible:'',from:'',to:'',reference:'',periodReference:''});
|
||||
export type SpecialExpense={id:string;scheduleId:string;nature:''|'undocumented'|'confidential'|'illicit'|'other';eligible:''|'yes'|'no';reference:string};
|
||||
export type AcceleratedAsset={id:string;assetId:string;kind:''|'new_project_building'|'rehabilitated_project_building'|'industrial_equipment'|'agroindustrial_equipment'|'other';eligible:''|'yes'|'no';reference:string};
|
||||
export type SpecialContinuationInput={version:1;period:''|'annual'|'cessation';reference:string;historyReference:string;monthlyFromStart:''|'yes'|'no'};
|
||||
export type SpecialMonthlyInput={version:1;reference:string;startPeriod?:{version:1;reference:string};continuation?:SpecialContinuationInput};
|
||||
export type SpecialInput={version:1;combinations?:SpecialCombinationsInput;expenses:{qualification:Qualification;rows:SpecialExpense[]};cooperative:{qualification:Qualification;kind:''|'agrarian'|'craft'|'cultural'|'other';allIncomeEligible:''|'yes'|'no';withheldIncome:''|'absent'|'known'};acceleration:{qualification:Qualification;cbfRequirements:''|'yes'|'no';recognition:''|'documented'|'not_required';recognitionReference:string;noOtherBenefits:''|'yes'|'no';rows:AcceleratedAsset[];monthly?:SpecialMonthlyInput}};
|
||||
export const specialCalculationVersion=(i:SpecialInput)=>i.combinations?irpcSpecialCombinationsVersion:i.acceleration.monthly?.continuation?irpcSpecialCessationPriorVersion:i.acceleration.monthly?.startPeriod?irpcSpecialStartPeriodVersion:i.acceleration.monthly?irpcSpecialMonthlyVersion:irpcSpecialVersion;
|
||||
export function specialAccelerationSource(i:SpecialInput){const source=i.acceleration.monthly?.continuation?specialCessationPriorSource:i.acceleration.monthly?.startPeriod?specialStartPeriodSource:i.acceleration.monthly?specialMonthlySource:specialSources.acceleration;return i.combinations?source.replace('/cumulação','').replace('Sem cumulação.','Cumulação qualificada no mapa próprio.').replace('sem cumulação presumida.','cumulação qualificada no mapa próprio.')+' '+specialCombinationsSource:source;}
|
||||
export const newSpecialInput=():SpecialInput=>({version:1,expenses:{qualification:newQualification(),rows:[]},cooperative:{qualification:newQualification(),kind:'',allIncomeEligible:'',withheldIncome:''},acceleration:{qualification:newQualification(),cbfRequirements:'',recognition:'',recognitionReference:'',noOtherBenefits:'',rows:[]}});
|
||||
export const newSpecialExpense=(id:string):SpecialExpense=>({id,scheduleId:'',nature:'',eligible:'',reference:''});
|
||||
export const newAcceleratedAsset=(id:string):AcceleratedAsset=>({id,assetId:'',kind:'',eligible:'',reference:''});
|
||||
const choices=(v:unknown,allowed:string[])=>typeof v==='string'&&allowed.includes(v);
|
||||
export function validateSpecial(i:SpecialInput){
|
||||
if(!i||i.version!==1||!i.expenses||!i.cooperative||!i.acceleration)throw Error('Qualificação L7 não recuperável;originais conservados.');
|
||||
if(i.combinations!==undefined)validateSpecialCombinations(i.combinations);
|
||||
if(i.acceleration.monthly!==undefined&&(!i.acceleration.monthly||i.acceleration.monthly.version!==1||typeof i.acceleration.monthly.reference!=='string'))throw Error('Preparação CBF16 por duodécimos não recuperável;históricos conservados.');
|
||||
if(i.acceleration.monthly?.startPeriod!==undefined&&(!i.acceleration.monthly.startPeriod||i.acceleration.monthly.startPeriod.version!==1||typeof i.acceleration.monthly.startPeriod.reference!=='string'))throw Error('Preparação CBF16 para início de actividade não recuperável;históricos conservados.');
|
||||
const continuation=i.acceleration.monthly?.continuation;
|
||||
if(continuation!==undefined&&(!continuation||continuation.version!==1||!choices(continuation.period,['','annual','cessation'])||typeof continuation.reference!=='string'||typeof continuation.historyReference!=='string'||!choices(continuation.monthlyFromStart,['','yes','no'])||i.acceleration.monthly?.startPeriod!==undefined))throw Error('Preparação CBF16 de cessação/quotas anteriores não recuperável ou incompatível com início de actividade;históricos conservados.');
|
||||
for(const q of[i.expenses.qualification,i.cooperative.qualification,i.acceleration.qualification])if(!q||!choices(q.state,['','known','absent','not_applicable'])||!choices(q.eligible,['','yes','no'])||['from','to','reference','periodReference'].some(k=>typeof q[k as 'from']!=='string'))throw Error('Condição/período L7 não recuperável.');
|
||||
for(const [rows,keys]of [[i.expenses.rows,Object.keys(newSpecialExpense(''))],[i.acceleration.rows,Object.keys(newAcceleratedAsset(''))]]as const){if(!Array.isArray(rows)||new Set(rows.map(r=>r.id)).size!==rows.length||rows.some(r=>!r||keys.some(k=>typeof(r as unknown as Record<string,unknown>)[k]!=='string')||!choices(r.eligible,['','yes','no'])))throw Error('Parcela L7 não recuperável ou identificador repetido.');}
|
||||
if(i.expenses.rows.some(r=>!choices(r.nature,['','undocumented','confidential','illicit','other']))||i.acceleration.rows.some(r=>!choices(r.kind,['','new_project_building','rehabilitated_project_building','industrial_equipment','agroindustrial_equipment','other'])))throw Error('Natureza L7 desconhecida.');
|
||||
if(!choices(i.cooperative.kind,['','agrarian','craft','cultural','other'])||!choices(i.cooperative.allIncomeEligible,['','yes','no'])||!choices(i.cooperative.withheldIncome,['','absent','known'])||!choices(i.acceleration.cbfRequirements,['','yes','no'])||!choices(i.acceleration.noOtherBenefits,['','yes','no'])||!choices(i.acceleration.recognition,['','documented','not_required'])||typeof i.acceleration.recognitionReference!=='string')throw Error('Parâmetro L7 não recuperável.');
|
||||
}
|
||||
type Status='calculated'|'absent'|'not_applicable'|'indeterminate';
|
||||
type Decision={status:Status;reason:string;pending:string[]};
|
||||
const z=()=>fraction(0n),mul=(v:FiscalFraction,n:bigint,d=1n)=>fraction(BigInt(v.numerator)*n,BigInt(v.denominator)*d);
|
||||
const cmp=(a:FiscalFraction,b:FiscalFraction)=>BigInt(a.numerator)*BigInt(b.denominator)-BigInt(b.numerator)*BigInt(a.denominator);
|
||||
const iso=(s:string)=>/^20\d{2}-\d{2}-\d{2}$/.test(s)&&Number.isFinite(Date.parse(s))&&new Date(s).toISOString().slice(0,10)===s;
|
||||
export function specialContext(d:Record<string,unknown>){return Object.fromEntries(['context_opportunity','context_opportunity_snapshot','context_applicability_snapshot','context_reuse','sector_id','sector_id_label','province_id','province_id_label','district_id','district_id_label','admin_post_id','admin_post_id_label','locality_id','locality_id_label','selection_labels'].map(k=>[k,d[k]??null]));}
|
||||
export const specialDependency=(d:Record<string,unknown>)=>JSON.stringify(specialContext(d));
|
||||
const specialPeriod=(b:NormalBook,m:NormalModel)=>b.periodsFx?{from:b.periodsFx.from,to:b.periodsFx.to,pending:m.periodsFx?.pending??[]}:m.fiscalPeriod??{from:b.year+'-01-01',to:b.year+'-12-31',pending:[]};
|
||||
function qualify(q:Qualification,b:NormalBook,m:NormalModel):Decision{
|
||||
const pending:string[]=[],p=specialPeriod(b,m);
|
||||
if(!q.state)pending.push('Informação em falta:identifique o estado do tratamento.');
|
||||
if(!q.reference.trim())pending.push('Falta prova/declaração das condições ou da ausência/não aplicação.');
|
||||
if(!iso(q.from)||!iso(q.to)||q.from!==p.from||q.to!==p.to||!q.periodReference.trim())pending.push('Período do tratamento deve corresponder ao período fiscal documentado,com suporte próprio;sem transpor vigência.');
|
||||
if(b.year!=='2026'||m.currency!=='MZN'||!b.base?.subjectNuit.match(/^\d{9}$/)||!b.base.identityReference.trim()||!b.scopeReference.trim()||!['resident_general','ep_general'].includes(b.scope)||p.pending.length)pending.push('Sujeito/NUIT,âmbito ou período2026 emMZN por reconciliar na base existente.');
|
||||
if(q.state==='known'&&!q.eligible)pending.push('Condições documentadas por qualificar:sim,não ou informação em falta.');
|
||||
if(q.state!=='known'&&q.eligible)pending.push('Estado de ausência/não aplicação/informação em falta não admite condição de benefício preenchida.');
|
||||
if(pending.length)return{status:'indeterminate',pending,reason:pending.join(' ')};
|
||||
const status=q.state==='absent'?'absent':q.state==='not_applicable'||q.eligible==='no'?'not_applicable':'calculated';
|
||||
return{status,pending,reason:status==='absent'?'Ausência declarada com suporte;efeito zero neste período.':status==='not_applicable'?'Tratamento não aplicável/condição negativa documentada;percurso normal conservado.':'Condições e período documentados no recorte.'};
|
||||
}
|
||||
function fail(d:Decision,reason:string){d.status='indeterminate';d.pending.push(reason);d.reason=d.pending.join(' ');}
|
||||
export function calculateSpecial(draft:Record<string,unknown>,b:NormalBook,m:NormalModel,source:Parameters<typeof calculateNormalDepreciation>[1]){
|
||||
const i=b.special!;validateSpecial(i);const expenseDecision=qualify(i.expenses.qualification,b,m),coopDecision=qualify(i.cooperative.qualification,b,m),accDecision=qualify(i.acceleration.qualification,b,m);
|
||||
const combinations=i.combinations?qualifySpecialCombinations(i.combinations,accDecision.status==='calculated'&&i.acceleration.rows.some(r=>r.eligible==='yes')):undefined;
|
||||
if(combinations&&b.base?.benefits.state==='known'){let extra=true;try{extra=cmp(decimalFraction(b.base.benefits.amount),z())!==0n;}catch{/*L6 conserva a própria pendência.*/}if(extra){combinations.ready=false;if(combinations.status!=='incompatible')combinations.status='indeterminate';combinations.pending.push('Dedução/benefício à matéria colectável já registado emL6 sem correspondência a esta combinação:identifique parcela,origem e limite antes de reaplicarCBF16 ou reduzir novamente;valor original conservado.');}}
|
||||
const existing=(b.schedules?.rows??[]).filter(r=>r.rule==='undocumented');
|
||||
if(expenseDecision.status==='absent'&&(existing.length||i.expenses.rows.length))fail(expenseDecision,'Ausência declarada contradiz despesas36g ou linhasL7 presentes;reconcilie sem apagar o ajustamento.');
|
||||
if(expenseDecision.status!=='calculated'&&i.expenses.rows.length&&expenseDecision.status!=='indeterminate')fail(expenseDecision,'Estado global e parcelas da despesa contraditórios;qualifique as parcelas ou conserve apenas a declaração.');
|
||||
const expenses=i.expenses.rows.map(r=>{
|
||||
const origin=existing.find(x=>x.id===r.scheduleId),effect=m.schedules?.effects.find(x=>x.id===r.scheduleId);let amount:FiscalFraction|null=effect?.amount??null,tax:FiscalFraction|null=null,status:Status='indeterminate';const reasons:string[]=[];
|
||||
if(expenseDecision.status!=='calculated')reasons.push(expenseDecision.reason);
|
||||
if(!origin||!effect?.effect||!effect.amount||cmp(effect.effect,effect.amount)!==0n)reasons.push('Seleccione ajustamento36g calculado emL6;imposto autónomo não acrescenta novamente a despesa.');
|
||||
if(i.expenses.rows.filter(x=>x.scheduleId===r.scheduleId).length!==1)reasons.push('Despesa L6 repetida no imposto autónomo;uma referência por parcela.');
|
||||
if(!r.reference.trim()||!r.eligible||!r.nature)reasons.push('Falta classificação legal documentada da despesa;ausência de anexo não prova61(4).');
|
||||
if(!reasons.length){status=r.eligible==='no'?'not_applicable':r.nature==='other'?'indeterminate':'calculated';if(status==='indeterminate')reasons.push('Outra natureza por corresponder;sem taxa provisória.');else tax=status==='calculated'?mul(amount!,35n,100n):z();}
|
||||
return{...structuredClone(r),document:origin?.document??'',line:origin?.line??'',sourceCode:origin?.sourceCode??'',amount,l6Adjustment:effect?.effect??null,additionalProfitAdjustment:z(),rate:status==='calculated'?fraction(35n):null,tax,status,reason:reasons.join(' ')||(status==='calculated'?'CIRPC61(4):despesa ×35%;ajustamento36g reutilizado,sem duplicação.':'Condição negativa documentada;sem imposto autónomo aplicado à parcela.')};
|
||||
});
|
||||
if(expenseDecision.status==='calculated'){
|
||||
if(!existing.length&&!expenses.length)fail(expenseDecision,'Não há parcelas conhecidas;declare ausência com suporte ou seleccione despesas36g.');
|
||||
if(existing.some(r=>!expenses.some(x=>x.scheduleId===r.id)))fail(expenseDecision,'Há despesa36g sem qualificação autónoma;corresponda cada parcela ou justifique a sua não aplicação.');
|
||||
for(const r of expenses)if(r.status==='indeterminate')fail(expenseDecision,(r.document||r.id)+': '+r.reason);
|
||||
}
|
||||
const knownAutonomous=addFractions(expenses.flatMap(r=>r.tax?[r.tax]:[])),autonomousTax=expenseDecision.status==='indeterminate'?null:expenseDecision.status==='calculated'?knownAutonomous:z();
|
||||
if(coopDecision.status==='absent'&&['agrarian','craft','cultural'].includes(i.cooperative.kind)&&i.cooperative.allIncomeEligible==='yes'&&i.cooperative.withheldIncome==='absent')fail(coopDecision,'Ausência de redução contradiz os dados positivos de cooperativa integralmente elegível;reconcilie a declaração sem apagar os dados.');
|
||||
if(coopDecision.status==='calculated'){
|
||||
if(b.scope!=='resident_general'||!['agrarian','craft','cultural'].includes(i.cooperative.kind))fail(coopDecision,'Art12:tipo de cooperativa abrangida e residência por documentar;outras entidades têm correspondência própria.');
|
||||
if(i.cooperative.allIncomeEligible!=='yes'||i.cooperative.withheldIncome!=='absent')fail(coopDecision,'Recorte exige base ordinária integralmente elegível e ausência documentada de rendimentos sujeitos a retenção;parcelas mistas/retidas exigem segregação própria,sem redução global presumida.');
|
||||
}
|
||||
if(accDecision.status==='absent'&&i.acceleration.rows.length)fail(accDecision,'Ausência de amortização acelerada contradiz activos seleccionados.');
|
||||
if(accDecision.status!=='calculated'&&i.acceleration.rows.length&&accDecision.status!=='indeterminate')fail(accDecision,'Não aplicação global com activos seleccionados:reconcilie o estado e as parcelas.');
|
||||
if(accDecision.status==='calculated'){
|
||||
if(combinations&&!combinations.ready)fail(accDecision,combinations.pending.join(' '));
|
||||
if(i.acceleration.monthly&&!i.acceleration.monthly.reference.trim())fail(accDecision,'Falta suporte da reutilização dos meses e da opção por duodécimosCBF16 no mapaL6.');
|
||||
if(i.acceleration.monthly?.startPeriod&&!i.acceleration.monthly.startPeriod.reference.trim())fail(accDecision,'Falta suporte do período curto por início de actividadeCBF16;período e activosL6 conservados.');
|
||||
const continuation=i.acceleration.monthly?.continuation;
|
||||
if(continuation?.monthlyFromStart==='no')fail(accDecision,'Duodécimos desde a entrada emuso não aplicados:esta combinação de quotas/saída exige correspondência própria;L6 e os saldos declarados ficam preservados.');
|
||||
if(continuation&&(!continuation.period||!continuation.reference.trim()||!continuation.historyReference.trim()||!continuation.monthlyFromStart))fail(accDecision,'CBF16 cessação/quotas anteriores:identifique período,suporte da vigência/condições e das quotas anteriores ou ausência;duodécimos desde a entrada emuso por documentar. Sem recalcular ou presumir saldos anteriores.');
|
||||
if(i.acceleration.cbfRequirements!=='yes'||!i.acceleration.recognition||!i.acceleration.recognitionReference.trim())fail(accDecision,'Falta enquadramentoCBF3/9 e reconhecimento10 quando exigido;excepção deve ter norma/suporte,não localização.');
|
||||
if(!i.combinations&&i.acceleration.noOtherBenefits!=='yes')fail(accDecision,'CumulaçãoCBF4 por corresponder;este recorte não combina outros benefícios positivos.');
|
||||
if(!i.combinations&&coopDecision.status==='calculated')fail(accDecision,'Combinação de redução cooperativa comCBF16 ainda não correspondida;cada caso independente continua demonstrável.');
|
||||
if(!b.depreciation||!m.depreciation||!i.acceleration.rows.length)fail(accDecision,'Seleccione activos do mapaL6 já reconciliado;sem criar activo ou quota paralelos.');
|
||||
}
|
||||
const accelerations=i.acceleration.rows.map(r=>{
|
||||
const a=b.depreciation?.assets.find(x=>x.id===r.assetId),base=m.depreciation?.assets.find(x=>x.id===r.assetId),issues:string[]=[];let status:Status='indeterminate';
|
||||
if(accDecision.status!=='calculated')issues.push(accDecision.reason);
|
||||
if(!r.reference.trim()||!r.eligible||!r.kind)issues.push('Condição/afectação do activo ao projecto por documentar.');
|
||||
if(i.acceleration.rows.filter(x=>x.assetId===r.assetId).length!==1)issues.push('Activo repetido no benefício.');
|
||||
if(!a||base?.status!=='calculated')issues.push('ActivoL6 inexistente ou cálculo de origem indeterminado.');
|
||||
if(!issues.length&&r.eligible==='no')status='not_applicable';
|
||||
else if(!issues.length&&a){
|
||||
const building=r.kind==='new_project_building'&&base?.catalog?.kind==='building',equipment=['industrial_equipment','agroindustrial_equipment'].includes(r.kind)&&['machine','laundry_machine'].includes(a.category);
|
||||
if(!building&&!equipment)issues.push('Categoria/afectação fora do recorte:imóvel novo ou máquina industrial/agro-industrial correspondida;reabilitados e outras categorias/métodos exigem regra própria.');
|
||||
if(base?.catalog&&cmp(decimalFraction(a.rate),decimalFraction(base.catalog.rate))!==0n)issues.push('RecorteCBF16 usa a taxa normal máxima da tabela;opção por quota inferior exige correspondência própria,sem a acelerar por aproximação.');
|
||||
if(i.acceleration.monthly){
|
||||
const p=specialPeriod(b,m),priorZero=[a.previousAccounting,a.previousFiscal,a.priorAvailable].every(v=>cmp(decimalFraction(v),z())===0n);
|
||||
if(i.acceleration.monthly.continuation){
|
||||
const c=i.acceleration.monthly.continuation,annual=c.period==='annual'&&p.from==='2026-01-01'&&p.to==='2026-12-31'&&!m.periodsFx?.short,cessation=c.period==='cessation'&&b.periodsFx?.kind==='cessation'&&m.periodsFx?.short&&p.from==='2026-01-01'&&iso(p.to)&&p.to<'2026-12-01';
|
||||
if(b.scope!=='resident_general'||p.pending.length||!annual&&!cessation||a.method!=='constant'||a.timing!=='months'||!iso(a.start)||a.start<'2025-01-01'||a.start>p.to||a.start>='2026-01-01'&&!priorZero||a.exitState!=='absent'&&!(a.exitState==='known'&&iso(a.exitDate)&&a.exitDate>=p.from&&a.exitDate<=p.to)||base?.months===null||base?.months===undefined)issues.push('CBF16 cessação/quotas anteriores:residente,ano civil2026 ou cessaçãoL6 de meses completos desde1Janeiro,activo novo com entrada2025/2026 e saldosL6 reconciliados,método constante e duodécimos. Quotas anteriores positivas exigem entrada2025;saída só por evento documentado dentro do período. Outros anos/períodos/métodos mantêm correspondência própria.');
|
||||
}else if(i.acceleration.monthly.startPeriod){
|
||||
if(b.scope!=='resident_general'||b.periodsFx?.kind!=='start'||!m.periodsFx?.short||p.pending.length||!iso(p.from)||p.from<'2026-02-01'||p.from>'2026-12-01'||p.from.slice(-2)!=='01'||p.to!=='2026-12-31'||a.method!=='constant'||a.timing!=='months'||!iso(a.start)||a.start<p.from||a.start>p.to||a.exitState!=='absent'||!priorZero||base?.months===null||base?.months===undefined)issues.push('CBF16 início de actividade:residente,período curtoL6 de meses completos em2026 até31/12,activo novo emuso dentro do período,método constante,opção mensal e ausência documentada de saída/quotas anteriores;cessação/transição e demais situações permanecem separadas.');
|
||||
}else if(a.method!=='constant'||a.timing!=='months'||!iso(a.start)||a.start<'2026-01-01'||a.start>'2026-12-31'||a.exitState!=='absent'||!priorZero||p.from!=='2026-01-01'||p.to!=='2026-12-31'||base?.months===null||base?.months===undefined)issues.push('CBF16 por duodécimos:exercício anual civil2026,método constante,entrada no ano,opção mensalL6 e ausência documentada de saída/quotas anteriores;outros períodos/casos permanecem separados.');
|
||||
}else if(a.method!=='constant'||a.timing!=='annual'||a.start!=='2026-01-01'||a.exitState!=='absent'||a.previousAccounting!=='0'||a.previousFiscal!=='0'||a.priorAvailable!=='0'||m.fiscalPeriod?.from!=='2026-01-01'||m.fiscalPeriod?.to!=='2026-12-31')issues.push('CBF16 inicial:primeiro exercício anual civil2026,método constante,sem quotas anteriores ou saída;duodécimos e recuperação anterior continuam separados.');
|
||||
if(!issues.length)status='calculated';
|
||||
}
|
||||
return{...structuredClone(r),assetKey:a?.assetKey??'',description:a?.description??'',status,reason:issues.join(' ')||(status==='calculated'?'Activo existente elegível;taxa normal ×1,5,com limite contabilístico e saldo fiscal.':'Condição negativa documentada;quota normal mantida.')};
|
||||
});
|
||||
let acceleratedDepreciation:NormalDepreciationModel|null=null,additionalDeduction:FiscalFraction|null=accDecision.status==='indeterminate'?null:z();
|
||||
if(accDecision.status==='calculated'){
|
||||
for(const r of accelerations)if(r.status==='indeterminate')fail(accDecision,(r.description||r.id)+': '+r.reason);
|
||||
if(accDecision.status==='calculated'&&b.depreciation&&m.depreciation?.adjustment){
|
||||
const startPeriod=!!i.acceleration.monthly?.startPeriod,continuation=i.acceleration.monthly?.continuation;
|
||||
acceleratedDepreciation=calculateNormalDepreciation(b.depreciation,source,startPeriod||continuation?specialPeriod(b,m):{from:'2026-01-01',to:'2026-12-31'},[...b.rows,...(b.schedules?.rows??[]),...(b.costs?.rows??[])],startPeriod||continuation?.period==='cessation',new Set(accelerations.filter(r=>r.status==='calculated').map(r=>r.assetId)));
|
||||
if(startPeriod||continuation)acceleratedDepreciation={...acceleratedDepreciation,source:continuation?specialCessationPriorSource:specialStartPeriodSource};
|
||||
if(i.combinations)acceleratedDepreciation={...acceleratedDepreciation,source:specialAccelerationSource(i)};
|
||||
if(acceleratedDepreciation.adjustment===null)fail(accDecision,acceleratedDepreciation.pending.join(' '));
|
||||
else additionalDeduction=subtractFractions(m.depreciation.adjustment,acceleratedDepreciation.adjustment);
|
||||
}else if(accDecision.status==='calculated')fail(accDecision,'Reconciliação da amortização normal em falta.');
|
||||
}
|
||||
if(accDecision.status==='indeterminate')additionalDeduction=null;
|
||||
const taxableProfit=m.taxableProfit&&additionalDeduction?subtractFractions(m.taxableProfit,additionalDeduction):null;
|
||||
const base=b.base?calculateNormalBase(b.base,taxableProfit,b.year,b.schedules?.currentLossReference,!!m.periodsFx?.short):null;
|
||||
const assessmentInput=coopDecision.status==='calculated'?{version:1 as const,treatment:'general_61_1' as const,reference:i.cooperative.qualification.reference}:b.assessment;
|
||||
const assessment=assessmentInput?calculateNormalAssessment(assessmentInput,base?.taxableBase??null,{year:b.year,scope:b.scope,currency:m.currency,extended:!!b.schedules||!!b.periodsFx,short:!!m.periodsFx?.short,period:specialPeriod(b,m)}):null;
|
||||
const normalColecta=assessment?.colecta??null,colecta=coopDecision.status==='indeterminate'?null:normalColecta?(coopDecision.status==='calculated'?mul(normalColecta,1n,2n):normalColecta):null;
|
||||
const combinedColecta=colecta&&autonomousTax?addFractions([colecta,autonomousTax]):null;
|
||||
const monthlySource=i.combinations?specialAccelerationSource(i):i.acceleration.monthly?.continuation?specialCessationPriorSource:i.acceleration.monthly?.startPeriod?specialStartPeriodSource:specialMonthlySource;
|
||||
const monthlyModel=i.acceleration.monthly?{input:structuredClone(i.acceleration.monthly),period:specialPeriod(b,m),source:monthlySource,assets:accelerations.map(r=>{
|
||||
const input=b.depreciation?.assets.find(a=>a.id===r.assetId),normal=m.depreciation?.assets.find(a=>a.id===r.assetId),accelerated=acceleratedDepreciation?.assets.find(a=>a.id===r.assetId),applied=accDecision.status==='calculated'&&r.status==='calculated'&&accelerated?.status==='calculated',rate=normal?.status==='calculated'&&input?decimalFraction(input.rate):null;
|
||||
return{...(i.acceleration.monthly?.continuation?{prior:{previousAccounting:input?.previousAccounting??'',previousFiscal:input?.previousFiscal??'',available:input?.priorAvailable??'',reference:input?.previousReference??'',normalUsed:normal?.priorUsed??null,normalRemaining:normal?.priorRemaining??null,acceleratedUsed:applied?accelerated.priorUsed:null,acceleratedRemaining:applied?accelerated.priorRemaining:null,normalFiscalRemaining:normal?.remainingFiscal??null,acceleratedFiscalRemaining:applied?accelerated.remainingFiscal:null},exit:{state:input?.exitState??'',date:input?.exitDate??''}}:{}),id:r.id,assetId:r.assetId,assetKey:r.assetKey,description:r.description,start:input?.start??'',months:normal?.months??null,taxBasis:normal?.taxBasis??null,normalRate:rate,acceleratedRate:applied&&rate?mul(rate,3n,2n):null,normalQuota:normal?.quota??null,acceleratedQuota:applied?accelerated.quota:null,normalDeduction:normal?.deduction??null,acceleratedDeduction:applied?accelerated.deduction:null,additionalDeduction:applied&&normal?.deduction&&accelerated.deduction?subtractFractions(accelerated.deduction,normal.deduction):r.status==='not_applicable'?z():null,applied,reason:r.reason};
|
||||
})}:undefined;
|
||||
const combinationsModel=combinations?{...combinations,input:structuredClone(i.combinations!),period:specialPeriod(b,m),subjectNuit:b.base?.subjectNuit??'',reusedL6Benefits:b.base?structuredClone(b.base.benefits):null,order:['Diferença adicionalCBF16 aplicada uma vez ao lucroL6','Matéria colectável recalculada com as mesmas deduções/perdasL6','Cooperativa12:50% da taxa geral32%=16% apenas na base integralmente elegível','Imposto autónomo61(4) separado a35%,sem redução cooperativa','Saldo final a pagar/recuperar permaneceL8'],assetClaims:accelerations.map(r=>{const normal=m.depreciation?.assets.find(a=>a.id===r.assetId),accelerated=acceleratedDepreciation?.assets.find(a=>a.id===r.assetId);return{assetId:r.assetId,document:normal?.document??'',line:normal?.line??'',normalDeduction:normal?.deduction??null,acceleratedDeduction:accelerated?.deduction??null,priorRecoveredIncluded:accelerated?.priorUsed??null,additionalDeduction:normal?.deduction&&accelerated?.deduction?subtractFractions(accelerated.deduction,normal.deduction):null,remainingFiscal:accelerated?.remainingFiscal??null};}),limits:{additionalDeduction,cooperativeRate:coopDecision.status==='calculated'?fraction(16n):null,autonomousRate:fraction(35n),autonomousTax,ordinaryColecta:colecta,combinedColecta}}:undefined;
|
||||
const combinationsReady=combinations?.ready??true;
|
||||
return{...(combinationsModel?{combinations:combinationsModel}:{}),input:structuredClone(i),context:structuredClone(specialContext(draft)),subjectNuit:b.base?.subjectNuit??'',period:specialPeriod(b,m),expenses:{...expenseDecision,rows:expenses,knownAutonomous,autonomousTax,source:specialSources.expenses},cooperative:{...coopDecision,rate:coopDecision.status==='calculated'?fraction(16n):null,source:specialSources.cooperative},acceleration:{...accDecision,rows:accelerations,additionalDeduction,normal:m.depreciation??null,accelerated:acceleratedDepreciation,...(monthlyModel?{monthly:monthlyModel}:{}),source:i.combinations?specialAccelerationSource(i):i.acceleration.monthly?.continuation?specialCessationPriorSource:i.acceleration.monthly?.startPeriod?specialStartPeriodSource:i.acceleration.monthly?specialSources.acceleration+' '+specialMonthlySource:specialSources.acceleration},reference:{taxableProfit:m.taxableProfit,taxableBase:m.taxableBase,colecta:m.colecta??null},taxableProfit:combinationsReady?taxableProfit:null,taxableBase:combinationsReady?base?.taxableBase??null:null,colecta:combinationsReady?colecta:null,combinedColecta:combinationsReady?combinedColecta:null,pending:[...(combinations?.pending??[]),...expenseDecision.pending,...coopDecision.pending,...accDecision.pending,...(base?.pending??[]),...(assessment?.pending??[])],limitations:['L7 parcial:apenas61(4),cooperativa integralmente elegível12 eCBF16 no recorte documentado.','Localização/sector só contextualizam;não activam benefícios.',i.combinations?'Parcelas mistas,outras cumulações/excepções,mais-valias e demais famílias têm correspondência própria.':'Parcelas mistas,cumulação,mais-valias e demais famílias têm correspondência própria.','M20/M22 permanecem preparaçãoL6 de referência;efeitosL7 sem campo oficial presumido.','Colecta combinada não é saldo final a pagar/recuperar;retenções,pagamentos e créditos anuais emL8.'],finalBalance:{scope:'L8',payable:null,recoverable:null}};
|
||||
}
|
||||
export type SpecialModel=ReturnType<typeof calculateSpecial>;
|
||||
const money=(v:FiscalFraction|null)=>{if(!v)return'Indeterminado';const p=fractionPresentation(v);return(p.approximate?'≈':'')+p.decimal+' MZN (exacto '+v.numerator+'/'+v.denominator+')';};
|
||||
const status=(s:Status)=>({calculated:'Calculado no recorte',absent:'Ausência declarada',not_applicable:'Não aplicável',indeterminate:'Informação em falta'})[s];
|
||||
const contextDescription=(c:Record<string,unknown>)=>[['Sector','sector_id'],['Província','province_id'],['Distrito','district_id'],['Posto administrativo','admin_post_id'],['Localidade','locality_id']].map(([label,key])=>label+': '+String(c[key+'_label']||c[key]||'Por identificar')).join(';');
|
||||
export function specialReportRows(m:SpecialModel):Array<[string,string,string,string]>{return[
|
||||
['IRPC — L7','Qualificação comum',`NUIT:${m.subjectNuit};período:${m.period.from}–${m.period.to};${contextDescription(m.context)};${m.limitations.join(' ')}`,'Origem herdada conservada;fonte/condições/período por tratamento;sem concessão pela localização.'],
|
||||
['IRPC — L7','Despesas — imposto autónomo',`${status(m.expenses.status)};parcela conhecida:${money(m.expenses.knownAutonomous)};imposto autónomo reconciliado:${money(m.expenses.autonomousTax)};${m.expenses.reason}`,`${m.input.expenses.qualification.reference};${m.input.expenses.qualification.periodReference};${m.expenses.source}`],
|
||||
...m.expenses.rows.map(r=>['IRPC — L7',r.document+'/'+r.line,`${status(r.status)};natureza:${r.nature||'Por identificar'};despesa:${money(r.amount)};ajustamento36g já emL6:${money(r.l6Adjustment)};novo ajustamento ao lucro:${money(r.additionalProfitAdjustment)};taxa:${r.rate?'35%':'Não aplicada'};imposto autónomo:${money(r.tax)};${r.reason}`,r.reference]as[string,string,string,string]),
|
||||
['IRPC — L7','Cooperativa — redução da taxa',`${status(m.cooperative.status)};tipo:${m.input.cooperative.kind||'Por identificar'};taxa:${m.cooperative.rate?'16%':'Não aplicada'};${m.cooperative.reason}`,`${m.input.cooperative.qualification.reference};${m.input.cooperative.qualification.periodReference};${m.cooperative.source}`],
|
||||
['IRPC — L7','Amortizações aceleradas',`${status(m.acceleration.status)};dedução adicional conciliada:${money(m.acceleration.additionalDeduction)};${m.acceleration.reason}`,`${m.input.acceleration.qualification.reference};${m.input.acceleration.qualification.periodReference};${m.input.acceleration.recognitionReference};${m.acceleration.source}`],
|
||||
...m.acceleration.rows.map(r=>{const a=m.acceleration.accelerated?.assets.find(a=>a.id===r.assetId),n=m.acceleration.normal?.assets.find(a=>a.id===r.assetId);return['IRPC — L7',r.description||r.assetId,`${status(r.status)};quota normal:${money(n?.quota??null)};quota acelerada:${money(a?.quota??null)};dedução normal:${money(n?.deduction??null)};dedução acelerada:${money(a?.deduction??null)};${r.reason}`,r.reference]as[string,string,string,string];}),
|
||||
['IRPC — L7','Efeitos nos totais',`ReferênciaL6:lucro:${money(m.reference.taxableProfit)};base:${money(m.reference.taxableBase)};colecta:${money(m.reference.colecta)}. Após tratamentosL7:lucro:${money(m.taxableProfit)};base:${money(m.taxableBase)};colecta sobre a base:${money(m.colecta)};imposto autónomo:${money(m.expenses.autonomousTax)};colecta combinada:${money(m.combinedColecta)}. Saldo final a pagar/recuperar:Indeterminado (L8).`,m.pending.join(' | ')||'Regras/parcelas reconciliadas neste recorte;simulação,não liquidação final.'],
|
||||
...(m.combinations?specialCombinationsReport(m):[]),
|
||||
...(m.acceleration.monthly?specialMonthlyReport(m.acceleration.monthly,m.acceleration.additionalDeduction):[]),
|
||||
];}
|
||||
|
||||
function specialMonthlyReport(m:NonNullable<SpecialModel['acceleration']['monthly']>,deduction:FiscalFraction|null):Array<[string,string,string,string]>{
|
||||
return[['IRPC — L7','CBF16 — duodécimos reutilizados de L6','Período:'+m.period.from+'–'+m.period.to+';dedução adicional conciliada:'+money(deduction)+';sem nova dedução do activo de origem.',m.input.reference+(m.input.startPeriod?';início de actividade:'+m.input.startPeriod.reference:'')+(m.input.continuation?';período:'+(m.input.continuation.period==='cessation'?'Cessação da actividade':m.input.continuation.period==='annual'?'Ano civil2026':'Informação em falta')+';suporte:'+m.input.continuation.reference+';histórico:'+m.input.continuation.historyReference:'')+';'+m.source],...m.assets.map(a=>['IRPC — L7','CBF16 por duodécimos — '+a.description,'Entrada emuso:'+(a.start||'Informação em falta')+';duodécimosL6:'+(a.months??'Indeterminados')+';base fiscal:'+money(a.taxBasis)+';taxa normal:'+(a.normalRate?fractionPresentation(a.normalRate).decimal+'%':'Indeterminada')+';taxa CBF16:'+(a.acceleratedRate?fractionPresentation(a.acceleratedRate).decimal+'%':'Não aplicada')+';quota normal:'+money(a.normalQuota)+';quota CBF16:'+money(a.acceleratedQuota)+';dedução normal:'+money(a.normalDeduction)+';dedução CBF16:'+money(a.acceleratedDeduction)+';diferença adicional:'+money(a.additionalDeduction)+(a.prior?';quotas contabilísticas anteriores:'+a.prior.previousAccounting+';quotas fiscais anteriores:'+a.prior.previousFiscal+';parcela anterior recuperável declarada:'+a.prior.available+';recuperada normal:'+money(a.prior.normalUsed)+';recuperada CBF16:'+money(a.prior.acceleratedUsed)+';saldo anterior aritmético normal:'+money(a.prior.normalRemaining)+';saldo anterior aritmético CBF16:'+money(a.prior.acceleratedRemaining)+';saldo fiscal normal:'+money(a.prior.normalFiscalRemaining)+';saldo fiscal CBF16:'+money(a.prior.acceleratedFiscalRemaining)+';saída:'+(a.exit?.state==='absent'?'Ausência declarada':a.exit?.state==='known'?'Evento documentado':'Informação em falta')+' '+(a.exit?.date??'')+';sem consumo de saldos oficiais':'')+';'+a.reason,m.source+(a.prior?';suporte das quotas anteriores:'+a.prior.reference:'')]as[string,string,string,string])];
|
||||
}
|
||||
|
||||
function specialCombinationsReport(m:SpecialModel):Array<[string,string,string,string]>{
|
||||
const c=m.combinations!;
|
||||
return[['IRPC — L7','Cumulações — qualificação e ordem','Estado:'+(c.status==='compatible'?'Combinação permitida no recorte':c.status==='incompatible'?'Combinação incompatível':'Informação em falta')+';mesmo sujeito:'+c.subjectNuit+';período:'+c.period.from+'–'+c.period.to+';'+c.order.join(' → ')+';'+c.pending.join(' | '),c.input.reference+';benefícios específicos:'+c.input.specificReference+';outros benefícios:'+c.input.otherReference+';'+c.source],...c.assetClaims.map(a=>['IRPC — L7','Cumulações — activo '+a.assetId,'Documento/linha:'+a.document+'/'+a.line+';dedução normal:'+money(a.normalDeduction)+';dedução CBF16:'+money(a.acceleratedDeduction)+';parcela anterior já incluída na dedução CBF16:'+money(a.priorRecoveredIncluded)+';única diferença adicional:'+money(a.additionalDeduction)+';saldo fiscal aritmético:'+money(a.remainingFiscal)+';sem nova dedução do custo nem consumo de saldo oficial.',c.source]as[string,string,string,string]),['IRPC — L7','Cumulações — limites e totais','Dedução adicional conciliada:'+money(c.limits.additionalDeduction)+';taxa cooperativa:'+(c.limits.cooperativeRate?'16%':'Não aplicada')+';imposto autónomo independente:'+money(c.limits.autonomousTax)+';colecta sobre a base:'+money(m.colecta)+';colecta combinada:'+money(m.combinedColecta)+';saldo final a pagar/recuperar:Indeterminado (L8).',c.source]];
|
||||
}
|
||||
@@ -445,20 +445,25 @@ export function portalNavigation(access: PortalNavAccess): PortalNavItem[] {
|
||||
id: 'discovery',
|
||||
label: 'Descoberta',
|
||||
children: [
|
||||
link(
|
||||
'why',
|
||||
'Porquê investir em Moçambique?',
|
||||
'/porque-investir',
|
||||
),
|
||||
link(
|
||||
'idea-entry',
|
||||
'Partir de uma ideia',
|
||||
'/investimentos/iniciar',
|
||||
),
|
||||
link(
|
||||
'why',
|
||||
'Porquê investir em Moçambique',
|
||||
'/porque-investir',
|
||||
'opportunities',
|
||||
'Consultar oportunidades',
|
||||
'/oportunidades',
|
||||
),
|
||||
link(
|
||||
'opportunities',
|
||||
'Oportunidades de investimento',
|
||||
'/oportunidades',
|
||||
'simulator',
|
||||
'Simulador Fiscal',
|
||||
access.context?.simulator || '/simulador-fiscal',
|
||||
),
|
||||
link('sectors', 'Sectores de investimento', '/sectores'),
|
||||
link('locations', 'Localizações', '/oportunidades?view=map'),
|
||||
@@ -500,11 +505,6 @@ export function portalNavigation(access: PortalNavAccess): PortalNavItem[] {
|
||||
label: 'Realização',
|
||||
children: [
|
||||
link('start', 'Iniciar investimento', '/investimentos/iniciar'),
|
||||
link(
|
||||
'simulator',
|
||||
'Incentivos e simulador fiscal',
|
||||
access.context?.simulator || '/simulador-fiscal',
|
||||
),
|
||||
link(
|
||||
'licensing',
|
||||
'Licenciamento',
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
type Analysis = {version?:number;group?:string;kind?:string;state?:string;need?:string|{state?:string;problem?:string;confirmation?:string;limitations?:string;missing?:string};idea?:{solution?:string;activity?:string;stage?:string;coverage?:string;resources?:string;assumptions?:string;conditions?:string;pending?:string;next_action?:string};proposal?:string;basis?:string;limitations?:string;next_action?:string;stage?:string;resources?:string;assumptions?:string;conditions?:string;relations?:{kind:string;target_id:string;label:string;relationship:string;basis:string}[];evidence?:{id?:string;statement?:string;interpretation?:string;source?:string;locator?:string;period?:string;scope?:string;coverage?:string;verified_on?:string;access?:string}[]};
|
||||
type Source={key?:string;title?:string;version?:string|number;analysis?:{proactive?:Analysis}};
|
||||
export function proactiveInvestmentRows(draft:Record<string,unknown>):Array<[string,string,string,string]>{
|
||||
const rows:Array<[string,string,string,string]>=[],sources:Source[]=[],seen=new Set<string>();
|
||||
try{
|
||||
const selected=draft.context_opportunity_snapshot?JSON.parse(String(draft.context_opportunity_snapshot)):null;
|
||||
const context=draft.context_applicability_snapshot?JSON.parse(String(draft.context_applicability_snapshot)):null;
|
||||
if(selected?.choice?.opportunity)sources.push(selected.choice.opportunity);
|
||||
else if(Array.isArray(context?.opportunity_choices))sources.push(...context.opportunity_choices.map((c:{opportunity:Source})=>c.opportunity));
|
||||
else if(context?.selection?.opportunity)sources.push(context.selection.opportunity);
|
||||
for(const source of sources){
|
||||
const p=source?.analysis?.proactive;if(!p||p.version!==1||!source.key||seen.has(source.key))continue;seen.add(source.key);
|
||||
if(draft.context_opportunity&&draft.context_opportunity!==source.key)continue;
|
||||
const origin=`${source.title??'Ideia por identificar'}; ${source.key}; versão ${source.version??'Por identificar'}`;
|
||||
const kind=p.group??p.kind;
|
||||
const privateNeed=typeof p.need==='object'?p.need:null;
|
||||
rows.push(['Localização','Origem da análise e ideia',source.title??'Por identificar',origin]);
|
||||
if(kind!=='exists')rows.push(['Localização','Estado da necessidade',(privateNeed?.state??p.state)==='confirmed'?'Necessidade confirmada no âmbito documentado; não comprova viabilidade comercial':'Hipótese analítica; informação económica por confirmar',origin]);
|
||||
if(kind!=='exists')rows.push(['Localização','Necessidade identificada',privateNeed?.problem??(typeof p.need==='string'?p.need:'Por determinar'),origin]);
|
||||
if(kind==='ideas')rows.push(['Localização','Proposta de investimento',p.proposal??p.idea?.solution??'Por determinar',origin]);
|
||||
rows.push(['Localização','Fundamento da ideia',p.basis??privateNeed?.confirmation??'Por completar',origin]);
|
||||
if(kind==='ideas')rows.push(['Localização','Etapa e pressupostos',[p.stage??p.idea?.stage,p.idea?.coverage,p.resources??p.idea?.resources,p.assumptions??p.idea?.assumptions,p.conditions??p.idea?.conditions].filter(Boolean).join('; ')||'Por determinar',origin]);
|
||||
rows.push(['Localização','Limitações da ideia',[p.limitations,kind!=='exists'?privateNeed?.limitations:null,kind!=='exists'?privateNeed?.missing:null,kind==='ideas'?p.idea?.pending:null].filter(Boolean).join('; ')||'Por completar',origin]);
|
||||
rows.push(['Localização','Próxima acção da ideia',p.next_action??p.idea?.next_action??'Por determinar',origin]);
|
||||
for(const r of p.relations??[])rows.push(['Localização','Relação documentada ou hipótese',`${r.label}; ${r.relationship}; sem contrato, acesso ou participação presumidos`,`${origin}; ${r.kind}:${r.target_id}; ${r.basis}`]);
|
||||
for(const e of p.evidence??[])rows.push(['Localização','Evidência da ideia',[e.statement,e.interpretation?`Interpretação: ${e.interpretation}`:null,`Período: ${e.period||'Por determinar'}`,`Abrangência: ${e.scope||'Por determinar'}`,`Cobertura: ${e.coverage||'Por determinar'}`,`Verificação: ${e.verified_on||'Por determinar'}`].filter(Boolean).join('; '),`${origin}; fonte: ${e.source||'Por identificar'}; localizador: ${e.locator||'Por identificar'}`]);
|
||||
rows.push(['Localização','Limites da preparação proactiva','Não comprova contrato, encomenda, participação disponível, energia acessível, terra disponível, viabilidade ou benefício fiscal. Informação em falta não é zero.',origin]);
|
||||
}
|
||||
}catch{/* Preserve unreadable original context; do not reconstruct an economic conclusion. */}
|
||||
return rows;
|
||||
}
|
||||
@@ -178,6 +178,8 @@ const rowSection: Record<string, DossierReportSectionId> = {
|
||||
ISPC: 'finance',
|
||||
'IRPC — retenções': 'finance',
|
||||
'IRPC normal — L6': 'finance',
|
||||
'IRPC — L7': 'finance',
|
||||
'IRPC — L8': 'finance',
|
||||
Equipa: 'team',
|
||||
'Necessidade de negócio': 'resources',
|
||||
Financiamento: 'resources',
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import {annualReportRows} from './irpc-annual-settlement.ts';
|
||||
import {proactiveInvestmentRows} from './proactive-investment-report.ts';
|
||||
import {normalReportRows} from './irpc-normal.ts';
|
||||
import {irpcReportRows} from './irpc-withholdings.ts';
|
||||
import {ispcResidualReportRows} from './ispc-residuals.ts';
|
||||
@@ -697,6 +699,7 @@ export function buildProjectDossierRows(
|
||||
rows.push(...ispcResidualReportRows(draft));
|
||||
rows.push(...irpcReportRows(draft));
|
||||
rows.push(...normalReportRows(draft));
|
||||
rows.push(...annualReportRows(draft));
|
||||
rows.push(...fiscalCalculationGapReportRows(draft));
|
||||
rows.push(...l3FormPreparationReportRows(draft));
|
||||
const operationRows = salesReportRows(draft);
|
||||
@@ -802,6 +805,7 @@ export function buildProjectDossierRows(
|
||||
if (land.need === 'yes') rows.push(['Localização', 'Situação do terreno', String(draft.land_status_label ?? ({ owned: 'Próprio', duat: 'DUAT', leased: 'Arrendado', requested: 'Pedido em curso', unknown: 'Por determinar' } as Record<string, string>)[String(draft.land_status)] ?? 'Informação em falta'), 'Informação declarada; não comprova título ou disponibilidade']);
|
||||
else rows.push(['Localização', 'Preparação do terreno', land.need === 'no' ? 'Situação do terreno não aplicável à preparação actual; valores anteriores conservados.' : 'Definir se precisa de terra; pode continuar a preparar o investimento.', 'Sem inferência de dispensa legal']);
|
||||
}
|
||||
rows.push(...proactiveInvestmentRows(draft));
|
||||
const lineageFields: Record<string, string> = {'Título':'project_title','Resumo':'project_summary','Sector':'sector_id','Província':'province_id','Distrito':'district_id','Posto administrativo':'admin_post_id','Localidade':'locality_id'};
|
||||
return rows.map(row => {
|
||||
const key = lineageFields[row[1]];
|
||||
|
||||
@@ -1001,7 +1001,6 @@ export default function PortalInvestidorApp({
|
||||
setQuery={setHeroQuery}
|
||||
onSearch={handleHeroSearch}
|
||||
stats={home.data?.data.stats}
|
||||
onNavigate={navigate}
|
||||
/>
|
||||
<InvestmentContextCards />
|
||||
<QueryStatus
|
||||
|
||||
@@ -60,6 +60,7 @@ export default function Catalogue({
|
||||
setInvestmentSelection(next); sessionStorage.setItem('investment-opportunity-selection', JSON.stringify(next));
|
||||
}
|
||||
const form = useForm({
|
||||
perspective: String(filters.perspective ?? ''),
|
||||
association_type: String(filters.association_type ?? ''),
|
||||
association_target: String(filters.association_target ?? ''),
|
||||
association_purpose: String(filters.association_purpose ?? ''),
|
||||
@@ -601,7 +602,7 @@ export default function Catalogue({
|
||||
</h2>
|
||||
<p>{r.summary}</p>
|
||||
<p className="font-semibold">{money(r)}</p>
|
||||
<p>{r.maturity_label}</p>
|
||||
<p>{r.proactive?(r.proactive.group==='ideas'?'Ideia em preparação':r.proactive.group==='needs'?'Necessidade identificada':'O que existe'):r.maturity_label}</p>
|
||||
<div className="flex flex-wrap gap-4">
|
||||
<Link
|
||||
className="underline"
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import {ProactiveSummary} from '@/components/proactive-investment';
|
||||
import EducationalGuides from '@/components/educational-guides';
|
||||
import InvestmentComplements, { type ComplementOption } from '@/components/investment-complements';
|
||||
import { searchTerritoryHref, investmentPreparationHref } from '@/lib/search-territory';
|
||||
@@ -53,6 +54,7 @@ export default function Detail({
|
||||
<Link href={returnUrl} className="underline">
|
||||
Voltar à pesquisa
|
||||
</Link>
|
||||
<ProactiveSummary value={r.proactive}/>
|
||||
{dossierOrigin && (
|
||||
<p>
|
||||
<Link
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { Head, Link, usePage } from '@inertiajs/react';
|
||||
import type { ReactNode } from 'react';
|
||||
import { PortalMenu } from '@/layouts/portal-navigation';
|
||||
import { cn } from '@/lib/utils';
|
||||
import type { TerritorialSourceEvidence } from '@/components/territorial-source-evidence';
|
||||
import type {
|
||||
StructureGeography,
|
||||
@@ -43,6 +44,7 @@ export type References = {
|
||||
sectors: { id: number; name: string; slug: string }[];
|
||||
};
|
||||
export type Opportunity = {
|
||||
proactive?: import('@/components/proactive-investment').ProactivePublic;
|
||||
id: number;
|
||||
title: string;
|
||||
slug: string;
|
||||
@@ -101,9 +103,11 @@ export const card = 'rounded-xl border border-slate-200 bg-white p-5 shadow-sm';
|
||||
export function Frame({
|
||||
title,
|
||||
children,
|
||||
mainClassName,
|
||||
}: {
|
||||
title: string;
|
||||
children: ReactNode;
|
||||
mainClassName?: string;
|
||||
}) {
|
||||
const { flash } = usePage<{
|
||||
flash?: { success?: string; warning?: string };
|
||||
@@ -112,7 +116,12 @@ export function Frame({
|
||||
<div className="min-h-screen bg-slate-50 text-slate-900">
|
||||
<Head title={title} />
|
||||
<PortalMenu />
|
||||
<main className="mx-auto max-w-7xl space-y-6 px-5 py-9">
|
||||
<main
|
||||
className={cn(
|
||||
'mx-auto max-w-7xl space-y-6 px-5 py-9',
|
||||
mainClassName,
|
||||
)}
|
||||
>
|
||||
<h1 className="text-3xl font-bold">{title}</h1>
|
||||
{flash?.warning && (
|
||||
<p
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import {ProactiveSummary,proactiveView} from '@/components/proactive-investment';
|
||||
import {
|
||||
PreparationSummary,
|
||||
type Preparation,
|
||||
@@ -548,6 +549,8 @@ export default function InvestmentPath(path: Path) {
|
||||
/>
|
||||
)}
|
||||
{!!path.investment_context?.opportunity_choices?.length && <OpportunityChoices contextId={path.case.id} choices={path.investment_context.opportunity_choices}/>}
|
||||
{path.investment_context?.opportunity_choices?.map(choice=><ProactiveSummary key={choice.opportunity.key} value={proactiveView(choice.opportunity.analysis?.proactive)}/>)}
|
||||
{!path.investment_context?.opportunity_choices?.length&&<ProactiveSummary value={proactiveView(path.investment_context?.selection.opportunity?.analysis?.proactive)}/>}
|
||||
<SelectedComplements items={path.investment_context?.complements ?? []}/>
|
||||
<InvestmentRequirements assessment={path.investment_context?.requirements_assessment} contextId={path.case.id} excludedSteps={path.steps.filter((step) => !step.preparation_allowed).map((step) => step.code)}/>
|
||||
{!!path.content_sources?.length && (
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import {ProactiveInvestmentEditor,type ProactiveAnalysis,type ProactiveOptions} from '@/components/proactive-investment';
|
||||
import { ClassificationReview } from '@/components/opportunity-classification';
|
||||
import { createOperationKey } from '@/lib/operation-key';
|
||||
import { valueText } from '@/lib/value-text';
|
||||
@@ -25,6 +26,8 @@ type Entry = {
|
||||
};
|
||||
export default function OpportunityDraft({
|
||||
record,
|
||||
proactiveOptions,
|
||||
proactiveHistory,
|
||||
values,
|
||||
etag,
|
||||
readOnly,
|
||||
@@ -38,6 +41,8 @@ export default function OpportunityDraft({
|
||||
maturityCatalogue,
|
||||
}: {
|
||||
record: Entry | null;
|
||||
proactiveOptions?: ProactiveOptions;
|
||||
proactiveHistory?: {version:number;at:string;state:string;problem:string;confirmation:string}[];
|
||||
values: Values;
|
||||
etag: string | null;
|
||||
readOnly: boolean;
|
||||
@@ -474,6 +479,13 @@ export default function OpportunityDraft({
|
||||
void send('save');
|
||||
}}
|
||||
>
|
||||
{profileMode&&Boolean(data.proactive)&&<fieldset disabled={busy||readOnly||unavailable} className="space-y-3 rounded border p-4"><legend>Contexto existente da análise</legend>
|
||||
<Field label="Título da análise"><input aria-label="Título da análise" className={control} value={String((data.canonical as Record<string,unknown>|undefined)?.official_title??data.title??'')} onChange={e=>{const title=e.target.value;setData(d=>({...d,title,...(d.canonical&&Object.prototype.hasOwnProperty.call(d.canonical,'official_title')?{canonical:{...(d.canonical as Record<string,unknown>),official_title:title}}:{})}));}}/></Field>
|
||||
<Field label="Sector da análise"><select aria-label="Sector da análise" className={control} value={String(data.sector_id??'')} onChange={e=>setData(d=>({...d,sector_id:e.target.value,...(d.canonical?{canonical:{...(d.canonical as Record<string,unknown>),sector_id:Number(e.target.value)||null}}:{})}))}><option value="">Por determinar</option>{sectors.map(s=><option key={s.id} value={s.id}>{s.name}</option>)}</select></Field>
|
||||
<p>Seleccione apenas o nível territorial conhecido; não exige coordenadas, montante ou promotor.</p>
|
||||
{(['province_id','district_id','admin_post_id','locality_id']as const).map((key,index)=><TerritoryLevel key={`proactive-${key}-${path[index-1]?.id??''}`} index={index} parent={path[index-1]?.id??''} selected={path[index]} endpoint="/minhas-oportunidades/territory-options" fieldError={errors[key]} onChange={value=>{const next=[...path.slice(0,index),...(value?[value]:[])];setPath(next);setData(d=>({...d,province_id:next[0]?.id??'',district_id:next[1]?.id??'',admin_post_id:next[2]?.id??'',locality_id:next[3]?.id??''}));}}/>)}
|
||||
</fieldset>}
|
||||
<fieldset disabled={busy || readOnly || unavailable}><ProactiveInvestmentEditor value={data.proactive as ProactiveAnalysis|undefined} onChange={v=>setData(d=>({...d,proactive:v}))} options={proactiveOptions} history={proactiveHistory}/></fieldset>
|
||||
{!profileMode && (
|
||||
<fieldset
|
||||
disabled={busy || readOnly || unavailable}
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
import {ProactivePublicationFields,ProactiveSummary,newPublicProactive,type ProactivePublic,type ProactiveEvidence,type ProactiveOptions} from '@/components/proactive-investment';
|
||||
import { Link, router } from '@inertiajs/react';
|
||||
import { useState } from 'react';
|
||||
import { createOperationKey } from '@/lib/operation-key';
|
||||
import { profileJson, ProfileValidationError } from '@/lib/profile-json';
|
||||
import { Management, Field, control, button } from './shared';
|
||||
|
||||
type Draft = {title: string; summary: string; description: string; limitations: string; source_reference: string; edition: string; source_date: string; sector_id: number | null; territory_ids: string[]};
|
||||
type Projection = {title: string; summary: string; description: string; sector_id: number | null; maturity_label: string; territories: {id: string; label: string}[]};
|
||||
type Draft = {proactive_public?:ProactivePublic;proactive_reviewed?:boolean;title: string; summary: string; description: string; limitations: string; source_reference: string; edition: string; source_date: string; sector_id: number | null; territory_ids: string[]};
|
||||
type Projection = {title: string; summary: string; description: string; sector_id: number | null; maturity_label: string; territories: {id: string; label: string}[];proactive?:ProactivePublic};
|
||||
type Preview = {token: string; action: 'disclose' | 'withdraw'; projection: Projection; current: {title: string; summary: string; description: string; status: string}};
|
||||
|
||||
export default function OpportunityPromotion({record, initial, etag, publicNow, reauthenticationRequired, sectors, territories, history}: {
|
||||
export default function OpportunityPromotion({proactiveEnabled=false,proactiveKind,proactiveRelations=[],proactiveEvidence=[],proactiveOptions,record, initial, etag, publicNow, reauthenticationRequired, sectors, territories, history}: {
|
||||
proactiveRelations?:{id:string;label:string;relationship:string}[];proactiveEnabled?:boolean;proactiveKind?:string;proactiveEvidence?:ProactiveEvidence[];proactiveOptions?:ProactiveOptions;
|
||||
record: {id: number; reference: string}; initial: Draft; etag: string; publicNow: boolean; reauthenticationRequired: boolean;
|
||||
sectors: {id: number; name: string}[]; territories: {id: string; name: string; location_type: string}[];
|
||||
history: {id: string; action: string; actor_user_id: number; occurred_at: string}[];
|
||||
}) {
|
||||
const [draft, setDraft] = useState<Draft>({...initial, source_date: initial.source_date ?? ''});
|
||||
const [draft, setDraft] = useState<Draft>({...initial, source_date: initial.source_date ?? '',...(proactiveEnabled?{proactive_public:initial.proactive_public??{...newPublicProactive(),group:proactiveKind??'ideas'},proactive_reviewed:false}:{})});
|
||||
const [preview, setPreview] = useState<Preview | null>(null);
|
||||
const [operationKey, setOperationKey] = useState(createOperationKey);
|
||||
const [reason, setReason] = useState('');
|
||||
@@ -45,6 +47,7 @@ export default function OpportunityPromotion({record, initial, etag, publicNow,
|
||||
{needsMfa && <p role="alert">Entre novamente com a sua conta e MFA para confirmar esta operação. O cadastro guardado permanece disponível; a prévia ainda não confirmada terá de ser preparada novamente. <button className="underline" onClick={renewAuthentication}>Renovar entrada com MFA</button></p>}
|
||||
{Object.entries(errors).map(([key,value]) => <p role="alert" key={key}>{key}: {value}</p>)}
|
||||
<form className="space-y-4 rounded border p-5" onSubmit={e=>{e.preventDefault(); void prepare('disclose');}}>
|
||||
{proactiveEnabled&&draft.proactive_public&&<ProactivePublicationFields value={draft.proactive_public} onChange={v=>{change('proactive_public',v);change('proactive_reviewed',false);}} evidence={proactiveEvidence} relations={proactiveRelations} options={proactiveOptions} reviewed={Boolean(draft.proactive_reviewed)} onReview={v=>change('proactive_reviewed',v)}/>}
|
||||
<Field label="Título público"><input required className={control} maxLength={255} value={draft.title} onChange={e=>change('title',e.target.value)}/></Field>
|
||||
<Field label="Resumo público"><textarea required className={control} maxLength={499} value={draft.summary} onChange={e=>change('summary',e.target.value)}/></Field>
|
||||
<Field label="Descrição pública"><textarea className={control} maxLength={6000} value={draft.description} onChange={e=>change('description',e.target.value)}/></Field>
|
||||
@@ -62,6 +65,7 @@ export default function OpportunityPromotion({record, initial, etag, publicNow,
|
||||
{preview && <section className="space-y-4 rounded border p-5" aria-label="Prévia da divulgação">
|
||||
<h2 className="text-xl font-semibold">{preview.action === 'withdraw' ? 'Rever retirada do catálogo' : 'Prévia do conteúdo público'}</h2>
|
||||
<p><strong>{preview.projection.maturity_label}</strong></p>
|
||||
<ProactiveSummary value={preview.projection.proactive}/>
|
||||
<h3>{preview.projection.title}</h3><p>{preview.projection.summary}</p><p className="whitespace-pre-wrap">{preview.projection.description}</p>
|
||||
<p>Sector: {sectors.find(s=>s.id===preview.projection.sector_id)?.name ?? 'Por indicar'}</p>
|
||||
<ul>{preview.projection.territories.map(t=><li key={t.id}>{t.label}</li>)}</ul>
|
||||
|
||||
@@ -12,7 +12,9 @@ import { ProvinceSelect } from '@/components/investment-territory';
|
||||
import { SimulationForm } from '@/components/simulation-form';
|
||||
import { InvestmentRoadmap } from '@/components/investment-roadmap';
|
||||
import { JourneyDocumentResources } from '@/components/journey-document-resources';
|
||||
import SectorEntry, { type SectorEntryData } from '@/components/sector-entry';
|
||||
import SectorContent, {
|
||||
type SectorDetailData,
|
||||
} from '@/components/sector-content';
|
||||
import CountrySelect, { type Country } from '@/components/country-select';
|
||||
|
||||
const input =
|
||||
@@ -68,7 +70,8 @@ type Page<T> = {
|
||||
total: number;
|
||||
};
|
||||
type Props = {
|
||||
sectorEntry?: SectorEntryData;
|
||||
sectorEntry?: SectorDetailData['sectorEntry'];
|
||||
sectorDetails?: SectorDetailData[];
|
||||
countries?: Country[];
|
||||
section: string;
|
||||
filters?: Record<string, string | string[]>;
|
||||
@@ -80,19 +83,8 @@ type Props = {
|
||||
url?: string;
|
||||
specializations?: { id: number; name: string; url: string }[];
|
||||
}[];
|
||||
sector?: {
|
||||
id: number;
|
||||
name: string;
|
||||
slug: string;
|
||||
description: string;
|
||||
short_description: string;
|
||||
};
|
||||
opportunities?: {
|
||||
title: string;
|
||||
slug: string;
|
||||
province: string;
|
||||
summary: string;
|
||||
}[];
|
||||
sector?: SectorDetailData['sector'];
|
||||
opportunities?: SectorDetailData['opportunities'];
|
||||
resources?: Page<Resource>;
|
||||
categories?: string[];
|
||||
topics?: string[];
|
||||
@@ -511,8 +503,9 @@ export default function Services(p: Props) {
|
||||
)}
|
||||
{p.section === 'sectors' && (
|
||||
<section
|
||||
id="sectores-indice"
|
||||
aria-label="Todos os sectores de investimento"
|
||||
className="space-y-6"
|
||||
className="scroll-mt-24 space-y-6"
|
||||
>
|
||||
<p className="text-slate-600">
|
||||
Explore o potencial estratégico de cada sector em
|
||||
@@ -525,9 +518,41 @@ export default function Services(p: Props) {
|
||||
description: sector.short_description,
|
||||
opportunitiesCount: sector.opportunities_count,
|
||||
specializations: sector.specializations,
|
||||
url: sector.url,
|
||||
url: p.sectorDetails?.length
|
||||
? `#sector-${sector.slug}`
|
||||
: sector.url,
|
||||
}))}
|
||||
/>
|
||||
{p.sectorDetails?.map((detail) => (
|
||||
<section
|
||||
id={`sector-${detail.sector.slug}`}
|
||||
key={detail.sector.id}
|
||||
aria-labelledby={`sector-heading-${detail.sector.slug}`}
|
||||
className="scroll-mt-24 space-y-5 border-t border-slate-200 pt-6"
|
||||
>
|
||||
<div className="flex flex-wrap items-center justify-between gap-3">
|
||||
<h2
|
||||
id={`sector-heading-${detail.sector.slug}`}
|
||||
className="text-2xl font-bold"
|
||||
>
|
||||
{detail.sector.name}
|
||||
</h2>
|
||||
<Link
|
||||
href={`/sectores/${detail.sector.slug}`}
|
||||
className="inline-flex min-h-11 items-center text-sm font-semibold underline"
|
||||
>
|
||||
Abrir página do sector
|
||||
</Link>
|
||||
</div>
|
||||
<SectorContent {...detail} headingLevel={3} />
|
||||
<a
|
||||
href="#sectores-indice"
|
||||
className="inline-flex min-h-11 items-center text-sm font-semibold underline"
|
||||
>
|
||||
Voltar à lista de sectores
|
||||
</a>
|
||||
</section>
|
||||
))}
|
||||
{!p.sectors?.length && (
|
||||
<p>Não existem sectores publicados.</p>
|
||||
)}
|
||||
@@ -539,99 +564,11 @@ export default function Services(p: Props) {
|
||||
</section>
|
||||
)}
|
||||
{p.section === 'sector' && p.sector && (
|
||||
<>
|
||||
<p className="whitespace-pre-line">
|
||||
{p.sector.description ||
|
||||
p.sector.short_description ||
|
||||
'Descrição sectorial em preparação.'}
|
||||
</p>
|
||||
{!p.sectorEntry && (
|
||||
<Link
|
||||
className={button}
|
||||
href={
|
||||
'/investimentos/iniciar?source=sector:' +
|
||||
p.sector.id
|
||||
}
|
||||
>
|
||||
Iniciar ou continuar uma ideia neste sector
|
||||
</Link>
|
||||
)}
|
||||
{p.sectorEntry && (
|
||||
<SectorEntry
|
||||
data={{
|
||||
...p.sectorEntry,
|
||||
start_href: p.sectorEntry.start_href
|
||||
? '/investimentos/iniciar?source=sector:' +
|
||||
p.sector.id
|
||||
: null,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
<h2 className="text-xl font-bold">
|
||||
Oportunidades no sector
|
||||
</h2>
|
||||
{p.opportunities?.map((o) => (
|
||||
<article
|
||||
key={o.slug}
|
||||
className="rounded border bg-white p-5"
|
||||
>
|
||||
<Link
|
||||
className="text-lg font-bold underline"
|
||||
href={`/oportunidades/${o.slug}`}
|
||||
>
|
||||
{o.title}
|
||||
</Link>
|
||||
<p>{o.province}</p>
|
||||
<p>{o.summary}</p>
|
||||
<ul aria-label="Localizações associadas">
|
||||
{p.sectorEntry?.locations
|
||||
.filter(
|
||||
(l) =>
|
||||
l.href ===
|
||||
`/oportunidades/${o.slug}`,
|
||||
)
|
||||
.filter(
|
||||
(l, i, rows) =>
|
||||
rows.findIndex(
|
||||
(other) =>
|
||||
JSON.stringify(
|
||||
other.location,
|
||||
) ===
|
||||
JSON.stringify(
|
||||
l.location,
|
||||
),
|
||||
) === i,
|
||||
)
|
||||
.map((l, i) => (
|
||||
<li key={i}>
|
||||
{typeof l.location.name ===
|
||||
'string'
|
||||
? l.location.name
|
||||
: 'Consultar localização e fonte na oportunidade'}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</article>
|
||||
))}
|
||||
{!p.opportunities?.length && (
|
||||
<p>Sem oportunidades publicadas neste sector.</p>
|
||||
)}
|
||||
<Link
|
||||
className={button}
|
||||
href={`/oportunidades?sector=${p.sector.slug}`}
|
||||
>
|
||||
Pesquisar todas as oportunidades do sector
|
||||
</Link>
|
||||
<p>
|
||||
<Link href="/como-investir" className="underline">
|
||||
Preparar o investimento
|
||||
</Link>{' '}
|
||||
·{' '}
|
||||
<Link href="/apoio" className="underline">
|
||||
Pedir apoio sectorial
|
||||
</Link>
|
||||
</p>
|
||||
</>
|
||||
<SectorContent
|
||||
sector={p.sector}
|
||||
sectorEntry={p.sectorEntry}
|
||||
opportunities={p.opportunities}
|
||||
/>
|
||||
)}
|
||||
{['procedures', 'documents', 'legislation'].includes(
|
||||
p.section,
|
||||
|
||||
@@ -1,99 +1,201 @@
|
||||
import { Link } from '@inertiajs/react';
|
||||
import { Frame, card, button } from '@/pages/investment/shared';
|
||||
import { cn } from '@/lib/utils';
|
||||
|
||||
const compactCard = cn(card, 'p-4');
|
||||
const compactButton = cn(button, 'min-h-11 px-3 py-1.5 text-sm sm:min-h-9');
|
||||
|
||||
export default function WhyInvest() {
|
||||
return (
|
||||
<Frame title="Porquê investir em Moçambique">
|
||||
<section className={card + ' space-y-4'}>
|
||||
<h2 className="text-2xl font-bold">
|
||||
Encontrar possibilidades e avaliar as condições
|
||||
</h2>
|
||||
<p>
|
||||
Investir começa por identificar uma necessidade, um mercado
|
||||
e uma forma de criar valor. Em Moçambique, explore as
|
||||
possibilidades de produção, transformação, logística,
|
||||
turismo e serviços e compare as condições de cada projecto.
|
||||
Este percurso destina-se a investidores nacionais e
|
||||
estrangeiros, em todo o território nacional.
|
||||
</p>
|
||||
<p>
|
||||
A informação do portal ajuda a comparar possibilidades e a
|
||||
organizar os elementos do dossier. Uma página setorial ou
|
||||
artigo educativo não representa uma oportunidade concreta
|
||||
nem uma recomendação de retorno.
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-3">
|
||||
<Link className={button} href="/oportunidades">
|
||||
Explorar oportunidades publicadas
|
||||
</Link>
|
||||
<Link className={button} href="/investimentos/iniciar">
|
||||
Iniciar ou continuar uma ideia
|
||||
</Link>
|
||||
<Frame
|
||||
title="Porquê investir em Moçambique?"
|
||||
mainClassName="space-y-4 py-6"
|
||||
>
|
||||
<div className="flow-root">
|
||||
<div className="-mx-2 flow-root">
|
||||
<article
|
||||
aria-label="Investir em Moçambique"
|
||||
className="bg-white p-2 lg:float-left lg:w-2/3"
|
||||
>
|
||||
<div className="space-y-3 text-base leading-6 text-slate-700">
|
||||
<p>
|
||||
Investir em Moçambique é escolher um mercado em
|
||||
forte expansão, estrategicamente posicionado na
|
||||
África Austral e integrado na SADC, com acesso
|
||||
directo a seis países vizinhos e a um dos
|
||||
maiores blocos económicos da região. A
|
||||
estabilidade política, a segurança e um ambiente
|
||||
regulatório cada vez mais favorável tornam o
|
||||
país um destino confiável e competitivo para
|
||||
investidores nacionais e estrangeiros.
|
||||
</p>
|
||||
<p>
|
||||
A localização privilegiada faz de Moçambique uma
|
||||
plataforma logística natural. Os portos de
|
||||
Maputo, Beira e Nacala — este último, o porto
|
||||
natural mais profundo da costa oriental africana
|
||||
— funcionam como corredores eficientes para
|
||||
economias sem litoral como as de Malawi, Zâmbia
|
||||
e Zimbabué. Esta infraestrutura sólida consolida
|
||||
o país como um hub regional de comércio,
|
||||
transporte e distribuição.
|
||||
</p>
|
||||
<p>
|
||||
Moçambique reforça a confiança dos investidores
|
||||
por meio de acordos bilaterais de investimento e
|
||||
de tratados de dupla tributação com economias
|
||||
estratégicas, garantindo estabilidade jurídica e
|
||||
protecção aos investimentos. Além disso, oferece
|
||||
incentivos fiscais e aduaneiros competitivos,
|
||||
aliados ao acesso preferencial a grandes
|
||||
mercados internacionais via AGOA (EUA), EBA
|
||||
(União Europeia), preferências comerciais com a
|
||||
China e parcerias com a Índia. Estes mecanismos
|
||||
aumentam a competitividade das empresas que se
|
||||
instalam no país e ampliam o seu alcance global.
|
||||
</p>
|
||||
<p>
|
||||
O país oferece garantias essenciais, como
|
||||
protecção da propriedade, repatriação livre de
|
||||
lucros e incentivos específicos, incluindo
|
||||
isenção de direitos aduaneiros para
|
||||
equipamentos, crédito fiscal, depreciação
|
||||
acelerada e benefícios para tecnologias,
|
||||
formação, inovação e infraestruturas. Sectores
|
||||
prioritários — agricultura, pescas, indústrias
|
||||
rurais, turismo, mineração, petróleo e gás — bem
|
||||
como zonas francas e zonas económicas especiais
|
||||
dispõem de regimes particularmente vantajosos.
|
||||
</p>
|
||||
<p>
|
||||
<strong>
|
||||
Investir em Moçambique é integrar um país em
|
||||
transformação
|
||||
</strong>
|
||||
, rico em recursos, com enorme potencial
|
||||
energético, agricultura fértil, projectos
|
||||
estruturantes em curso e uma visão clara de
|
||||
industrialização. Com reformas consistentes,
|
||||
vantagens logísticas e acesso preferencial a
|
||||
mercados internacionais, o país destaca-se como
|
||||
um dos destinos mais promissores para
|
||||
investidores que buscam crescimento sustentável,
|
||||
estabilidade e oportunidades concretas na África
|
||||
Austral.
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
<div className="p-2 lg:inline-block lg:w-1/3 lg:align-top">
|
||||
<section className={compactCard + ' space-y-3'}>
|
||||
<h2 className="text-xl leading-snug font-bold">
|
||||
Encontrar possibilidades e avaliar as condições
|
||||
</h2>
|
||||
<p>
|
||||
Investir começa por identificar uma necessidade,
|
||||
um mercado e uma forma de criar valor. Em
|
||||
Moçambique, explore as possibilidades de
|
||||
produção, transformação, logística, turismo e
|
||||
serviços e compare as condições de cada
|
||||
projecto. Este percurso destina-se a
|
||||
investidores nacionais e estrangeiros, em todo o
|
||||
território nacional.
|
||||
</p>
|
||||
<p>
|
||||
A informação do portal ajuda a comparar
|
||||
possibilidades e a organizar os elementos do
|
||||
dossier. Uma página setorial ou artigo educativo
|
||||
não representa uma oportunidade concreta nem uma
|
||||
recomendação de retorno.
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<Link
|
||||
className={compactButton}
|
||||
href="/oportunidades"
|
||||
>
|
||||
Explorar oportunidades publicadas
|
||||
</Link>
|
||||
<Link
|
||||
className={compactButton}
|
||||
href="/investimentos/iniciar"
|
||||
>
|
||||
Iniciar ou continuar uma ideia
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
{[
|
||||
[
|
||||
'Produção e transformação',
|
||||
'Compare fornecimento, processamento e comercialização. Avalie matérias-primas, fornecedores, energia, água e procura antes de escolher a escala do projecto.',
|
||||
'/sectores',
|
||||
],
|
||||
[
|
||||
'Território e ligações',
|
||||
'Compare localizações, corredores e parques com o mercado que pretende servir. Confira acessos, logística, infra-estruturas e as condições documentadas de cada ficha.',
|
||||
'/oportunidades?view=map',
|
||||
],
|
||||
[
|
||||
'Serviços e parcerias',
|
||||
'Explore necessidades de empresas e comunidades e possibilidades de cooperação. Distinga uma ideia a desenvolver de uma oportunidade publicada ou de uma parceria formalizada.',
|
||||
'/parcerias',
|
||||
],
|
||||
].map(([title, text, href]) => (
|
||||
<div
|
||||
className="p-2 md:inline-block md:w-1/2 md:align-top lg:w-1/3"
|
||||
key={title}
|
||||
>
|
||||
<article className={compactCard + ' space-y-2'}>
|
||||
<h2 className="text-lg leading-snug font-bold">
|
||||
{title}
|
||||
</h2>
|
||||
<p>{text}</p>
|
||||
<Link className="underline" href={href}>
|
||||
Explorar {title.toLowerCase()}
|
||||
</Link>
|
||||
</article>
|
||||
</div>
|
||||
))}
|
||||
{[
|
||||
[
|
||||
'Sectores e modelos de negócio',
|
||||
'Consulte o conteúdo educativo e as oportunidades cadastradas. Pode iniciar uma ideia mesmo sem um anúncio publicado.',
|
||||
'/sectores',
|
||||
],
|
||||
[
|
||||
'Localizações e enquadramentos',
|
||||
'Explore o mapa e as fichas de corredores, clusters, zonas, parques e projectos. Cada referência conserva a natureza e o fundamento que lhe estão associados.',
|
||||
'/oportunidades?view=map',
|
||||
],
|
||||
[
|
||||
'Fontes para decidir',
|
||||
'Consulte documentos e legislação do acervo publicado. Confirme o âmbito e o período aplicável antes de usar uma informação no seu processo.',
|
||||
'/documentos',
|
||||
],
|
||||
[
|
||||
'Um dossier para desenvolver a ideia',
|
||||
'A oportunidade, o sector e a localização convergem num dossier com cinco fases e 19 etapas. A orientação permite preparar etapas em paralelo e respeita a aplicabilidade de terra e licenciamento.',
|
||||
'/como-investir',
|
||||
],
|
||||
].map(([title, text, href]) => (
|
||||
<div
|
||||
className="p-2 md:inline-block md:w-1/2 md:align-top lg:w-1/3"
|
||||
key={title}
|
||||
>
|
||||
<article className={compactCard + ' space-y-2'}>
|
||||
<h2 className="text-lg leading-snug font-bold">
|
||||
{title}
|
||||
</h2>
|
||||
<p>{text}</p>
|
||||
<Link className="underline" href={href}>
|
||||
Consultar {title.toLowerCase()}
|
||||
</Link>
|
||||
</article>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
<section
|
||||
aria-label="Perspectivas para avaliar o investimento"
|
||||
className="grid gap-4 md:grid-cols-3"
|
||||
>
|
||||
{[
|
||||
[
|
||||
'Produção e transformação',
|
||||
'Compare fornecimento, processamento e comercialização. Avalie matérias-primas, fornecedores, energia, água e procura antes de escolher a escala do projecto.',
|
||||
'/sectores',
|
||||
],
|
||||
[
|
||||
'Território e ligações',
|
||||
'Compare localizações, corredores e parques com o mercado que pretende servir. Confira acessos, logística, infra-estruturas e as condições documentadas de cada ficha.',
|
||||
'/oportunidades?view=map',
|
||||
],
|
||||
[
|
||||
'Serviços e parcerias',
|
||||
'Explore necessidades de empresas e comunidades e possibilidades de cooperação. Distinga uma ideia a desenvolver de uma oportunidade publicada ou de uma parceria formalizada.',
|
||||
'/parcerias',
|
||||
],
|
||||
].map(([title, text, href]) => (
|
||||
<article className={card + ' space-y-3'} key={title}>
|
||||
<h2 className="text-xl font-bold">{title}</h2>
|
||||
<p>{text}</p>
|
||||
<Link className="underline" href={href}>
|
||||
Explorar {title.toLowerCase()}
|
||||
</Link>
|
||||
</article>
|
||||
))}
|
||||
</section>
|
||||
<section className="grid gap-4 md:grid-cols-2">
|
||||
{[
|
||||
[
|
||||
'Sectores e modelos de negócio',
|
||||
'Consulte o conteúdo educativo e as oportunidades cadastradas. Pode iniciar uma ideia mesmo sem um anúncio publicado.',
|
||||
'/sectores',
|
||||
],
|
||||
[
|
||||
'Localizações e enquadramentos',
|
||||
'Explore o mapa e as fichas de corredores, clusters, zonas, parques e projectos. Cada referência conserva a natureza e o fundamento que lhe estão associados.',
|
||||
'/oportunidades?view=map',
|
||||
],
|
||||
[
|
||||
'Fontes para decidir',
|
||||
'Consulte documentos e legislação do acervo publicado. Confirme o âmbito e o período aplicável antes de usar uma informação no seu processo.',
|
||||
'/documentos',
|
||||
],
|
||||
[
|
||||
'Um dossier para desenvolver a ideia',
|
||||
'A oportunidade, o sector e a localização convergem num dossier com cinco fases e 19 etapas. A orientação permite preparar etapas em paralelo e respeita a aplicabilidade de terra e licenciamento.',
|
||||
'/como-investir',
|
||||
],
|
||||
].map(([title, text, href]) => (
|
||||
<article className={card + ' space-y-3'} key={title}>
|
||||
<h2 className="text-xl font-bold">{title}</h2>
|
||||
<p>{text}</p>
|
||||
<Link className="underline" href={href}>
|
||||
Consultar {title.toLowerCase()}
|
||||
</Link>
|
||||
</article>
|
||||
))}
|
||||
</section>
|
||||
<section className={card + ' space-y-3'}>
|
||||
<h2 className="text-xl font-bold">
|
||||
</div>
|
||||
<section className={compactCard + ' space-y-2'}>
|
||||
<h2 className="text-lg leading-snug font-bold">
|
||||
Preparar condições, documentação e apoio
|
||||
</h2>
|
||||
<p>
|
||||
@@ -109,7 +211,7 @@ export default function WhyInvest() {
|
||||
retorno do investimento. Informação desconhecida deve
|
||||
continuar identificada como tal.
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-4">
|
||||
<div className="flex flex-wrap gap-x-3 gap-y-2">
|
||||
<Link className="underline" href="/legislacao">
|
||||
Legislação e enquadramento
|
||||
</Link>
|
||||
@@ -121,8 +223,8 @@ export default function WhyInvest() {
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
<section className={card + ' space-y-3'}>
|
||||
<h2 className="text-xl font-bold">
|
||||
<section className={compactCard + ' space-y-2'}>
|
||||
<h2 className="text-lg leading-snug font-bold">
|
||||
Apoio ao longo do percurso
|
||||
</h2>
|
||||
<p>
|
||||
@@ -131,8 +233,8 @@ export default function WhyInvest() {
|
||||
distinto de submeter um pedido; uma comunicação interna não
|
||||
equivale a uma decisão oficial.
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-4">
|
||||
<Link className={button} href="/balcao-virtual">
|
||||
<div className="flex flex-wrap gap-x-3 gap-y-2">
|
||||
<Link className={compactButton} href="/balcao-virtual">
|
||||
Serviços ao investidor
|
||||
</Link>
|
||||
<Link className="underline" href="/apoio">
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class IrpcAnnualSettlementDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_annual_simulated_balances_round_trip_with_proofs_states_and_preserved_books(): void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);
|
||||
$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);
|
||||
$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));
|
||||
$id=null;$etag=null;
|
||||
foreach(['payable','recoverable','balanced','absent','missing','duplicate','pec']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l8-settlement/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);
|
||||
$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');
|
||||
else $this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');
|
||||
$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);
|
||||
$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$before=json_decode($d['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$scope=$d['context_opportunity'];
|
||||
$b=$s['irpcAnnual'][$scope];$m=$b['result']['model'];
|
||||
foreach(['irpcNormal','irpcWithholdings','books','currencyEvents','ispcQuarters']as$map)$this->assertSame($before[$map],$s[$map]);
|
||||
$this->assertSame('IRPC-annual-settlement/1',$m['version']);
|
||||
$this->assertSame('123456789',$m['subjectNuit']);$this->assertSame('2026',$m['year']);
|
||||
$this->assertSame(['numerator'=>'1408','denominator'=>'1'],$m['assessment']['colecta']);
|
||||
$this->assertFalse($m['officialBalancesConsumed']);$this->assertFalse($m['submitted']);$this->assertFalse($m['refundReceived']);
|
||||
$this->assertSame('known',$m['input']['credits']['state']);$this->assertSame('0',$m['input']['credits']['amount']);
|
||||
if(in_array($case,['missing','duplicate','pec'],true)){
|
||||
$this->assertSame('indeterminate',$m['status']);$this->assertNotEmpty($m['pending']);
|
||||
$this->assertNull($m['arithmeticBalance']);$this->assertNull($m['payable']);$this->assertNull($m['recoverable']);
|
||||
if($case==='missing')$this->assertSame('',$m['input']['ppc']['rows'][0]['effective']);
|
||||
if($case==='pec')$this->assertSame('10',$m['input']['pec']['amount']);
|
||||
if($case==='duplicate')$this->assertCount(2,$m['input']['ppc']['rows']);
|
||||
}else{
|
||||
$this->assertEmpty($m['pending']);
|
||||
$this->assertSame(['payable'=>'payable','recoverable'=>'recoverable','balanced'=>'balanced','absent'=>'payable'][$case],$m['status']);
|
||||
$this->assertSame(['numerator'=>['payable'=>'608','recoverable'=>'-192','balanced'=>'0','absent'=>'1408'][$case],'denominator'=>'1'],$m['arithmeticBalance']);
|
||||
$this->assertSame(['numerator'=>$case==='recoverable'?'192':'0','denominator'=>'1'],$m['recoverable']);
|
||||
if($case==='absent'){$this->assertSame('absent',$m['input']['withholdings']['state']);$this->assertSame('absent',$m['input']['ppc']['state']);}
|
||||
else{$this->assertSame('yes',$m['input']['withholdings']['rows'][0]['incomeIncluded']);$this->assertSame('yes',$m['input']['ppc']['rows'][0]['effective']);}
|
||||
}
|
||||
file_put_contents(base_path('outputs/irpc-l8-settlement/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class IrpcNormalCostsDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
public function test_cost_limits_provisions_and_timing_recover_their_facts_results_and_original_histories(): void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));
|
||||
$expected=['calculated'=>['6730','4430','7088'],'additional'=>['7050','4750','1520'],'limits'=>['7210','4910','7856'],'closing'=>['6530','4230','6768']];$id=null;$etag=null;
|
||||
foreach(['calculated','missing','additional','limits','closing']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l6-costs/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);$p=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$p,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');
|
||||
else $this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$p,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');
|
||||
$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];
|
||||
$this->assertSame('IRPC-normal-adjustments/6',$m['version']);$this->assertArrayHasKey('irpcWithholdings',$s);$this->assertArrayHasKey('books',$s);
|
||||
$this->assertContains('IRPC-normal-adjustments/5',array_column(array_column($b['history'],'model'),'version'));$this->assertSame($b['costs'],$m['costs']['input']);
|
||||
$this->assertNull($m['tax']);$this->assertNull($m['assessment']['finalBalance']['payable']);$this->assertNull($m['assessment']['finalBalance']['recoverable']);
|
||||
if($case==='missing'){$this->assertNull($m['taxableProfit']);$this->assertNull($m['taxableBase']);$this->assertNull($m['colecta']);$this->assertSame('520',$m['schedules']['net']['numerator']);$this->assertSame('40',$m['costs']['rows'][1]['adjustment']['numerator']);}
|
||||
else{[$profit,$base,$tax]=$expected[$case];$this->assertSame($profit,$m['taxableProfit']['numerator']);$this->assertSame($base,$m['taxableBase']['numerator']);$this->assertSame(['numerator'=>$tax,'denominator'=>$case==='additional'?'1':'5'],$m['colecta']);$this->assertSame([],$m['costs']['pending']);}
|
||||
file_put_contents(base_path('outputs/irpc-l6-costs/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
final class IrpcNormalDepreciationDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
public function test_depreciation_parameters_quotas_prior_balances_and_results_recover_without_rewriting_legacy_assets():void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
$expected=['months'=>['6780','4480','7168'],'declining'=>['6630','4330','6928'],'prior'=>['6730','4430','7088'],'specific'=>['13535','8935','7148']];
|
||||
foreach(['months','declining','prior','specific','missing']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l6-depreciation/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);$p=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$p,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');else$this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$p,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$this->assertSame('IRPC-normal-adjustments/7',$m['version']);$this->assertSame($b['depreciation'],$m['depreciation']['input']);$this->assertSame($b['schedules']['assets'],$m['schedules']['input']['assets']);$this->assertSame([],$m['schedules']['assets']);$this->assertContains('IRPC-normal-adjustments/6',array_column(array_column($b['history'],'model'),'version'));$this->assertArrayHasKey('irpcWithholdings',$s);$this->assertNull($m['tax']);$this->assertNull($m['assessment']['finalBalance']['payable']);
|
||||
if($case==='missing'){$this->assertNull($m['depreciation']['adjustment']);$this->assertNull($m['taxableProfit']);$this->assertNull($m['colecta']);$this->assertSame('40',$m['costs']['rows'][1]['adjustment']['numerator']);}
|
||||
else{[$profit,$base,$colecta]=$expected[$case];$this->assertSame($profit,$m['taxableProfit']['numerator']);$this->assertSame($base,$m['taxableBase']['numerator']);$this->assertSame(['numerator'=>$colecta,'denominator'=>'5'],$m['colecta']);$this->assertSame([],$m['depreciation']['pending']);if($case==='prior'){$this->assertSame('20',$m['depreciation']['assets'][0]['priorUsed']['numerator']);$this->assertSame('40',$b['depreciation']['assets'][0]['priorAvailable']);}}
|
||||
file_put_contents(base_path('outputs/irpc-l6-depreciation/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
final class IrpcNormalFormPreparationDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
public function test_form_classification_exact_values_and_unmapped_fields_recover_without_changing_calculation_or_history():void
|
||||
{
|
||||
$db=DB::selectOne('select current_database() as name,inet_server_port() as port');$this->assertSame('simulator_fiscal_delta_20261021_test',$db->name);$this->assertSame(55441,(int)$db->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
foreach(['mapped','fractional','missing','unmapped','booktax']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l6-values-forms/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');else$this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$f=$m['formPreparation'];$fields=array_column($f['fields'],null,'code');$this->assertSame('IRPC-normal-adjustments/9',$m['version']);$this->assertSame($b['forms'],$f['input']);$this->assertContains('IRPC-normal-adjustments/8',array_column(array_column($b['history'],'model'),'version'));$this->assertArrayHasKey('irpcWithholdings',$s);$this->assertSame('3130',$m['taxableProfit']['numerator']);$this->assertSame($m['taxableProfit'],$m['taxableBase']);$this->assertSame(['numerator'=>'5008','denominator'=>'5'],$m['colecta']);$this->assertNull($m['assessment']['finalBalance']['payable']);$this->assertNull($fields['309–316']['value']);$this->assertFalse($f['transport']['ready']);$this->assertSame($m['colecta'],$fields['300']['value']);
|
||||
if($case==='missing'){$this->assertNull($f['netResult']);$this->assertNull($fields['200']['value']);$this->assertSame($m['taxableProfit'],$fields['260']['value']);}
|
||||
elseif($case==='unmapped'||$case==='booktax'){$this->assertNull($fields['258']['value']);$this->assertNotEmpty($f['unmapped']);$this->assertFalse($f['reconciliation']['matches']);}
|
||||
else{$this->assertSame('3120',$f['netResult']['numerator']);$this->assertTrue($f['reconciliation']['matches']);$this->assertSame('0',$fields['213']['value']['numerator']);}
|
||||
if($case==='booktax'){$this->assertSame('2800',$f['netResult']['numerator']);$this->assertSame('0',$fields['213']['value']['numerator']);}
|
||||
if($case==='fractional'){$parts=array_column($f['m20'],null,'account');$this->assertSame(['numerator'=>'601','denominator'=>'2'],$parts['6.3']['value']);$this->assertFalse($parts['6.3']['representation']['ready']);$this->assertNull($parts['6.3']['representation']['represented']);}
|
||||
file_put_contents(base_path('outputs/irpc-l6-values-forms/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
final class IrpcNormalPeriodFxDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
public function test_period_and_currency_source_evidence_recover_with_original_plan_and_histories():void
|
||||
{
|
||||
$db=DB::selectOne('select current_database() as name,inet_server_port() as port');$this->assertSame('simulator_fiscal_delta_20261021_test',$db->name);$this->assertSame(55441,(int)$db->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
foreach(['short','fx','missing','loss']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l6-periods-fx/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');else$this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$this->assertSame('IRPC-normal-adjustments/8',$m['version']);$this->assertSame($b['periodsFx'],$m['periodsFx']['input']);$this->assertContains('IRPC-normal-adjustments/7',array_column(array_column($b['history'],'model'),'version'));$this->assertArrayHasKey('irpcWithholdings',$s);$this->assertNull($m['assessment']['finalBalance']['payable']);$this->assertNull($m['tax']);
|
||||
if($case==='short'||$case==='fx'){$this->assertSame($case==='short'?'3130':'200320',$m['taxableProfit']['numerator']);$this->assertSame($m['taxableProfit'],$m['taxableBase']);$this->assertSame(['numerator'=>$case==='short'?'5008':'320512','denominator'=>'5'],$m['colecta']);$this->assertSame(6,$m['periodsFx']['months']);$this->assertSame([],$m['periodsFx']['pending']);}
|
||||
else{$this->assertNull($m['colecta']);if($case==='loss'){$this->assertSame('3130',$m['taxableProfit']['numerator']);$this->assertNull($m['taxableBase']);}else{$this->assertNull($m['accountingProfit']);$this->assertNotEmpty($m['periodsFx']['pending']);}}
|
||||
file_put_contents(base_path('outputs/irpc-l6-periods-fx/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class IrpcSpecialCessationPriorDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_cbf16_cessation_and_prior_quotas_recover_without_consuming_declared_balances(): void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);
|
||||
$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
foreach(['cessation','prior','annual','exit','missing','negative','absent']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l7-cessation-prior/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);
|
||||
$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');
|
||||
else $this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');
|
||||
$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$a=$m['special']['acceleration'];
|
||||
$this->assertSame('IRPC-normal-adjustments/13',$m['version']);$this->assertSame($b['special']['acceleration']['monthly'],$a['monthly']['input']);
|
||||
$this->assertContains('IRPC-normal-adjustments/12',array_column(array_column($b['history'],'model'),'version'));
|
||||
$this->assertContains('IRPC-normal-adjustments/11',array_column(array_column($b['history'],'model'),'version'));
|
||||
$this->assertSame($b['depreciation'],$a['normal']['input']);$this->assertSame(['scope'=>'L8','payable'=>null,'recoverable'=>null],$m['special']['finalBalance']);
|
||||
$this->assertNull($m['tax']);$this->assertArrayHasKey('irpcWithholdings',$s);
|
||||
if($case==='cessation'){
|
||||
$v=$a['monthly']['assets'][0];$this->assertSame(6,$v['months']);$this->assertSame('absent',$v['exit']['state']);$this->assertSame('10',$a['additionalDeduction']['numerator']);
|
||||
$this->assertSame('3120',$m['special']['taxableProfit']['numerator']);$this->assertSame(['numerator'=>'4992','denominator'=>'5'],$m['special']['colecta']);
|
||||
}elseif($case==='prior'||$case==='annual'){
|
||||
$v=$a['monthly']['assets'][0];$this->assertSame('150',$b['depreciation']['assets'][0]['previousAccounting']);$this->assertSame('100',$b['depreciation']['assets'][0]['previousFiscal']);$this->assertSame('50',$b['depreciation']['assets'][0]['priorAvailable']);
|
||||
$this->assertSame($case==='prior'?'15':'30',$v['prior']['acceleratedUsed']['numerator']);$this->assertSame($case==='prior'?'35':'20',$v['prior']['acceleratedRemaining']['numerator']);
|
||||
$this->assertSame($case==='prior'?'25':'50',$a['additionalDeduction']['numerator']);$this->assertSame($case==='prior'?'3105':'6210',$m['special']['taxableProfit']['numerator']);
|
||||
$this->assertSame(['numerator'=>$case==='prior'?'4968':'9936','denominator'=>'5'],$m['special']['colecta']);$this->assertSame($b['depreciation'],$a['accelerated']['input']);
|
||||
}elseif($case==='exit'){
|
||||
$v=$a['monthly']['assets'][0];$this->assertSame(5,$v['months']);$this->assertSame('2026-06-20',$v['exit']['date']);
|
||||
$this->assertSame(['numerator'=>'125','denominator'=>'3'],$v['normalQuota']);$this->assertSame(['numerator'=>'125','denominator'=>'6'],$a['additionalDeduction']);
|
||||
}elseif($case==='missing'){
|
||||
$this->assertSame('indeterminate',$a['status']);$this->assertNull($a['additionalDeduction']);$this->assertSame('3130',$m['taxableProfit']['numerator']);$this->assertNull($m['special']['colecta']);
|
||||
}elseif($case==='negative'){
|
||||
$this->assertSame('not_applicable',$a['rows'][0]['status']);$this->assertFalse($a['monthly']['assets'][0]['applied']);$this->assertSame('0',$a['additionalDeduction']['numerator']);
|
||||
}else{
|
||||
$this->assertSame('absent',$a['status']);$this->assertSame([],$a['monthly']['assets']);$this->assertSame('0',$a['additionalDeduction']['numerator']);
|
||||
}
|
||||
file_put_contents(base_path('outputs/irpc-l7-cessation-prior/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class IrpcSpecialCombinationsDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
public function test_qualified_combinations_and_incompatibilities_round_trip_without_rewriting_inputs(): void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
foreach(['combined','autonomous','incompatible','missing','exception','negative','absent']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l7-combinations/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);
|
||||
$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');
|
||||
else $this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');
|
||||
$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$v=$m['special'];$c=$v['combinations'];
|
||||
$this->assertSame('IRPC-normal-adjustments/14',$m['version']);$this->assertSame($b['special']['combinations'],$c['input']);
|
||||
$this->assertContains('IRPC-normal-adjustments/13',array_column(array_column($b['history'],'model'),'version'));
|
||||
$this->assertSame('150',$b['depreciation']['assets'][0]['previousAccounting']);$this->assertSame('100',$b['depreciation']['assets'][0]['previousFiscal']);$this->assertSame('50',$b['depreciation']['assets'][0]['priorAvailable']);
|
||||
$this->assertSame($b['depreciation'],$v['acceleration']['normal']['input']);$this->assertSame(['scope'=>'L8','payable'=>null,'recoverable'=>null],$v['finalBalance']);$this->assertNull($m['tax']);$this->assertArrayHasKey('irpcWithholdings',$s);
|
||||
if(in_array($case,['combined','autonomous'],true)){
|
||||
$this->assertSame('compatible',$c['status']);$this->assertSame('25',$v['acceleration']['additionalDeduction']['numerator']);$this->assertSame('15',$c['assetClaims'][0]['priorRecoveredIncluded']['numerator']);$this->assertSame('75',$c['assetClaims'][0]['acceleratedDeduction']['numerator']);
|
||||
$this->assertSame('16',$v['cooperative']['rate']['numerator']);$this->assertSame($case==='combined'?'3105':'3205',$v['taxableBase']['numerator']);
|
||||
$this->assertSame(['numerator'=>$case==='combined'?'2484':'2739','denominator'=>'5'],$v['combinedColecta']);
|
||||
if($case==='autonomous'){$this->assertSame('35',$v['expenses']['autonomousTax']['numerator']);$this->assertSame('0',$v['expenses']['rows'][0]['additionalProfitAdjustment']['numerator']);}
|
||||
}elseif(in_array($case,['incompatible','missing','exception'],true)){
|
||||
$this->assertSame($case==='incompatible'?'incompatible':'indeterminate',$c['status']);$this->assertNull($v['taxableBase']);$this->assertNull($v['combinedColecta']);$this->assertSame('3130',$m['taxableProfit']['numerator']);
|
||||
}elseif($case==='negative'){
|
||||
$this->assertSame('not_applicable',$v['cooperative']['status']);$this->assertSame(['numerator'=>'4968','denominator'=>'5'],$v['colecta']);
|
||||
}else{
|
||||
$this->assertSame('absent',$v['acceleration']['status']);$this->assertSame('0',$v['acceleration']['additionalDeduction']['numerator']);$this->assertSame(['numerator'=>'2504','denominator'=>'5'],$v['colecta']);
|
||||
}
|
||||
file_put_contents(base_path('outputs/irpc-l7-combinations/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class IrpcSpecialDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_special_treatments_recover_with_original_plan_history_and_indeterminate_cases(): void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);
|
||||
$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);
|
||||
$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));
|
||||
$id=null;$etag=null;
|
||||
foreach(['expense','missing','negative','absent','cooperative','acceleration'] as $case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l7-common/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);
|
||||
$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');
|
||||
else $this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');
|
||||
$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$l7=$m['special'];
|
||||
$this->assertSame('IRPC-normal-adjustments/10',$m['version']);
|
||||
$this->assertSame($b['special'],$l7['input']);
|
||||
$this->assertContains('IRPC-normal-adjustments/9',array_column(array_column($b['history'],'model'),'version'));
|
||||
$this->assertArrayHasKey('irpcWithholdings',$s);$this->assertArrayHasKey('books',$s);
|
||||
$this->assertNull($m['tax']);$this->assertNull($l7['finalBalance']['payable']);$this->assertNull($l7['finalBalance']['recoverable']);
|
||||
$this->assertSame('123456789',$l7['subjectNuit']);
|
||||
$this->assertStringContainsString('61(4)',$l7['expenses']['source']);
|
||||
if($case==='expense'){
|
||||
$this->assertSame('35',$l7['expenses']['autonomousTax']['numerator']);
|
||||
$this->assertSame('100',$l7['expenses']['rows'][0]['l6Adjustment']['numerator']);
|
||||
$this->assertSame('0',$l7['expenses']['rows'][0]['additionalProfitAdjustment']['numerator']);
|
||||
$this->assertSame($m['taxableProfit'],$l7['taxableProfit']);
|
||||
$this->assertSame(['numerator'=>'5343','denominator'=>'5'],$l7['combinedColecta']);
|
||||
}elseif($case==='missing'){
|
||||
$this->assertSame('indeterminate',$l7['expenses']['status']);$this->assertNull($l7['expenses']['autonomousTax']);$this->assertNull($l7['combinedColecta']);
|
||||
$this->assertSame('3230',$m['taxableProfit']['numerator']);
|
||||
}elseif($case==='negative'){
|
||||
$this->assertSame('not_applicable',$l7['expenses']['rows'][0]['status']);$this->assertSame('0',$l7['expenses']['autonomousTax']['numerator']);
|
||||
}elseif($case==='absent'){
|
||||
$this->assertSame('absent',$l7['expenses']['status']);$this->assertSame('0',$l7['expenses']['autonomousTax']['numerator']);
|
||||
}elseif($case==='cooperative'){
|
||||
$this->assertSame('16',$l7['cooperative']['rate']['numerator']);$this->assertSame(['numerator'=>'2504','denominator'=>'5'],$l7['colecta']);
|
||||
$this->assertSame(['numerator'=>'5008','denominator'=>'5'],$m['colecta']);
|
||||
}else{
|
||||
$this->assertSame('20',$l7['acceleration']['additionalDeduction']['numerator']);
|
||||
$this->assertSame('150',$l7['acceleration']['accelerated']['assets'][0]['quota']['numerator']);
|
||||
$this->assertSame('120',$l7['acceleration']['accelerated']['assets'][0]['deduction']['numerator']);
|
||||
$this->assertSame('6240',$l7['taxableProfit']['numerator']);$this->assertSame('6260',$m['taxableProfit']['numerator']);
|
||||
$this->assertSame($b['depreciation'],$l7['acceleration']['accelerated']['input']);
|
||||
}
|
||||
file_put_contents(base_path('outputs/irpc-l7-common/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class IrpcSpecialMonthlyDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_monthly_cbf16_recovers_new_results_missing_cases_and_accepted_history(): void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);
|
||||
$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
foreach(['monthly','fraction','missing','negative','absent']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l7-months/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);
|
||||
$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');
|
||||
else $this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');
|
||||
$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$a=$m['special']['acceleration'];
|
||||
$this->assertSame('IRPC-normal-adjustments/11',$m['version']);$this->assertSame($b['special']['acceleration']['monthly'],$a['monthly']['input']);
|
||||
$this->assertContains('IRPC-normal-adjustments/10',array_column(array_column($b['history'],'model'),'version'));
|
||||
$this->assertSame($b['depreciation'],$a['normal']['input']);$this->assertSame('L8',$m['special']['finalBalance']['scope']);$this->assertNull($m['special']['finalBalance']['payable']);
|
||||
$this->assertNull($m['special']['finalBalance']['recoverable']);$this->assertNull($m['tax']);$this->assertArrayHasKey('irpcWithholdings',$s);
|
||||
if($case==='monthly'){
|
||||
$v=$a['monthly']['assets'][0];$this->assertSame(6,$v['months']);$this->assertSame('50',$v['normalQuota']['numerator']);$this->assertSame('75',$v['acceleratedQuota']['numerator']);
|
||||
$this->assertSame('60',$v['acceleratedDeduction']['numerator']);$this->assertSame('10',$a['additionalDeduction']['numerator']);
|
||||
$this->assertSame('6310',$m['taxableProfit']['numerator']);$this->assertSame('6300',$m['special']['taxableProfit']['numerator']);$this->assertSame('2016',$m['special']['colecta']['numerator']);
|
||||
$this->assertSame($b['depreciation'],$a['accelerated']['input']);
|
||||
}elseif($case==='fraction'){
|
||||
$v=$a['monthly']['assets'][0];$this->assertSame(1,$v['months']);$this->assertSame(['numerator'=>'25','denominator'=>'3'],$v['normalQuota']);$this->assertSame(['numerator'=>'25','denominator'=>'6'],$a['additionalDeduction']);
|
||||
}elseif($case==='missing'){
|
||||
$this->assertSame('indeterminate',$a['status']);$this->assertNull($a['additionalDeduction']);$this->assertSame('6310',$m['taxableProfit']['numerator']);$this->assertNull($m['special']['colecta']);
|
||||
}elseif($case==='negative'){
|
||||
$this->assertSame('not_applicable',$a['rows'][0]['status']);$this->assertFalse($a['monthly']['assets'][0]['applied']);$this->assertSame('0',$a['additionalDeduction']['numerator']);
|
||||
}else{
|
||||
$this->assertSame('absent',$a['status']);$this->assertSame([],$a['monthly']['assets']);$this->assertSame('0',$a['additionalDeduction']['numerator']);
|
||||
}
|
||||
file_put_contents(base_path('outputs/irpc-l7-months/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class IrpcSpecialStartPeriodDraftTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_start_period_cbf16_recovers_new_results_missing_cases_and_accepted_history(): void
|
||||
{
|
||||
$target=DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test',$target->name);$this->assertSame(55441,(int)$target->port);
|
||||
config(['investor-path.enabled'=>true,'suitecrm.enabled'=>false]);
|
||||
$this->actingAs(User::factory()->create(['email_verified_at'=>now()]));$id=null;$etag=null;
|
||||
foreach(['start','fraction','missing','negative','absent']as$case){
|
||||
$d=json_decode(file_get_contents(base_path('outputs/irpc-l7-start-period/'.$case.'.json')),true,flags:JSON_THROW_ON_ERROR);
|
||||
$personal=['person_type'=>$d['person_type']];unset($d['person_type']);
|
||||
if($id===null)$id=$this->postJson('/api/v1/simulation-drafts',['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['Idempotency-Key'=>(string)Str::uuid()])->assertCreated()->json('data.id');
|
||||
else $this->putJson('/api/v1/simulation-drafts/'.$id,['personal_snapshot'=>$personal,'economic_snapshot'=>$d],['If-Match'=>$etag])->assertOk();
|
||||
$r=$this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk();$etag=$r->headers->get('ETag');$back=$r->json('data.economic_snapshot');
|
||||
$this->assertSame($d['modelo_a_snapshot'],$back['modelo_a_snapshot']);$this->assertSame($d['business_plan_snapshot'],$back['business_plan_snapshot']);
|
||||
$s=json_decode($back['modelo_a_snapshot'],true,flags:JSON_THROW_ON_ERROR);$b=$s['irpcNormal'][$d['context_opportunity']];$m=$b['result']['model'];$a=$m['special']['acceleration'];
|
||||
$this->assertSame('IRPC-normal-adjustments/12',$m['version']);$this->assertSame($b['special']['acceleration']['monthly'],$a['monthly']['input']);
|
||||
$this->assertContains('IRPC-normal-adjustments/11',array_column(array_column($b['history'],'model'),'version'));$this->assertContains('IRPC-normal-adjustments/10',array_column(array_column($b['history'],'model'),'version'));
|
||||
$this->assertSame($b['depreciation'],$a['normal']['input']);$this->assertSame('L8',$m['special']['finalBalance']['scope']);$this->assertNull($m['special']['finalBalance']['payable']);
|
||||
$this->assertNull($m['special']['finalBalance']['recoverable']);$this->assertNull($m['tax']);$this->assertArrayHasKey('irpcWithholdings',$s);
|
||||
if($case==='start'){
|
||||
$v=$a['monthly']['assets'][0];$this->assertSame(6,$v['months']);$this->assertSame('50',$v['normalQuota']['numerator']);$this->assertSame('75',$v['acceleratedQuota']['numerator']);
|
||||
$this->assertSame('60',$v['acceleratedDeduction']['numerator']);$this->assertSame('10',$a['additionalDeduction']['numerator']);
|
||||
$this->assertSame('3130',$m['taxableProfit']['numerator']);$this->assertSame('3120',$m['special']['taxableProfit']['numerator']);$this->assertSame(['numerator'=>'4992','denominator'=>'5'],$m['special']['colecta']);$this->assertTrue($m['periodsFx']['short']);$this->assertSame('2026-07-01',$a['monthly']['period']['from']);$this->assertStringContainsString('início de actividade',$a['source']);
|
||||
$this->assertSame($b['depreciation'],$a['accelerated']['input']);
|
||||
}elseif($case==='fraction'){
|
||||
$v=$a['monthly']['assets'][0];$this->assertSame(1,$v['months']);$this->assertSame(['numerator'=>'25','denominator'=>'3'],$v['normalQuota']);$this->assertSame(['numerator'=>'5','denominator'=>'3'],$a['additionalDeduction']);
|
||||
}elseif($case==='missing'){
|
||||
$this->assertSame('indeterminate',$a['status']);$this->assertNull($a['additionalDeduction']);$this->assertSame('3130',$m['taxableProfit']['numerator']);$this->assertNull($m['special']['colecta']);
|
||||
}elseif($case==='negative'){
|
||||
$this->assertSame('not_applicable',$a['rows'][0]['status']);$this->assertFalse($a['monthly']['assets'][0]['applied']);$this->assertSame('0',$a['additionalDeduction']['numerator']);
|
||||
}else{
|
||||
$this->assertSame('absent',$a['status']);$this->assertSame([],$a['monthly']['assets']);$this->assertSame('0',$a['additionalDeduction']['numerator']);
|
||||
}
|
||||
file_put_contents(base_path('outputs/irpc-l7-start-period/recovered-'.$case.'.json'),json_encode($back,JSON_THROW_ON_ERROR|JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\Opportunity;
|
||||
use App\Models\User;
|
||||
use App\Services\OpportunityManagement;
|
||||
use App\Services\ProactiveInvestment;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\Support\ProactiveInvestmentFixture as F;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class ProactiveInvestmentTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
private User $actor;
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();F::guard();$this->withoutVite();
|
||||
config(['portal.profile_access_enabled'=>true,'portal.opportunity_specialized_drafts_enabled'=>true,'portal.managers'=>[],'investor-path.enabled'=>true,'suitecrm.enabled'=>false,'investmoz_ai.enabled'=>false]);
|
||||
$this->actor=F::operator();$this->login($this->actor);
|
||||
}
|
||||
private function login(User $u): void {$this->actingAs($u)->withSession(['portal.mfa_actor'=>$u->id,'portal.mfa_at'=>time(),'portal.access_revision'=>(int)$u->portal_access_revision]);}
|
||||
private function create(string $pilot='Cahora Bassa'): Opportunity
|
||||
{
|
||||
$response=$this->postJson('/minhas-oportunidades/drafts',F::input($pilot));if($response->status()!==201)fwrite(STDERR,substr($response->getContent(),0,400)."\n");$id=$response->assertCreated()->json('id');return Opportunity::findOrFail($id);
|
||||
}
|
||||
private function publication(Opportunity $o,array $patch=[]): array
|
||||
{
|
||||
$a=app(OpportunityManagement::class)->values($o)['proactive'];
|
||||
return [...['etag'=>app(OpportunityManagement::class)->etag($o),'action'=>'disclose','title'=>$o->title,'summary'=>'SYNTHETIC QA ideia em preparação; não é oportunidade com participação disponível.','description'=>'Conteúdo público expressamente redigido.','limitations'=>'Conclusões locais por confirmar.','source_reference'=>'SYNTHETIC QA exemplo público','edition'=>'QA1','source_date'=>'2026-10-27','sector_id'=>$o->sector_id,'territory_ids'=>[$o->primary_territory_id]],...F::publication($a),...$patch];
|
||||
}
|
||||
private function publish(Opportunity $o): array
|
||||
{
|
||||
$p=$this->postJson('/minhas-oportunidades/'.$o->id.'/divulgacao/previa',$this->publication($o))->assertOk()->json();
|
||||
$input=['token'=>$p['token'],'operation_key'=>(string)Str::uuid(),'confirm'=>true,'reason'=>'SYNTHETIC QA explicit public projection reviewed without private information'];
|
||||
$this->postJson('/minhas-oportunidades/'.$o->id.'/divulgacao/confirmar',$input)->assertOk();return $input;
|
||||
}
|
||||
public function test_legacy_records_without_analysis_add_no_publication_lookup(): void
|
||||
{
|
||||
$o=new Opportunity;$o->forceFill(['workflow_context'=>[]]);DB::enableQueryLog();DB::flushQueryLog();
|
||||
$this->assertNull(app(ProactiveInvestment::class)->publicData($o));$this->assertSame([],DB::getQueryLog());DB::disableQueryLog();
|
||||
}
|
||||
public function test_create_recover_edit_with_etag_and_historical_foundation_without_financial_or_promoter_requirements(): void
|
||||
{
|
||||
$o=$this->create();$a=app(OpportunityManagement::class)->values($o)['proactive'];$tag=app(OpportunityManagement::class)->etag($o);
|
||||
$this->assertNull($o->estimated_investment_amount);$this->assertNull($o->promoter_name);$this->assertNotNull($o->primary_territory_id);
|
||||
$this->get('/minhas-oportunidades/'.$o->id.'/edit')->assertOk()->assertInertia(fn($page)=>$page->where('values.proactive.need.state','hypothesis')->has('proactiveHistory',1));
|
||||
$a['need']['state']='confirmed';$a['need']['confirmation']='SYNTHETIC QA confirmation of fixture conditions only, no real market validation.';
|
||||
$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>$tag,'proactive'=>$a,'reason'=>'SYNTHETIC QA updated documented foundation for this fixture only'])->assertOk();
|
||||
$this->assertSame('confirmed',app(OpportunityManagement::class)->values($o->fresh())['proactive']['need']['state']);
|
||||
$history=app(ProactiveInvestment::class)->history($o);$this->assertCount(2,$history);$this->assertSame('hypothesis',$history[1]['state']);
|
||||
$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>$tag,'proactive'=>$a,'reason'=>'SYNTHETIC QA stale version cannot overwrite current analysis'])->assertStatus(409);
|
||||
}
|
||||
public function test_hypothesis_cannot_be_confirmed_without_documented_conditions_and_missing_is_not_zero(): void
|
||||
{
|
||||
$o=$this->create();$a=app(OpportunityManagement::class)->values($o)['proactive'];$a['need']['state']='confirmed';$a['need']['observed_demand']='';
|
||||
$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>app(OpportunityManagement::class)->etag($o),'proactive'=>$a,'reason'=>'SYNTHETIC QA incomplete confirmation must preserve prior hypothesis'])->assertUnprocessable();
|
||||
$this->assertSame('hypothesis',app(OpportunityManagement::class)->values($o->fresh())['proactive']['need']['state']);
|
||||
$a['need']['state']='hypothesis';$a['idea']['resources']='';$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>app(OpportunityManagement::class)->etag($o),'proactive'=>$a,'reason'=>'SYNTHETIC QA unknown resource remains blank rather than zero'])->assertOk();
|
||||
$this->assertNull(app(OpportunityManagement::class)->values($o->fresh())['proactive']['idea']['resources']);
|
||||
}
|
||||
public function test_methodology_alone_cannot_confirm_local_need(): void
|
||||
{
|
||||
$o=$this->create();$a=app(OpportunityManagement::class)->values($o)['proactive'];$a['need']['state']='confirmed';$a['evidence'][0]['purpose']='methodology';
|
||||
$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>app(OpportunityManagement::class)->etag($o),'proactive'=>$a,'reason'=>'SYNTHETIC QA international methodology is not evidence of local demand'])->assertUnprocessable();
|
||||
$this->assertSame('hypothesis',app(OpportunityManagement::class)->values($o->fresh())['proactive']['need']['state']);
|
||||
}
|
||||
public function test_creation_replay_and_duplicate_evidence_and_relations_do_not_duplicate_analysis(): void
|
||||
{
|
||||
$input=F::input();$id=$this->postJson('/minhas-oportunidades/drafts',$input)->assertCreated()->json('id');$this->postJson('/minhas-oportunidades/drafts',$input)->assertCreated()->assertJsonPath('id',$id);
|
||||
$o=Opportunity::findOrFail($id);$a=$input['proactive'];$a['evidence'][]=[...$a['evidence'][0],'id'=>(string)Str::uuid()];
|
||||
$this->putJson('/minhas-oportunidades/'.$id.'/draft',['etag'=>app(OpportunityManagement::class)->etag($o),'proactive'=>$a,'reason'=>'SYNTHETIC QA repeated evidence must be reconciled, not counted twice'])->assertUnprocessable();
|
||||
$this->assertSame(1,Opportunity::where('management_creation_key',$input['creation_key'])->count());
|
||||
}
|
||||
public function test_document_from_another_scope_cannot_be_attached_or_reclassified_as_public(): void
|
||||
{
|
||||
$o=$this->create();$a=app(OpportunityManagement::class)->values($o)['proactive'];$a['evidence'][0]['document_id']=(string)Str::uuid();
|
||||
$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>app(OpportunityManagement::class)->etag($o),'proactive'=>$a,'reason'=>'SYNTHETIC QA document association must use existing access rules'])->assertUnprocessable();
|
||||
}
|
||||
public function test_existing_permissions_reject_unassigned_and_unrelated_operators(): void
|
||||
{
|
||||
$o=$this->create();$this->login(User::factory()->create());
|
||||
$this->postJson('/minhas-oportunidades/drafts',F::input())->assertForbidden();
|
||||
$this->get('/minhas-oportunidades/'.$o->id.'/edit')->assertForbidden();
|
||||
$this->login(F::operator());$this->get('/minhas-oportunidades/'.$o->id.'/edit')->assertForbidden();
|
||||
$this->login($this->actor);$input=F::input();unset($input['proactive']);$this->postJson('/minhas-oportunidades/drafts',$input)->assertForbidden();
|
||||
$this->assertNull($o->organization_id);
|
||||
}
|
||||
public function test_internal_attached_document_cannot_be_changed_to_public_through_analysis(): void
|
||||
{
|
||||
$o=$this->create();$doc=(string)Str::uuid();$hash=hash('sha256','SYNTHETIC QA private source');
|
||||
DB::table('documents')->insert(['id'=>$doc,'file_name'=>'SYNTHETIC-QA-INTERNAL-LIST.txt','storage_key'=>'synthetic-qa/'.$doc,'media_type'=>'text/plain','sha256'=>$hash,'size_bytes'=>strlen('SYNTHETIC QA private source'),'uploaded_by'=>$this->actor->id,'status'=>'active','data_classification'=>'internal','malware_scan_status'=>'clean','malware_scanned_sha256'=>$hash]);
|
||||
DB::table('opportunity_documents')->insert(['id'=>(string)Str::uuid(),'opportunity_id'=>$o->id,'document_id'=>$doc,'version'=>1,'created_by'=>$this->actor->id,'payload'=>json_encode(['title'=>'SYNTHETIC QA internal list','visibility'=>'internal'])]);
|
||||
$a=app(OpportunityManagement::class)->values($o)['proactive'];$a['evidence'][0]['document_id']=$doc;$a['evidence'][0]['access']='public';
|
||||
$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>app(OpportunityManagement::class)->etag($o),'proactive'=>$a,'reason'=>'SYNTHETIC QA original document restrictions cannot be overridden here'])->assertUnprocessable();
|
||||
$this->assertSame('internal',DB::table('documents')->where('id',$doc)->value('data_classification'));
|
||||
}
|
||||
public function test_selected_public_relationship_and_assumptions_travel_without_private_reference_or_duplicate(): void
|
||||
{
|
||||
$o=$this->create();$a=app(OpportunityManagement::class)->values($o)['proactive'];$target=app(\App\Services\OpportunityClassification::class)->targets('project')->first(['id','name']);$this->assertNotNull($target);
|
||||
$r=['id'=>(string)Str::uuid(),'kind'=>'project','target_id'=>$target->id,'relation'=>'hypothesis','reference'=>'PRIVATE-QA-RELATION-REFERENCE-NOT-FOR-PUBLICATION','evidence_ids'=>[$a['evidence'][0]['id']]];$a['relations']=[$r];
|
||||
$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>app(OpportunityManagement::class)->etag($o),'proactive'=>$a,'reason'=>'SYNTHETIC QA reference is a hypothesis, not access or contract'])->assertOk();$o->refresh();
|
||||
$bad=$a;$bad['relations'][]=[...$r,'id'=>(string)Str::uuid()];$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>app(OpportunityManagement::class)->etag($o),'proactive'=>$bad,'reason'=>'SYNTHETIC QA same reference cannot appear twice in the same analysis'])->assertUnprocessable();
|
||||
$d=$this->publication($o);$d['proactive_public']=[...$d['proactive_public'],'relation_ids'=>[$r['id']],'resources'=>'SYNTHETIC QA public resource, no guaranteed capacity.','assumptions'=>'No contract, land or power guaranteed.','conditions'=>'Confirm actual local evidence.'];
|
||||
$p=$this->postJson('/minhas-oportunidades/'.$o->id.'/divulgacao/previa',$d)->assertOk()->json();$this->assertSame($target->name,$p['projection']['proactive']['relations'][0]['label']);$this->assertStringNotContainsString('PRIVATE-QA-RELATION',json_encode($p['projection']));
|
||||
$this->postJson('/minhas-oportunidades/'.$o->id.'/divulgacao/confirmar',['token'=>$p['token'],'operation_key'=>(string)Str::uuid(),'confirm'=>true,'reason'=>'SYNTHETIC QA explicitly reviewed public relationship and assumptions'])->assertOk();
|
||||
$ref=app(\App\Services\InvestorContext::class)->reference('opportunity:'.$o->id);$this->assertSame('hypothesis',$ref['analysis']['proactive']['relations'][0]['relationship']);$this->assertSame('No contract, land or power guaranteed.',$ref['analysis']['proactive']['assumptions']);
|
||||
}
|
||||
public function test_publication_needs_explicit_review_and_rejects_internal_source_and_literal_leakage(): void
|
||||
{
|
||||
$o=$this->create();$data=$this->publication($o);unset($data['proactive_reviewed']);$this->postJson('/minhas-oportunidades/'.$o->id.'/divulgacao/previa',$data)->assertUnprocessable();
|
||||
$data=$this->publication($o);$a=app(OpportunityManagement::class)->values($o)['proactive'];$data['proactive_public']['evidence_ids']=[$a['evidence'][1]['id']];$this->postJson('/minhas-oportunidades/'.$o->id.'/divulgacao/previa',$data)->assertUnprocessable();
|
||||
$data=$this->publication($o,['description'=>$a['evidence'][1]['statement']]);$this->postJson('/minhas-oportunidades/'.$o->id.'/divulgacao/previa',$data)->assertUnprocessable();
|
||||
$data=$this->publication($o);$data['proactive_public']['state']='confirmed';$this->postJson('/minhas-oportunidades/'.$o->id.'/divulgacao/previa',$data)->assertUnprocessable();
|
||||
}
|
||||
public function test_public_snapshot_separate_from_private_edits_and_anonymous_access_no_coordinates_required(): void
|
||||
{
|
||||
$o=$this->create();$private=$o->management_draft;$confirm=$this->publish($o);$this->postJson('/minhas-oportunidades/'.$o->id.'/divulgacao/confirmar',$confirm)->assertOk()->assertJsonPath('replayed',true);
|
||||
$o->refresh();$this->assertSame($private,$o->management_draft);$this->assertFalse(app(ProactiveInvestment::class)->publicData($o)['economic_validation']);
|
||||
$a=app(OpportunityManagement::class)->values($o)['proactive'];$a['idea']['solution']='PRIVATE-QA-NEW-UNPUBLISHED-SOLUTION';
|
||||
$this->putJson('/minhas-oportunidades/'.$o->id.'/draft',['etag'=>app(OpportunityManagement::class)->etag($o),'proactive'=>$a,'reason'=>'SYNTHETIC QA private update must not change published projection'])->assertOk();
|
||||
$this->app['auth']->forgetGuards();$this->get('/oportunidades/'.$o->slug)->assertOk()->assertDontSee('PRIVATE-QA-');
|
||||
$this->get('/minhas-oportunidades/'.$o->id.'/edit')->assertRedirect('/login');
|
||||
$this->assertNotNull(app(ProactiveInvestment::class)->publicData($o->fresh()));
|
||||
}
|
||||
public function test_three_synthetic_pilots_reuse_existing_territories_and_catalogue_groups(): void
|
||||
{
|
||||
foreach(['Cahora Bassa','Montepuez','Gurué']as$pilot){$o=$this->create($pilot);$this->publish($o);$this->assertNotNull($o->fresh()->primary_territory_id);$this->assertTrue(app(\App\Services\InvestmentCatalogue::class)->query(['perspective'=>'ideas'])->whereKey($o->id)->exists());$this->assertFalse(app(\App\Services\InvestmentCatalogue::class)->query(['perspective'=>'needs'])->whereKey($o->id)->exists());}
|
||||
$this->get('/oportunidades?perspective=ideas')->assertOk();
|
||||
}
|
||||
public function test_existing_facts_and_needs_do_not_require_irrelevant_idea_fields(): void
|
||||
{
|
||||
foreach(['exists','needs']as$kind){
|
||||
$input=F::input();$input['proactive']['kind']=$kind;$id=$this->postJson('/minhas-oportunidades/drafts',$input)->assertCreated()->json('id');$o=Opportunity::findOrFail($id);
|
||||
$d=$this->publication($o);unset($d['proactive_public']['proposal']);if($kind==='exists')unset($d['proactive_public']['need']);
|
||||
$p=$this->postJson('/minhas-oportunidades/'.$id.'/divulgacao/previa',$d)->assertOk()->json();$this->assertSame($kind,$p['projection']['proactive']['group']);$this->assertSame('',$p['projection']['proactive']['proposal']);
|
||||
$this->postJson('/minhas-oportunidades/'.$id.'/divulgacao/confirmar',['token'=>$p['token'],'operation_key'=>(string)Str::uuid(),'confirm'=>true,'reason'=>'SYNTHETIC QA only applicable questions for this content group'])->assertOk();
|
||||
$this->assertTrue(app(\App\Services\InvestmentCatalogue::class)->query(['perspective'=>$kind])->whereKey($id)->exists());
|
||||
}
|
||||
}
|
||||
public function test_private_analysis_complements_keep_preparation_valid_without_inventing_public_offers(): void
|
||||
{
|
||||
$private=$this->create('Gurué');$public=$this->create();
|
||||
$input=$this->publication($public,['summary'=>'SYNTHETIC QA: silos e armazenagem como componente documentada.']);
|
||||
$plan=$this->postJson('/minhas-oportunidades/'.$public->id.'/divulgacao/previa',$input)->assertOk()->json();
|
||||
$this->postJson('/minhas-oportunidades/'.$public->id.'/divulgacao/confirmar',['token'=>$plan['token'],'operation_key'=>(string)Str::uuid(),'confirm'=>true,'reason'=>'SYNTHETIC QA public component in transaction only'])->assertOk();
|
||||
$result=$this->postJson('/complementos-investimento',['contexts'=>[['origin'=>'opportunity:'.$private->id],['origin'=>'opportunity:'.$public->id]]])->assertOk()->json();
|
||||
$this->assertSame([],$result['issues']);$this->assertNotEmpty($result['items']);
|
||||
foreach($result['items']as$item)$this->assertSame('opportunity:'.$public->id,$item['origin']['key']);
|
||||
$this->assertStringNotContainsString('PRIVATE-QA-',json_encode($result));
|
||||
$this->assertFalse(Opportunity::published()->whereKey($private->id)->exists());
|
||||
$this->assertSame('draft',$private->fresh()->status);
|
||||
}
|
||||
public function test_private_analysis_complements_still_hide_unauthorised_sources(): void
|
||||
{
|
||||
$private=$this->create('Gurué');$this->login(User::factory()->create());
|
||||
$this->postJson('/complementos-investimento',['origin'=>'opportunity:'.$private->id])->assertNotFound();
|
||||
$result=$this->postJson('/complementos-investimento',['contexts'=>[['origin'=>'opportunity:'.$private->id]]])->assertOk()->json();
|
||||
$this->assertSame([],$result['items']);$this->assertCount(1,$result['issues']);
|
||||
$this->assertStringNotContainsString($private->title,json_encode($result));
|
||||
$this->assertStringNotContainsString('PRIVATE-QA-',json_encode($result));
|
||||
}
|
||||
public function test_authenticated_multi_idea_preparation_keeps_each_origin_and_deliberate_edits_in_existing_dossier(): void
|
||||
{
|
||||
$first=$this->create();$second=$this->create('Gurué');$this->publish($first);$this->publish($second);$investor=User::factory()->create();$this->login($investor);
|
||||
$key=(string)Str::uuid();$create=['title'=>'SYNTHETIC QA deliberately chosen project title','client_key'=>$key,'reuse_consent'=>true];
|
||||
$id=$this->postJson('/investimentos',$create)->assertCreated()->json('id');$this->postJson('/investimentos',$create)->assertCreated()->assertJsonPath('id',$id);
|
||||
$before=$this->getJson('/investimentos/'.$id.'/contexto')->assertOk()->json();
|
||||
$input=['version'=>$before['case']['version'],'selection'=>[],'opportunity_choices'=>array_map(fn($o)=>['source'=>'opportunity:'.$o->id,'territory'=>'territory:'.$o->primary_territory_id],[$first,$second])];
|
||||
$preview=$this->postJson('/investimentos/'.$id.'/contexto/previa',$input)->assertOk()->json();
|
||||
$this->assertCount(2,$preview['opportunity_choices']);$this->assertSame('SYNTHETIC QA deliberately chosen project title',$preview['fields']['project_title']);
|
||||
foreach($preview['opportunity_choices']as$c){$this->assertSame('ideas',$c['opportunity']['analysis']['proactive']['group']);$this->assertStringNotContainsString('PRIVATE-QA-',json_encode($c));}
|
||||
$confirm=[...$input,'preview_hash'=>$preview['preview_hash'],'operation_key'=>(string)Str::uuid(),'confirm'=>true];$this->postJson('/investimentos/'.$id.'/contexto/confirmar',$confirm)->assertOk();$this->postJson('/investimentos/'.$id.'/contexto/confirmar',$confirm)->assertOk()->assertJsonPath('replayed',true);
|
||||
$saved=$this->getJson('/investimentos/'.$id.'/contexto')->assertOk()->json();$this->assertCount(2,$saved['context']['opportunity_choices']);
|
||||
$consumers=[];foreach([$first,$second]as$record){$consumer=$this->getJson('/investimentos/'.$id.'/contexto?opportunity=opportunity:'.$record->id)->assertOk()->json();$snapshot=json_decode($consumer['prefill']['simulator']['context_applicability_snapshot'],true);$this->assertCount(1,$snapshot['opportunity_choices']);$this->assertSame('opportunity:'.$record->id,$snapshot['opportunity_choices'][0]['opportunity']['key']);$this->assertSame('ideas',$snapshot['opportunity_choices'][0]['opportunity']['analysis']['proactive']['group']);$this->assertArrayNotHasKey('tax_benefit',$consumer['prefill']['simulator']);$consumers[]=$consumer;}$saved['consumer_contexts']=$consumers;
|
||||
file_put_contents(base_path('outputs/proactive-investment-20261027/recovered-context.json'),json_encode($saved,JSON_UNESCAPED_UNICODE|JSON_THROW_ON_ERROR));
|
||||
$this->get('/investimentos/'.$id)->assertOk();$this->login($this->actor);$this->getJson('/investimentos/'.$id.'/contexto')->assertForbidden();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\Opportunity;
|
||||
use App\Models\Sector;
|
||||
use App\Services\SectorInvestment;
|
||||
use App\Support\IsolatedQaDatabase;
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Tests\TestCase;
|
||||
|
||||
class SectorCatalogueContentTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function createApplication(): Application
|
||||
{
|
||||
$app = parent::createApplication();
|
||||
if (! IsolatedQaDatabase::allowsSchemaChanges()) {
|
||||
throw new \LogicException('Isolated QA required for sector catalogue restoration.');
|
||||
}
|
||||
|
||||
return $app;
|
||||
}
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->withoutVite();
|
||||
config(['portal.legacy_content_enabled' => false, 'portal.legacy_content_qa_enabled' => false,
|
||||
'investor-path.enabled' => true, 'portal.profile_access_enabled' => true]);
|
||||
}
|
||||
|
||||
private function sector(array $attributes = []): Sector
|
||||
{
|
||||
return Sector::create([...['name' => 'Sector sintético QA', 'slug' => 'qa-sector-'.Str::lower(Str::random(12)),
|
||||
'short_description' => 'Exemplo isolado para a reposição.', 'is_active' => true, 'published_at' => now()->subDay()], ...$attributes]);
|
||||
}
|
||||
|
||||
public function test_complete_catalogue_matches_public_sector_pages_including_sectors_without_guides(): void
|
||||
{
|
||||
$withoutGuide = $this->sector();
|
||||
$this->assertArrayNotHasKey($withoutGuide->slug, SectorInvestment::CONTENT);
|
||||
$before = [DB::table('desk_cases')->count(), DB::table('opportunities')->count(), DB::table('portal_resources')->count()];
|
||||
|
||||
$props = $this->get('/sectores')->assertOk()->inertiaProps();
|
||||
$this->assertSame(array_column($props['sectors'], 'id'), array_column(array_column($props['sectorDetails'], 'sector'), 'id'));
|
||||
foreach ($props['sectorDetails'] as $detail) {
|
||||
$single = $this->get('/sectores/'.$detail['sector']['slug'])->assertOk()->inertiaProps();
|
||||
$this->assertSame($single['sector'], $detail['sector']);
|
||||
$this->assertSame($single['sectorEntry'], $detail['sectorEntry']);
|
||||
$this->assertSame($single['opportunities'], $detail['opportunities']);
|
||||
$this->assertIsArray($detail['sectorEntry']['articles']);
|
||||
$this->assertIsArray($detail['sectorEntry']['relations']);
|
||||
$this->assertIsArray($detail['sectorEntry']['locations']);
|
||||
}
|
||||
$entry = collect($props['sectorDetails'])->firstWhere('sector.id', $withoutGuide->id)['sectorEntry'];
|
||||
$this->assertSame([], $entry['articles']);
|
||||
$this->assertSame('/minhas-oportunidades/create?sector_id='.$withoutGuide->id, $entry['register_href']);
|
||||
$this->assertNotNull($entry['start_href']);
|
||||
$this->assertGuest();
|
||||
$this->assertSame($before, [DB::table('desk_cases')->count(), DB::table('opportunities')->count(), DB::table('portal_resources')->count()]);
|
||||
}
|
||||
|
||||
public function test_full_catalogue_preserves_publication_boundaries_and_private_tool_notices(): void
|
||||
{
|
||||
$public = $this->sector();
|
||||
$unpublished = $this->sector(['published_at' => null]);
|
||||
$inactive = $this->sector(['is_active' => false]);
|
||||
$slugs = [];
|
||||
foreach (['published', 'draft', 'future'] as $state) {
|
||||
$slug = 'qa-sector-opportunity-'.Str::lower(Str::random(12));
|
||||
$slugs[$state] = $slug;
|
||||
Opportunity::create(['sector_id' => $public->id, 'reference' => $slug, 'title' => $state,
|
||||
'slug' => $slug, 'summary' => 'Conteúdo sintético de teste.',
|
||||
'status' => $state === 'draft' ? 'draft' : 'published', 'published_at' => $state === 'future' ? now()->addDay() : now()->subDay()]);
|
||||
}
|
||||
config(['investor-path.enabled' => false, 'portal.profile_access_enabled' => false]);
|
||||
$props = $this->get('/sectores')->assertOk()->inertiaProps();
|
||||
$ids = array_column(array_column($props['sectorDetails'], 'sector'), 'id');
|
||||
$this->assertNotContains($unpublished->id, $ids);
|
||||
$this->assertNotContains($inactive->id, $ids);
|
||||
$detail = collect($props['sectorDetails'])->firstWhere('sector.id', $public->id);
|
||||
$this->assertSame([$slugs['published']], array_column($detail['opportunities'], 'slug'));
|
||||
$this->assertNull($detail['sectorEntry']['start_href']);
|
||||
$this->assertNull($detail['sectorEntry']['register_href']);
|
||||
$this->assertNotEmpty($detail['sectorEntry']['start_notice']);
|
||||
$this->assertNotEmpty($detail['sectorEntry']['register_notice']);
|
||||
$this->get('/sectores/'.$unpublished->slug)->assertNotFound();
|
||||
$this->get('/sectores/'.$inactive->slug)->assertNotFound();
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user