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.', );