Files
Investidor-V2/tools/irpc-pec-obligation-proof.mjs
2026-11-11 10:37:33 +02:00

110 lines
3.8 KiB
JavaScript

import fs from 'node:fs';
import assert from 'node:assert/strict';
import { combinedCase } from '../tests/frontend/helpers/irpc-investment-combination-case.mjs';
import { plan } from '../tests/frontend/helpers/irpc-pec-obligation-case.mjs';
import { calculatePecObligation } from '../resources/js/lib/irpc-pec-obligation.ts';
import {
recordAnnual,
saveAnnualBook,
annualBook,
annualCurrent,
annualHtml,
} from '../resources/js/lib/irpc-annual-settlement.ts';
import { createProjectDossierReport } from '../resources/js/lib/project-dossier-report.ts';
const out = new URL(
'../outputs/irpc-pec-obligation-20261111/',
import.meta.url,
);
fs.mkdirSync(out, { recursive: true });
const scenarios = {
ordinary: {},
minimum: { previousTurnover: '1000000' },
maximum: { previousTurnover: '50000000' },
start: {
activityStartYear: '2026',
activityReference: 'SYNTHETIC effective activity2026',
previousTurnover: '',
previousPpcPaid: '',
turnoverReference: '',
ppcReference: '',
},
zero_turnover: { previousTurnover: '0' },
unknown: { previousTurnover: '' },
};
for (const [name, changes] of Object.entries(scenarios)) {
if (process.argv[2] === 'generate') {
const { d, b } = combinedCase();
const prior = recordAnnual(d, b, '2026-11-11T10:00:00Z');
prior.pecObligation = {
...plan(),
subjectNuit: b.subjectNuit,
year: b.year,
...changes,
};
const next = recordAnnual(d, prior, '2026-11-11T10:01:00Z');
d.modelo_a_snapshot = saveAnnualBook(d, next);
fs.writeFileSync(new URL(name + '.json', out), JSON.stringify(d));
} else {
const d = JSON.parse(
fs.readFileSync(
new URL('recovered-' + name + '.json', out),
'utf8',
),
),
b = annualBook(d),
m = calculatePecObligation(
b.pecObligation,
b.subjectNuit,
b.year,
b.assessment,
);
assert.equal(annualCurrent(d, b), true);
assert.equal(b.history.length, 1);
assert.deepEqual(b.result.model.arithmeticBalance, {
numerator: '138',
denominator: '1',
});
const html = annualHtml(d),
report = createProjectDossierReport(d, {
selectedSections: new Set(['finance']),
generatedAt: '2026-11-11T10:02:00Z',
});
assert.match(html, /PEC — estimativa fiscal/);
assert.match(JSON.stringify(report), /PEC — estimativa fiscal/);
assert.equal(m.paymentExecuted, false);
assert.equal(m.annualDeductionCreated, false);
const expected = {
ordinary: '40000',
minimum: '20000',
maximum: '90000',
start: '0',
zero_turnover: null,
unknown: null,
}[name];
assert.equal(m.total?.numerator ?? null, expected);
fs.writeFileSync(new URL(name + '-report.html', out), html);
fs.writeFileSync(
new URL(name + '-verification.json', out),
JSON.stringify(
{
synthetic: true,
apiRecovered: true,
current: true,
historyPreserved: true,
annualBalanceUnchanged: true,
report: true,
visualReview: false,
model: m,
},
null,
2,
),
);
}
}
console.log(
process.argv[2] === 'generate'
? 'Six synthetic PEC scenarios prepared.'
: 'Six native recovered PEC scenarios recalculated and reported without creating deductions.',
);