import test from 'node:test'; import assert from 'node:assert/strict'; import {plan} from './helpers/irpc-pec-obligation-case.mjs'; import {combinedCase} from './helpers/irpc-investment-combination-case.mjs'; import {calculatePecObligation,validatePecObligation} from '../../resources/js/lib/irpc-pec-obligation.ts'; import {recordAnnual,saveAnnualBook,annualBook,annualCurrent,annualHtml} from '../../resources/js/lib/irpc-annual-settlement.ts'; import {calculatePecPlan,newPecPlan} from '../../resources/js/lib/irpc-pec-plan.ts'; const f=n=>({numerator:String(n),denominator:'1'}); const sample=()=>{const p={...plan(),previousTurnover:'0.00'};return {...p,lastAmount:{version:1,subjectNuit:p.subjectNuit,year:'2024',amount:'42500.25',reference:'SYNTHETIC final PEC amount; latest applicable annual ordinary MZN reference',confirmed:'yes'}}}; const calc=p=>calculatePecObligation(p,p.subjectNuit,p.year,'normal'); test('documented latest PEC amount is retained without percentage, caps or a second PPC deduction',()=>{ const p=sample(),before=JSON.stringify(p),m=calc(p); assert.deepEqual(m.total,{numerator:'170001',denominator:'4'});assert.equal(m.percentage,null);assert.equal(m.limited,null);assert.equal(m.lastAmountApplied,true);assert.equal(m.requiresLastAmount,true); assert.equal(m.paymentExecuted,false);assert.equal(m.annualDeductionCreated,false);assert.equal(JSON.stringify(p),before); p.lastAmount.amount='0';assert.deepEqual(calc(p).total,f(0)); }); test('absent stale unconfirmed unsupported or malformed historical references never determine the estimate',()=>{ for(const changes of [{confirmed:''},{reference:''},{subjectNuit:'999999999'},{year:'2026'},{year:'2019'},{amount:''},{amount:'-1'},{amount:'NaN'}]){const p=sample();Object.assign(p.lastAmount,changes);assert.equal(calc(p).total,null,JSON.stringify(changes));} const p=sample();delete p.lastAmount;assert.equal(calc(p).total,null); assert.throws(()=>validatePecObligation({...sample(),lastAmount:{...sample().lastAmount,amount:null}})); }); test('ordinary positive turnover and activity start do not use or erase a saved historical reference',()=>{ const p=sample();p.previousTurnover='10000000';assert.deepEqual(calc(p).total,f(40000));assert.equal(calc(p).lastAmountApplied,false);assert.equal(p.lastAmount.amount,'42500.25'); p.activityStartYear='2026';assert.deepEqual(calc(p).total,f(0));assert.equal(calc(p).lastAmountApplied,false); }); test('native annual recovery and report retain history and require reconfirming cash assumptions after the estimate changes',()=>{ const {d,b}=combinedCase();b.pecObligation={...sample(),subjectNuit:b.subjectNuit,lastAmount:{...sample().lastAmount,subjectNuit:b.subjectNuit}}; const prior=recordAnnual(d,b,'2026-11-13T21:00:00Z'); const changed={...prior,pecObligation:{...prior.pecObligation,lastAmount:{...prior.pecObligation.lastAmount,amount:'50000'}}}; assert.equal(annualCurrent(d,changed),false); d.modelo_a_snapshot=saveAnnualBook(d,recordAnnual(d,changed,'2026-11-13T21:01:00Z')); const recovered=annualBook(d);assert.equal(annualCurrent(d,recovered),true);assert.equal(recovered.history.length,1);assert.deepEqual(recovered.result.model.arithmeticBalance,f(138)); assert.match(annualHtml(d),/PEC — último montante documentado/);assert.match(annualHtml(d),/50000/); const cash={...newPecPlan(),mode:'three',june:'42500.25',august:'0',october:'0',reference:'SYNTHETIC prior cash hypothesis'}; const cm=calculatePecPlan(cash,calc(recovered.pecObligation).total,false,'2026');assert.ok(cm.pending.length); }); test('unknown turnover cannot be bypassed and a documented correction to zero reuses the historical reference once',()=>{ const p=sample();p.previousTurnover='';assert.equal(calc(p).total,null); p.previousTurnover='10000000';p.correction={version:1,apply:'yes',originalTurnover:p.previousTurnover,revisedTurnover:'0.00',subjectNuit:p.subjectNuit,turnoverYear:'2025',reference:'SYNTHETIC corrected sales to zero'}; assert.equal(calc(p).requiresLastAmount,true);assert.equal(calc(p).lastAmountApplied,true);assert.deepEqual(calc(p).total,{numerator:'170001',denominator:'4'}); p.correction.reference='';assert.equal(calc(p).total,null); p.correction.apply='no';assert.deepEqual(calc(p).total,f(40000));assert.equal(calc(p).lastAmountApplied,false); }); test('excess documented PPC covers the PEC estimate without refund credit or duplicate annual deduction',()=>{ for(const [paid,expected] of [['50000','0'],['60000','10000'],['50000.01','0.01']]){ const p={...plan(),previousPpcPaid:paid};const m=calc(p);assert.deepEqual(m.total,f(0));assert.equal(m.pending.length,0); if(expected==='0')assert.equal(m.ppcExcess,null);else assert.ok(m.ppcExcess); assert.equal(m.paymentExecuted,false);assert.equal(m.annualDeductionCreated,false); } const {d,b}=combinedCase();b.pecObligation={...plan(),subjectNuit:b.subjectNuit,previousPpcPaid:'60000'}; d.modelo_a_snapshot=saveAnnualBook(d,recordAnnual(d,b,'2026-11-13T21:20:00Z')); const recovered=annualBook(d);assert.equal(annualCurrent(d,recovered),true);assert.deepEqual(recovered.result.model.arithmeticBalance,f(138));assert.match(annualHtml(d),/PEC — PPC acima da base limitada/);assert.match(annualHtml(d),/não cria reembolso/); });