88 lines
3.3 KiB
JavaScript
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/);
|
|
});
|