feat: qualify treaty interest under governmental financing agreements
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-11-10 14:18:47 +02:00
parent b10b35f308
commit 7c8d4726e9
10 changed files with 464 additions and 64 deletions
@@ -1,5 +1,16 @@
# Rastreabilidade, utilização e formação
## 10/11/2026 — b10b35f3 instalado; acordo institucional PT–MZ em QA
**Homologação: `b10b35f30830922dae00afde50ac2bdb0e8cef6f`**, promovida às12:15:13UTC e conferida às12:16:31UTC (14:16 locais). Revisão HTTPS e16hashes Git iguais, quatro entradasHTTP200; configuração preservada, zero migrations/importações. Backup/restauro190tabelas com contagens/checksums iguais e369ficheiros/configuração conferidos;60b52fc8 disponível para reversão. Recibos `outputs/government-fraction-delivery-20261110/{backup,restore,files-restore,verification}.json`. Sessão SSH mantida aberta para continuação autenticada, sem credencial em disco. Isenção por devedor público11(3)a e fracções económicas L6 deixam de ser pendências de instalação; as anotações anteriores QA são históricas nesses recortes.
**Delta posterior QA, ainda não instalado:** correspondência11(3)b para instituição/organismo beneficiário corrente que concedeu o financiamento no âmbito de acordo concluído entre os governos PT–MZ. Beneficiário, financiamento ligado aos juros e acordo/cláusula aplicável exigem suporte próprio. País, nome da entidade ou qualificação institucional isolada não activam isenção. Fundamento distinto do devedor público11(3)a; limpar/trocar a escolha invalida a decisão corrente, sem apagar resultado histórico nem reutilizar campos ocultos como nova decisão.
Cálculo → gravação/GET pela API existente no QA55441 com rollback → recuperação → HTML/dossier demonstrados. Exemplo sintético: juros brutos60, imposto pago10 e fracção nacional8, com acordo qualificado → limite convencional0/crédito0/saldo708 MZN; sem reembolso, transporte ou consumo oficial e sem alterar L6. Relatório conserva instituição, financiamento e acordo. Prova `outputs/irpc-pt-mz-agreement-20261110/verification.json`; tipos/lint/Pint/build QA aprovados e provas anteriores reutilizadas.
Pacote `outputs/entrega-cdt-acordo-20261110.zip`, base exactab10b35f3, aplicação/reversão conferidas; entrega seguinte expressamente autorizada durante esta continuação, ainda sem instalação nesta entrada. Restantes beneficiários/regimes11(3)b, EP, relações especiais e demais CDT/benefícios/obrigações conservam correspondência própria; saldo L1–L7/restanteL8/L9–L16 preservado. Conferência visual continua pendente no mesmo registo; portal não integral.
## 10/11/2026 — CDT instalada; isenção governamental e precisão económica em QA
**Homologação: `60b52fc8c7446cbbee904a4411eca8ad284aa7ad`**, promovida às11:49:26UTC e conferida às11:50:11UTC (13:50 locais). Delta13hashes Git e revisão HTTPS iguais; portal/login/up/revision HTTP200, .env preservado, zero migrations/importações. Backup fresco/restauro190tabelas com contagens/checksums iguais e369ficheiros/configuração extraídos/conferidos; ac67f9c1 disponível para reversão. Recibos `outputs/cdt-pt-delivery-20261110/{backup,restore,files-restore,verification}.json`. Sessão SSH encerrada, credencial não guardada. Royalties/dividendos/juros ordinários PT–MZ deste recorte deixam de ser pendência de instalação; não reabrir provas aceites.
@@ -1,3 +1,13 @@
## 10/11/2026 — b10b35f3 instalado; acordo institucional PT–MZ em QA
**Homologação: `b10b35f30830922dae00afde50ac2bdb0e8cef6f`**, promovida às12:15:13UTC e conferida às12:16:31UTC (14:16 locais). Revisão HTTPS e16hashes Git iguais, quatro entradasHTTP200; configuração preservada, zero migrations/importações. Backup/restauro190tabelas com contagens/checksums iguais e369ficheiros/configuração conferidos;60b52fc8 disponível para reversão. Recibos `outputs/government-fraction-delivery-20261110/{backup,restore,files-restore,verification}.json`. Sessão SSH mantida aberta para continuação autenticada, sem credencial em disco. Isenção por devedor público11(3)a e fracções económicas L6 deixam de ser pendências de instalação; as anotações anteriores QA são históricas nesses recortes.
**Delta posterior QA, ainda não instalado:** correspondência11(3)b para instituição/organismo beneficiário corrente que concedeu o financiamento no âmbito de acordo concluído entre os governos PT–MZ. Beneficiário, financiamento ligado aos juros e acordo/cláusula aplicável exigem suporte próprio. País, nome da entidade ou qualificação institucional isolada não activam isenção. Fundamento distinto do devedor público11(3)a; limpar/trocar a escolha invalida a decisão corrente, sem apagar resultado histórico nem reutilizar campos ocultos como nova decisão.
Cálculo → gravação/GET pela API existente no QA55441 com rollback → recuperação → HTML/dossier demonstrados. Exemplo sintético: juros brutos60, imposto pago10 e fracção nacional8, com acordo qualificado → limite convencional0/crédito0/saldo708 MZN; sem reembolso, transporte ou consumo oficial e sem alterar L6. Relatório conserva instituição, financiamento e acordo. Prova `outputs/irpc-pt-mz-agreement-20261110/verification.json`; tipos/lint/Pint/build QA aprovados e provas anteriores reutilizadas.
Pacote `outputs/entrega-cdt-acordo-20261110.zip`, base exactab10b35f3, aplicação/reversão conferidas; entrega seguinte expressamente autorizada durante esta continuação, ainda sem instalação nesta entrada. Restantes beneficiários/regimes11(3)b, EP, relações especiais e demais CDT/benefícios/obrigações conservam correspondência própria; saldo L1–L7/restanteL8/L9–L16 preservado. Conferência visual continua pendente no mesmo registo; portal não integral.
## 10/11/2026 — CDT instalada; isenção governamental e precisão económica em QA
**Homologação: `60b52fc8c7446cbbee904a4411eca8ad284aa7ad`**, promovida às11:49:26UTC e conferida às11:50:11UTC (13:50 locais). Delta13hashes Git e revisão HTTPS iguais; portal/login/up/revision HTTP200, .env preservado, zero migrations/importações. Backup fresco/restauro190tabelas com contagens/checksums iguais e369ficheiros/configuração extraídos/conferidos; ac67f9c1 disponível para reversão. Recibos `outputs/cdt-pt-delivery-20261110/{backup,restore,files-restore,verification}.json`. Sessão SSH encerrada, credencial não guardada. Royalties/dividendos/juros ordinários PT–MZ deste recorte deixam de ser pendência de instalação; não reabrir provas aceites.
File diff suppressed because one or more lines are too long
@@ -1,3 +1,13 @@
## 10/11/2026 — b10b35f3 instalado; acordo institucional PT–MZ em QA
**Homologação: `b10b35f30830922dae00afde50ac2bdb0e8cef6f`**, promovida às12:15:13UTC e conferida às12:16:31UTC (14:16 locais). Revisão HTTPS e16hashes Git iguais, quatro entradasHTTP200; configuração preservada, zero migrations/importações. Backup/restauro190tabelas com contagens/checksums iguais e369ficheiros/configuração conferidos;60b52fc8 disponível para reversão. Recibos `outputs/government-fraction-delivery-20261110/{backup,restore,files-restore,verification}.json`. Sessão SSH mantida aberta para continuação autenticada, sem credencial em disco. Isenção por devedor público11(3)a e fracções económicas L6 deixam de ser pendências de instalação; as anotações anteriores QA são históricas nesses recortes.
**Delta posterior QA, ainda não instalado:** correspondência11(3)b para instituição/organismo beneficiário corrente que concedeu o financiamento no âmbito de acordo concluído entre os governos PT–MZ. Beneficiário, financiamento ligado aos juros e acordo/cláusula aplicável exigem suporte próprio. País, nome da entidade ou qualificação institucional isolada não activam isenção. Fundamento distinto do devedor público11(3)a; limpar/trocar a escolha invalida a decisão corrente, sem apagar resultado histórico nem reutilizar campos ocultos como nova decisão.
Cálculo → gravação/GET pela API existente no QA55441 com rollback → recuperação → HTML/dossier demonstrados. Exemplo sintético: juros brutos60, imposto pago10 e fracção nacional8, com acordo qualificado → limite convencional0/crédito0/saldo708 MZN; sem reembolso, transporte ou consumo oficial e sem alterar L6. Relatório conserva instituição, financiamento e acordo. Prova `outputs/irpc-pt-mz-agreement-20261110/verification.json`; tipos/lint/Pint/build QA aprovados e provas anteriores reutilizadas.
Pacote `outputs/entrega-cdt-acordo-20261110.zip`, base exactab10b35f3, aplicação/reversão conferidas; entrega seguinte expressamente autorizada durante esta continuação, ainda sem instalação nesta entrada. Restantes beneficiários/regimes11(3)b, EP, relações especiais e demais CDT/benefícios/obrigações conservam correspondência própria; saldo L1–L7/restanteL8/L9–L16 preservado. Conferência visual continua pendente no mesmo registo; portal não integral.
## 10/11/2026 — CDT instalada; isenção governamental e precisão económica em QA
**Homologação: `60b52fc8c7446cbbee904a4411eca8ad284aa7ad`**, promovida às11:49:26UTC e conferida às11:50:11UTC (13:50 locais). Delta13hashes Git e revisão HTTPS iguais; portal/login/up/revision HTTP200, .env preservado, zero migrations/importações. Backup fresco/restauro190tabelas com contagens/checksums iguais e369ficheiros/configuração extraídos/conferidos; ac67f9c1 disponível para reversão. Recibos `outputs/cdt-pt-delivery-20261110/{backup,restore,files-restore,verification}.json`. Sessão SSH encerrada, credencial não guardada. Royalties/dividendos/juros ordinários PT–MZ deste recorte deixam de ser pendência de instalação; não reabrir provas aceites.
@@ -86,59 +86,176 @@ export function SimulationIrpcPtCdt({
))}
{p.treatyMethod === 'ptMzInterest' &&
p.treatyPreparation?.governmentInterestExemption === 'yes' && (
<fieldset className="rounded border p-3">
<fieldset className="space-y-2 rounded border p-3">
<legend>
Isenção por devedor público português — art.11(3)a
Fundamento da isenção dos juros — art.11(3)
</legend>
<p>
Escolha a qualificação documentada do devedor.
Beneficiários públicos e acordos entre governos do
art.11(3)b exigem correspondência própria. A isenção
na fonte não gera reembolso de imposto pago pelo
portal.
</p>
<label className="block">
Devedor dos juros
Fundamento
<select
aria-label={
prefix + 'Devedor público português'
prefix +
'Fundamento da isenção governamental'
}
value={
p.treatyPreparation.governmentPayer ?? ''
p.treatyPreparation.governmentBasis ??
(p.treatyPreparation.governmentPayer
? 'payer'
: '')
}
onChange={(e) =>
change('governmentPayer', e.target.value)
change('governmentBasis', e.target.value)
}
>
<option value="">Por documentar</option>
<option value="state">Estado português</option>
<option value="subdivision">
Subdivisão política ou administrativa
portuguesa
<option value="">Escolha o fundamento</option>
<option value="payer">
Devedor público português —11(3)a
</option>
<option value="local">
Autarquia portuguesa
<option value="agreement">
Instituição/organismo e financiamento sob
acordo PT–MZ —11(3)b
</option>
</select>
</label>
<label className="block">
Suporte da qualificação do devedor
<input
aria-label={
prefix + 'Suporte do devedor público'
}
value={
p.treatyPreparation
.governmentPayerReference ?? ''
}
onChange={(e) =>
change(
'governmentPayerReference',
e.target.value,
)
}
/>
</label>
{p.treatyPreparation.governmentBasis === 'agreement' ? (
<>
<p>
O beneficiário é o sujeito corrente:{' '}
{p.subjectNuit}. Confirme a
instituição/organismo, o financiamento por
ela concedido e o acordo entre os governos
de Portugal e Moçambique. A isenção não é
inferida pelo nome; outros
beneficiários/regimes conservam
correspondência própria.
</p>
{(
[
[
'institutionRecipient',
'Beneficiário corrente qualificado como instituição/organismo11(3)b',
],
[
'financingGranted',
'Juros resultam de financiamento concedido por esse beneficiário',
],
[
'bilateralAgreement',
'Financiamento no âmbito de acordo concluído entre os governos PT–MZ',
],
] as const
).map(([key, label]) => (
<label key={key} className="block">
{label}
<select
aria-label={prefix + label}
value={
p.treatyPreparation?.[key] ?? ''
}
onChange={(e) =>
change(key, 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>
))}
{(
[
[
'institutionReference',
'Suporte da qualificação do beneficiário corrente',
],
[
'financingReference',
'Suporte do financiamento e ligação aos juros',
],
[
'agreementReference',
'Acordo PT–MZ e cláusula aplicável a este financiamento',
],
] as const
).map(([key, label]) => (
<label key={key} className="block">
{label}
<input
aria-label={prefix + label}
value={
p.treatyPreparation?.[key] ?? ''
}
onChange={(e) =>
change(key, e.target.value)
}
/>
</label>
))}
</>
) : (
<>
<p>
Qualifique o devedor público português com
suporte próprio. A isenção na fonte não
gera, no portal, reembolso do imposto pago.
</p>
<label className="block">
Devedor dos juros
<select
aria-label={
prefix + 'Devedor público português'
}
value={
p.treatyPreparation
.governmentPayer ?? ''
}
onChange={(e) =>
change(
'governmentPayer',
e.target.value,
)
}
>
<option value="">Por documentar</option>
<option value="state">
Estado português
</option>
<option value="subdivision">
Subdivisão política/administrativa
portuguesa
</option>
<option value="local">
Autarquia portuguesa
</option>
</select>
</label>
<label className="block">
Suporte da qualificação do devedor
<input
aria-label={
prefix +
'Suporte do devedor público'
}
value={
p.treatyPreparation
.governmentPayerReference ?? ''
}
onChange={(e) =>
change(
'governmentPayerReference',
e.target.value,
)
}
/>
</label>
</>
)}
</fieldset>
)}
{facts.map(([key, label]) => (
+103 -16
View File
@@ -27,6 +27,14 @@ export type InternationalTaxProof = AnnualPpc & {
exerciseReference: string;
};
export type PtMzRoyaltyPreparation = {
governmentBasis?: '' | 'payer' | 'agreement';
institutionRecipient?: '' | 'yes' | 'no';
financingGranted?: '' | 'yes' | 'no';
bilateralAgreement?: '' | 'yes' | 'no';
institutionReference?: string;
financingReference?: string;
agreementReference?: string;
governmentPayer?: '' | 'state' | 'subdivision' | 'local';
governmentPayerReference?: string;
capitalDefinition?: '' | 'yes' | 'no';
@@ -253,6 +261,41 @@ export function validateInternational(c: InternationalCredits) {
(p.treatyPreparation?.governmentPayerReference !== undefined &&
typeof p.treatyPreparation.governmentPayerReference !==
'string') ||
(p.treatyPreparation?.governmentBasis !== undefined &&
!['', 'payer', 'agreement'].includes(
p.treatyPreparation.governmentBasis,
)) ||
(p.treatyPreparation &&
[
'institutionRecipient',
'financingGranted',
'bilateralAgreement',
].some((k) => {
const v = (
p.treatyPreparation as unknown as Record<
string,
unknown
>
)[k];
return (
v !== undefined &&
(typeof v !== 'string' || !yesNo.includes(v))
);
})) ||
(p.treatyPreparation &&
[
'institutionReference',
'financingReference',
'agreementReference',
].some((k) => {
const v = (
p.treatyPreparation as unknown as Record<
string,
unknown
>
)[k];
return v !== undefined && typeof v !== 'string';
})) ||
!evidenceValid(p.previousUse) ||
!Array.isArray(p.payments)
)
@@ -417,20 +460,53 @@ export function ptMzTreatyLimit(p: InternationalPosition) {
throw Error(
'Definição convencional de dividendos/juros por documentar.',
);
let governmentExemption: {
payer: 'state' | 'subdivision' | 'local';
reference: string;
} | null = null;
let governmentExemption:
| { payer: 'state' | 'subdivision' | 'local'; reference: string }
| {
basis: 'agreement';
recipient: 'institution';
reference: string;
financingReference: string;
agreementReference: string;
}
| null = null;
if (p.treatyMethod === 'ptMzInterest') {
if (q.governmentInterestExemption === 'yes') {
if (!q.governmentPayer || !q.governmentPayerReference?.trim())
if (q.governmentBasis === 'agreement') {
if (
q.institutionRecipient !== 'yes' ||
q.financingGranted !== 'yes' ||
q.bilateralAgreement !== 'yes' ||
!q.institutionReference?.trim() ||
!q.financingReference?.trim() ||
!q.agreementReference?.trim()
)
throw Error(
'Art11(3)b: instituição/organismo beneficiário corrente, financiamento por ele concedido e acordo entre os governos PT–MZ exigem correspondência documental própria.',
);
governmentExemption = {
basis: 'agreement',
recipient: 'institution',
reference: q.institutionReference,
financingReference: q.financingReference,
agreementReference: q.agreementReference,
};
} else if (
q.governmentBasis === undefined ||
q.governmentBasis === 'payer'
) {
if (!q.governmentPayer || !q.governmentPayerReference?.trim())
throw Error(
'Isenção11(3)a exige devedor Estado português/subdivisão/autarquia documentado; para11(3)b escolha e documente o fundamento próprio.',
);
governmentExemption = {
payer: q.governmentPayer,
reference: q.governmentPayerReference,
};
} else
throw Error(
'Isenção11(3)a exige devedor documentado: Estado português, subdivisão política/administrativa ou autarquia; beneficiários/acordos11(3)b permanecem separados.',
'Escolha o fundamento da isenção; uma selecção limpa não reutiliza a decisão anterior.',
);
governmentExemption = {
payer: q.governmentPayer,
reference: q.governmentPayerReference,
};
} else if (q.governmentInterestExemption !== 'no')
throw Error(
'Corresponda a aplicação ou não aplicação da isenção11(3); desconhecido não significa limite ordinário10%.',
@@ -455,7 +531,9 @@ export function ptMzTreatyLimit(p: InternationalPosition) {
);
return {
version: governmentExemption
? 'IRPC-PT-MZ-government-interest/1'
? 'basis' in governmentExemption
? 'IRPC-PT-MZ-agreement-interest/1'
: 'IRPC-PT-MZ-government-interest/1'
: p.treatyMethod === 'ptMzRoyalty'
? 'IRPC-PT-MZ-royalty-credit/1'
: 'IRPC-PT-MZ-capital-credit/1',
@@ -473,13 +551,22 @@ export function ptMzTreatyLimit(p: InternationalPosition) {
to: q.to,
reference: governmentExemption
? q.reference +
'; devedor ' +
governmentExemption.payer +
'; ' +
governmentExemption.reference
('payer' in governmentExemption
? '; devedor ' +
governmentExemption.payer +
'; ' +
governmentExemption.reference
: '; instituição ' +
governmentExemption.reference +
'; financiamento ' +
governmentExemption.financingReference +
'; acordo PT–MZ ' +
governmentExemption.agreementReference)
: q.reference,
source: governmentExemption
? 'CDT PT–MZ, RAR36/1992 art11(3)a,PDF11, e23(3)a,PDF21; CIRPC65(2). Devedor Estado português/subdivisão/autarquia documentado. Juros isentos no Estado da fonte; limite convencional zero, sem crédito ou reembolso do imposto indevidamente pago pelo portal. Art11(3)b e demais situações permanecem separados.'
? 'basis' in governmentExemption
? 'CDT PT–MZ, RAR36/1992 art11(3)b,PDF11, e23(3)a,PDF21; CIRPC65(2). Instituição/organismo beneficiário corrente, financiamento por ele concedido no âmbito de acordo entre governos PT–MZ documentados. Juros isentos na fonte, limite0; não gera crédito ou reembolso no portal de imposto pago em desconformidade. Outros beneficiários/regimes mantêm correspondência própria.'
: 'CDT PT–MZ, RAR36/1992 art11(3)a,PDF11, e23(3)a,PDF21; CIRPC65(2). Devedor Estado português/subdivisão/autarquia documentado. Juros isentos no Estado da fonte; limite convencional zero, sem crédito ou reembolso do imposto indevidamente pago pelo portal. Art11(3)b e demais situações permanecem separados.'
: p.treatyMethod === 'ptMzRoyalty'
? 'CDT PT–MZ, RAR36/1992 art12(2/4–6),PDF13–14 e23(3)a,PDF21; Protocolo RAR36/2009 arts1/7,PDF1–2; CIRPC65(2). Royalties ordinárias não digitais, sem EP/instalação fixa ligada nem excesso por relações especiais. Não confundir com retenção L5 paga por devedor moçambicano; sem isenção ou tax sparing presumidos.'
: 'CDT PT–MZ, RAR36/1992 art23(3)a,PDF21; CIRPC65(2). ' +
@@ -0,0 +1,36 @@
<?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 IrpcPtMzAgreementDraftTest extends TestCase
{
use DatabaseTransactions;
public function test_agreement_pt_mz_credit_uses_the_existing_private_draft_writer(): void
{
$target = DB::selectOne('select current_database() as name,inet_server_port() as port');
$this->assertSame('proactive_investment_20261027_test', $target->name);
$this->assertSame(55441, (int) $target->port);
config(['investor-path.enabled' => true, 'suitecrm.enabled' => false]);
$this->actingAs(User::findOrFail(1021));
$d = json_decode(file_get_contents(base_path('outputs/irpc-pt-mz-agreement-20261110/fixture.json')), true, flags: JSON_THROW_ON_ERROR);
$personal = ['person_type' => $d['person_type']];
unset($d['person_type']);
$id = $this->postJson('/api/v1/simulation-drafts', ['personal_snapshot' => $personal, 'economic_snapshot' => $d], ['Idempotency-Key' => (string) Str::uuid()])->assertCreated()->json('data.id');
$back = $this->getJson('/api/v1/simulation-drafts/'.$id)->assertOk()->json('data.economic_snapshot');
$this->assertSame($d['modelo_a_snapshot'], $back['modelo_a_snapshot']);
$this->assertSame($d['business_plan_snapshot'], $back['business_plan_snapshot']);
$b = json_decode($back['modelo_a_snapshot'], true, flags: JSON_THROW_ON_ERROR)['irpcAnnual'][$d['context_opportunity']];
$this->assertSame('ptMzInterest', $b['internationalCredits']['positions'][0]['treatyMethod']);
$this->assertSame(['numerator' => '0', 'denominator' => '1'], $b['result']['model']['internationalCredit']['positions'][0]['treatyLimit']);
$this->assertSame(['numerator' => '708', 'denominator' => '1'], $b['result']['model']['arithmeticBalance']);
$this->assertSame('agreement', $b['result']['model']['internationalCredit']['positions'][0]['treatyDerivation']['governmentExemption']['basis']);
file_put_contents(base_path('outputs/irpc-pt-mz-agreement-20261110/recovered.json'), json_encode($back, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE));
}
}
@@ -0,0 +1,127 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { internationalCase } from './helpers/irpc-international-case.mjs';
import { newPtMzRoyaltyPreparation } from '../../resources/js/lib/irpc-international-credit.ts';
import {
calculateAnnual,
recordAnnual,
saveAnnualBook,
annualBook,
annualCurrent,
annualHtml,
} from '../../resources/js/lib/irpc-annual-settlement.ts';
import { createProjectDossierReport } from '../../resources/js/lib/project-dossier-report.ts';
function agreementCase() {
const c = internationalCase();
Object.assign(c.b.internationalCredits.positions[0], {
country: 'PT',
qualificationCountry: 'PT',
incomeAmount: '40',
treaty: 'yes',
treatyMethod: 'ptMzInterest',
treatyReference: 'SYNTHETIC QA explicit PT-MZ11(3)b/23(3)a scope',
treatyPreparation: {
...newPtMzRoyaltyPreparation(),
gross: '60',
from: '2026-01-01',
to: '2026-12-31',
reference: 'SYNTHETIC residence and interest contract conditions',
residentMz: 'yes',
beneficialOwner: 'yes',
sourcePortugal: 'yes',
payerResidentPt: 'yes',
noLinkedEstablishment: 'yes',
armLength: 'yes',
capitalDefinition: 'yes',
governmentInterestExemption: 'yes',
governmentBasis: 'agreement',
institutionRecipient: 'yes',
financingGranted: 'yes',
bilateralAgreement: 'yes',
institutionReference:
'SYNTHETIC current subject123456789 is qualifying institution',
financingReference:
'SYNTHETIC financing granted by this institution and linked to interest',
agreementReference:
'SYNTHETIC PT-MZ intergovernmental agreement and applicable financing clause',
},
});
return c;
}
void test('qualified institution financing under a PT-MZ governmental agreement gives zero source tax cap without altering L6', () => {
const c = agreementCase(),
before = c.d.modelo_a_snapshot,
m = calculateAnnual(c.d, c.b),
p = m.internationalCredit.positions[0];
assert.deepEqual(m.pending, []);
assert.deepEqual(p.treatyLimit, { numerator: '0', denominator: '1' });
assert.equal(p.treatyDerivation.governmentExemption.basis, 'agreement');
assert.deepEqual(p.aboveLimit, { numerator: '10', denominator: '1' });
assert.deepEqual(m.arithmeticBalance, {
numerator: '708',
denominator: '1',
});
assert.equal(m.internationalCredit.officialBalancesConsumed, false);
assert.equal(c.d.modelo_a_snapshot, before);
});
void test('institution identity alone does not prove a qualifying financing or governmental agreement', () => {
for (const patch of [
{ institutionRecipient: '' },
{ financingGranted: '' },
{ bilateralAgreement: 'no' },
{ institutionReference: '' },
{ financingReference: '' },
{ agreementReference: '' },
{ governmentBasis: '' },
]) {
const c = agreementCase();
Object.assign(
c.b.internationalCredits.positions[0].treatyPreparation,
patch,
);
assert.equal(calculateAnnual(c.d, c.b).arithmeticBalance, null);
}
});
void test('changing or clearing the basis preserves the old result but cannot reuse the former exemption', () => {
const c = agreementCase(),
book = recordAnnual(c.d, c.b, '2026-11-10T18:20:00+02:00'),
old = structuredClone(book.result);
Object.assign(book.internationalCredits.positions[0].treatyPreparation, {
governmentBasis: '',
governmentPayer: 'state',
governmentPayerReference:
'SYNTHETIC previous public-payer classification',
});
assert.equal(annualCurrent(c.d, book), false);
assert.equal(calculateAnnual(c.d, book).arithmeticBalance, null);
assert.deepEqual(book.result, old);
});
void test('agreement qualification and both documentary links survive recovery and reach both report consumers', () => {
const c = agreementCase(),
book = recordAnnual(c.d, c.b, '2026-11-10T18:20:00+02:00'),
d = JSON.parse(
JSON.stringify({
...c.d,
modelo_a_snapshot: saveAnnualBook(c.d, book),
}),
),
back = annualBook(d);
assert.equal(annualCurrent(d, back), true);
assert.deepEqual(
calculateAnnual(d, back).internationalCredit,
back.result.model.internationalCredit,
);
const html = annualHtml(d);
assert.match(html, /IRPC-PT-MZ-agreement-interest\/1/);
assert.match(html, /SYNTHETIC financing granted/);
assert.match(html, /SYNTHETIC PT-MZ intergovernmental agreement/);
assert.match(
JSON.stringify(
createProjectDossierReport(d, {
selectedSections: new Set(['finance']),
generatedAt: '2026-11-10T18:20:00+02:00',
}),
),
/IRPC-PT-MZ-agreement-interest\/1/,
);
});
+1 -1
View File
@@ -18,7 +18,7 @@ $identity = $pdo->query('select current_database() as name,inet_server_port() as
if ($identity['name'] !== 'proactive_investment_20261027_test' || (int) $identity['port'] !== 55441) {
throw new RuntimeException('Isolated QA identity required.');
}
$case = ['quota' => 'IrpcEconomicQuotaDraftTest', 'inclusion' => 'IrpcEconomicInclusionDraftTest', 'liquidation' => 'IrpcEconomicLiquidationDraftTest', 'association' => 'IrpcEconomicAssociationDraftTest', 'special-inclusion' => 'IrpcEconomicSpecialInclusionDraftTest', 'pt-royalty' => 'IrpcPtMzCreditDraftTest', 'pt-capital' => 'IrpcPtMzCapitalDraftTest', 'pt-government' => 'IrpcPtMzGovernmentDraftTest', 'economic-fraction' => 'IrpcEconomicFractionDraftTest'][$argv[2] ?? ''] ?? throw new RuntimeException('Choose an explicit supported QA case.');
$case = ['quota' => 'IrpcEconomicQuotaDraftTest', 'inclusion' => 'IrpcEconomicInclusionDraftTest', 'liquidation' => 'IrpcEconomicLiquidationDraftTest', 'association' => 'IrpcEconomicAssociationDraftTest', 'special-inclusion' => 'IrpcEconomicSpecialInclusionDraftTest', 'pt-royalty' => 'IrpcPtMzCreditDraftTest', 'pt-capital' => 'IrpcPtMzCapitalDraftTest', 'pt-government' => 'IrpcPtMzGovernmentDraftTest', 'economic-fraction' => 'IrpcEconomicFractionDraftTest', 'pt-agreement' => 'IrpcPtMzAgreementDraftTest'][$argv[2] ?? ''] ?? throw new RuntimeException('Choose an explicit supported QA case.');
$argv = ['phpunit', '-c', 'phpunit.investmoz.xml', '--do-not-cache-result', 'tests/Feature/'.$case.'.php'];
$argc = count($argv);
$_SERVER['argv'] = $argv;
+6 -4
View File
@@ -3,17 +3,18 @@ import fs from 'node:fs';
import { internationalCase } from '../tests/frontend/helpers/irpc-international-case.mjs';
import { recordAnnual, saveAnnualBook, annualBook, calculateAnnual, annualHtml } from '../resources/js/lib/irpc-annual-settlement.ts';
import assert from 'node:assert/strict';
const government = process.argv.includes('government');
const agreement = process.argv.includes('agreement');
const government = agreement || process.argv.includes('government');
const capital = government ? 'interest' : ['dividend','interest'].find(k=>process.argv.includes(k));
const out = new URL(government ? '../outputs/irpc-pt-mz-government-20261110/' : capital ? '../outputs/irpc-pt-mz-'+capital+'-20261110/' : '../outputs/irpc-pt-mz-credit-20261110/', import.meta.url);
const out = new URL(agreement ? '../outputs/irpc-pt-mz-agreement-20261110/' : government ? '../outputs/irpc-pt-mz-government-20261110/' : capital ? '../outputs/irpc-pt-mz-'+capital+'-20261110/' : '../outputs/irpc-pt-mz-credit-20261110/', import.meta.url);
fs.mkdirSync(out, { recursive: true });
if (process.argv[2] === 'recovered') {
const d = JSON.parse(fs.readFileSync(new URL('recovered.json', out), 'utf8'));
const b = annualBook(d), m = b.result.model;
assert.deepEqual(calculateAnnual(d, b).internationalCredit, m.internationalCredit);
const html = annualHtml(d);assert.match(html, /IRPC-PT-MZ-(royalty-credit|capital-credit|government-interest)\/1/);
const html = annualHtml(d);assert.match(html, /IRPC-PT-MZ-(royalty-credit|capital-credit|government-interest|agreement-interest)\/1/);
const report=createProjectDossierReport(d,{selectedSections:new Set(['finance']),generatedAt:'2026-11-10T17:10:00+02:00'});
assert.match(JSON.stringify(report),/IRPC-PT-MZ-(royalty-credit|capital-credit|government-interest)\/1/);
assert.match(JSON.stringify(report),/IRPC-PT-MZ-(royalty-credit|capital-credit|government-interest|agreement-interest)\/1/);
fs.writeFileSync(new URL('report.html', out), html);
fs.writeFileSync(new URL('verification.json', out), JSON.stringify({ synthetic: true, apiRecovered: true, dossierReport: true, currentRecalculation: true, html: true, quota: m.internationalCredit.positions[0].treatyLimit, balance: m.arithmeticBalance, activeChanged: false }, null, 2));
} else {
@@ -21,6 +22,7 @@ if (process.argv[2] === 'recovered') {
Object.assign(c.b.internationalCredits.positions[0],{country:'PT',qualificationCountry:'PT',incomeAmount:'40',treaty:'yes',treatyMethod:'ptMzRoyalty',treatyReference:'SYNTHETIC QA qualified PT-MZ12/23(3)a ordinary royalties',treatyPreparation:{gross:'60',from:'2026-01-01',to:'2026-12-31',reference:'SYNTHETIC QA residence certificate and royalty agreement covering conditions',residentMz:'yes',beneficialOwner:'yes',sourcePortugal:'yes',payerResidentPt:'yes',noLinkedEstablishment:'yes',armLength:'yes',royaltyDefinition:'yes',nonDigital:'yes'}});
if(capital) {const p=c.b.internationalCredits.positions[0];p.treatyMethod=capital==='dividend'?'ptMzDividend':'ptMzInterest';p.treatyReference='SYNTHETIC QA explicit PT-MZ article'+(capital==='dividend'?'10 updated2009':'11 ordinary non-governmental')+'/23(3)a qualification';p.treatyPreparation.reference='SYNTHETIC QA residence certificate and '+capital+' contract, source and conditions documented';Object.assign(p.treatyPreparation,{capitalDefinition:'yes',governmentInterestExemption:'no'});}
if(government){const p=c.b.internationalCredits.positions[0];p.treatyReference='SYNTHETIC QA PT-MZ11(3)a and23(3)a';Object.assign(p.treatyPreparation,{governmentInterestExemption:'yes',governmentPayer:'state',governmentPayerReference:'SYNTHETIC Portuguese state is actual payer of documented interest'});}
if(agreement){const p=c.b.internationalCredits.positions[0];p.treatyReference='SYNTHETIC QA explicit PT-MZ11(3)b/23(3)a';Object.assign(p.treatyPreparation,{governmentBasis:'agreement',governmentPayer:'',governmentPayerReference:'',institutionRecipient:'yes',financingGranted:'yes',bilateralAgreement:'yes',institutionReference:'SYNTHETIC current subject123456789 qualifying institution',financingReference:'SYNTHETIC financing granted by this institution, linked to interest',agreementReference:'SYNTHETIC PT-MZ governmental agreement and financing clause'});}
const b = recordAnnual(c.d, c.b, '2026-11-10T14:00:00+02:00');
fs.writeFileSync(new URL('fixture.json', out), JSON.stringify({ ...c.d, modelo_a_snapshot: saveAnnualBook(c.d, b) }));
}