// Model redakcyjny, wersja 1, 26.09.2026. Bez danych klientów. // P: saldo PLN; annualRate: oprocentowanie nominalne (np. 0.06); months: pozostałe raty. // Nadpłata po naliczeniu odsetek i zapłacie raty, utrzymanie raty bazowej, krótszy okres. // Równe miesiące, stopa stała w symulacji, brak opłat; zaokrąglenia tylko na wyjściu. function payment(P,annualRate,months){ if(!Number.isFinite(P)||P<=0||!Number.isFinite(annualRate)||annualRate<0||!Number.isInteger(months)||months<=0)throw Error('Invalid input'); const r=annualRate/12;return r===0?P/months:P*r/(1-Math.pow(1+r,-months)); } function simulate(P,annualRate,months,extra=0){ if(!Number.isFinite(extra)||extra<0)throw Error('Invalid extra'); const base=payment(P,annualRate,months),r=annualRate/12; let balance=P,interest=0,total=0,extraTotal=0,n=0;const schedule=[]; while(balance>1e-7&&n0.01)throw Error('Unpaid balance'); return {payment:base,months:n,interest,total,extraTotal,schedule}; } function compare(P,years,annualRate=0.06,extra=500){ const standard=simulate(P,annualRate,years*12),accelerated=simulate(P,annualRate,years*12,extra); return {principal:P,years,annualRate,extra,basePayment:standard.payment,monthlyOutlay:standard.payment+extra,baseMonths:standard.months,overpaidMonths:accelerated.months,monthsSaved:standard.months-accelerated.months,baseInterest:standard.interest,overpaidInterest:accelerated.interest,interestSaved:standard.interest-accelerated.interest,extraTotal:accelerated.extraTotal}; } module.exports={payment,simulate,compare};