import test from 'node:test'; import assert from 'node:assert/strict'; import { calculatePpcObligation, validatePpcObligation, } from '../../resources/js/lib/irpc-ppc-obligation.ts'; import { combinedCase } from './helpers/irpc-investment-combination-case.mjs'; import { calculateAnnual, recordAnnual, annualCurrent, saveAnnualBook, annualBook, annualHtml, } from '../../resources/js/lib/irpc-annual-settlement.ts'; import { plan } from './helpers/irpc-ppc-obligation-case.mjs'; const f = (n) => ({ numerator: String(n), denominator: '1' }); const calculate = (p) => calculatePpcObligation(p, '123456789', '2026', 'normal'); test('PPC applies80% then three equal instalments rounded upwards to1000, not rounding annual first', () => { let m = calculate(plan()); assert.deepEqual(m.base, f(90000)); assert.deepEqual(m.annualBeforeRounding, f(72000)); assert.deepEqual(m.instalment, f(24000)); assert.deepEqual(m.total, f(72000)); assert.deepEqual( m.schedule.map((s) => s.month), ['2026-05', '2026-07', '2026-09'], ); m = calculate({ ...plan(), previousTax: '100001' }); assert.deepEqual(m.instalment, f(25000)); assert.deepEqual(m.total, f(75000)); assert.equal(m.paymentExecuted, false); assert.equal(m.annualDeductionCreated, false); }); test('explicit zero and cents retain exact statutory rounding', () => { assert.deepEqual( calculate({ ...plan(), previousTax: '10000' }).total, f(0), ); assert.deepEqual( calculate({ ...plan(), previousTax: '10000.01' }).total, f(3000), ); }); test('unknown,negative base,other periods,wrong subject/year and absent evidence remain indeterminate', () => { for (const change of [ { previousTax: '' }, { previousTax: '1,00' }, { previousTax: '9999' }, { scope: 'other' }, { previousFullCalendarYear: 'no' }, { previousYear: '2024' }, { subjectNuit: '999999999' }, { year: '2027' }, { assessmentReference: '' }, { withholdingReference: '' }, ]) { const m = calculate({ ...plan(), ...change }); assert.ok(m.pending.length); assert.equal(m.instalment, null); assert.deepEqual(m.schedule, []); } assert.throws(() => validatePpcObligation({ ...plan(), previousTax: null }), ); }); test('preparation survives existing book, versions/history/report; obligation never becomes paid PPC deduction', () => { const { d, b } = combinedCase(), before = calculateAnnual(d, b); let old = recordAnnual(d, b, '2026-11-11T10:00:00Z'); old.ppcObligation = { ...plan(), subjectNuit: b.subjectNuit, year: b.year }; assert.equal(annualCurrent(d, old), false); const current = recordAnnual(d, old, '2026-11-11T10:01:00Z'); d.modelo_a_snapshot = saveAnnualBook(d, current); const recovered = annualBook(d); assert.deepEqual(recovered.ppcObligation, current.ppcObligation); assert.deepEqual( recovered.result.model.arithmeticBalance, before.arithmeticBalance, ); assert.deepEqual(recovered.ppc, b.ppc); assert.equal(annualCurrent(d, recovered), true); assert.equal(recovered.history.length, 1); assert.match(annualHtml(d), /PPC — estimativa fiscal/); assert.match(annualHtml(d), /2026-05/); });