Files
Investidor-V2/tests/frontend/irpc-ppc-obligation.test.mjs
T
2026-11-11 10:37:33 +02:00

88 lines
3.3 KiB
JavaScript

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/);
});