import { newPecCorrection } from '../resources/js/lib/irpc-pec-correction.ts'; import { calculatePecPlan, newPecPlan, } from '../resources/js/lib/irpc-pec-plan.ts'; 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-correction-20261111/', import.meta.url, ); fs.mkdirSync(out, { recursive: true }); const allocation = { ...newPecPlan(), mode: 'three', reference: 'SYNTHETIC cash-flow hypothesis for viability', june: '10000', august: '15000', october: '15000', }; const correction = { ...newPecCorrection('10000000', '123456789'), apply: 'yes', revisedTurnover: '50000000', reference: 'SYNTHETIC corrected sales2025 reviewed2026', }; const scenarios = { higher: { correction }, lower: { correction: { ...correction, revisedTurnover: '1000000' } }, retained: { correction: { ...correction, apply: 'no' } }, changed_base: { correction: { ...correction, originalTurnover: '1' } }, zero: { correction: { ...correction, revisedTurnover: '0' } }, }; 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, correction: { ...changes.correction, subjectNuit: b.subjectNuit }, plan: allocation, }; 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 allocationModel = calculatePecPlan( b.pecObligation.plan, m.total, m.notApplicable, b.year, ); const expected = { higher: '90000', lower: '20000', retained: '40000', changed_base: null, zero: null, }[name]; assert.equal(m.total?.numerator ?? null, expected); assert.equal(allocationModel.allocationReconciled, name === 'retained'); assert.equal(allocationModel.annualDeductionCreated, false); assert.match(html, /PEC — rectificação do volume/); assert.match(JSON.stringify(report), /PEC — rectificação do volume/); 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, allocationModel, }, null, 2, ), ); } } console.log( process.argv[2] === 'generate' ? 'Five synthetic PEC correction scenarios prepared.' : 'Five native recovered PEC correction scenarios recalculated and reported without creating deductions.', );