@untemps/loan-schedule
Version:
Class to generate a schedule of loan payments
3 lines (2 loc) • 11.2 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});const e=(t,a)=>{for(const n of Object.keys(t))t[n]instanceof Object&&n in a&&Object.assign(t[n],e(a[n],t[n]));return Object.assign(a||{},t),a};var t;!function(e){e.CREDIT="credit",e.DEBIT="debit"}(t||(t={}));var a,n=t;!function(e){e.PAYMENT="payment",e.INSURANCE="insurance"}(a||(a={}));var r=a,s={headers:{year:{label:"Year"},balance:{label:"Balance"}}};class o{constructor(t,a,n){this.loanSettings=t,this.loanAmortizations=a,this.config=e(n||{},s)}get years(){return{headers:this.getHeaders(),values:this.getYears()}}getHeaders(){const{year:e,balance:t}=this.config.headers;return[e,...this.loanAmortizations.map(({label:e,type:t})=>({label:e,type:t})),t]}getYears(){const e=[];for(let t=0;t<this.loanSettings.term;t++)e.push(this.mapValues(this.loanAmortizations,t));return e}mapValues(e,t){const a=(new Date).getFullYear();let r=0;const s=e.reduce((e,{value:a,rate:s,type:i,compute:c})=>(c&&(a=o.getComputedValue(c,this.loanSettings)),s&&(a=o.getDynamicValue(a,s,t)),r+=a*(i===n.CREDIT?1:-1),[...e,a]),[a+t]);return s.push(r),s}static getMonthlyPayment(e,t,a){if(!e||!t||!a)return 0;const n=a/1200,r=Math.pow(1+n,12*t);return n/(r-1)*(e*r)}static getMonthlyInsurance(e,t){return e&&t?e*t/100/12:0}static getDynamicValue(e,t,a){return e&&t?e*Math.pow(1+t/100,a):0}static getComputedValue(e,t){if(!t)return 0;const{amount:a,term:n,interestRate:s,insuranceRate:i}=t;switch(e){case r.PAYMENT:return o.getMonthlyPayment(a,n,s);case r.INSURANCE:return o.getMonthlyInsurance(a,i);default:return 0}}}exports.LoanSchedule=o,exports.LoanScheduleAmortizationType=n,exports.LoanScheduleCompute=r;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9kZWVwTWVyZ2UudHMiLCIuLi9zcmMvTG9hblNjaGVkdWxlQW1vcnRpemF0aW9uVHlwZS50cyIsIi4uL3NyYy9Mb2FuU2NoZWR1bGVDb21wdXRlLnRzIiwiLi4vc3JjL2NvbmZpZy50cyIsIi4uL3NyYy9Mb2FuU2NoZWR1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZGVlcE1lcmdlID0gKHNvdXJjZTogb2JqZWN0LCB0YXJnZXQ6IG9iamVjdCk6IG9iamVjdCA9PiB7XG5cdGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNvdXJjZSkpIHtcblx0XHRpZiAoc291cmNlW2tleV0gaW5zdGFuY2VvZiBPYmplY3QgJiYga2V5IGluIHRhcmdldCkge1xuXHRcdFx0T2JqZWN0LmFzc2lnbihzb3VyY2Vba2V5XSwgZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSkpXG5cdFx0fVxuXHR9XG5cdE9iamVjdC5hc3NpZ24odGFyZ2V0IHx8IHt9LCBzb3VyY2UpXG5cdHJldHVybiB0YXJnZXRcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVlcE1lcmdlIiwiZW51bSBMb2FuU2NoZWR1bGVBbW9ydGl6YXRpb25UeXBlIHtcblx0Q1JFRElUID0gJ2NyZWRpdCcsXG5cdERFQklUID0gJ2RlYml0J1xufVxuXG5leHBvcnQgZGVmYXVsdCBMb2FuU2NoZWR1bGVBbW9ydGl6YXRpb25UeXBlIiwiZW51bSBMb2FuU2NoZWR1bGVDb21wdXRlIHtcblx0UEFZTUVOVCA9ICdwYXltZW50Jyxcblx0SU5TVVJBTkNFID0gJ2luc3VyYW5jZSdcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9hblNjaGVkdWxlQ29tcHV0ZSIsImV4cG9ydCBkZWZhdWx0IHtcblx0aGVhZGVyczoge1xuXHRcdHllYXI6IHtcblx0XHRcdGxhYmVsOiAnWWVhcidcblx0XHR9LFxuXHRcdGJhbGFuY2U6IHtcblx0XHRcdGxhYmVsOiAnQmFsYW5jZSdcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCBkZWVwTWVyZ2UgZnJvbSAnLi91dGlscy9kZWVwTWVyZ2UnXG5pbXBvcnQgTG9hblNjaGVkdWxlQW1vcnRpemF0aW9uIGZyb20gJy4vTG9hblNjaGVkdWxlQW1vcnRpemF0aW9uJ1xuaW1wb3J0IExvYW5TY2hlZHVsZUNvbmZpZyBmcm9tICcuL0xvYW5TY2hlZHVsZUNvbmZpZydcbmltcG9ydCBMb2FuU2NoZWR1bGVBbW9ydGl6YXRpb25UeXBlIGZyb20gJy4vTG9hblNjaGVkdWxlQW1vcnRpemF0aW9uVHlwZSdcbmltcG9ydCBMb2FuU2NoZWR1bGVZZWFycyBmcm9tICcuL0xvYW5TY2hlZHVsZVllYXJzJ1xuaW1wb3J0IExvYW5TY2hlZHVsZVNldHRpbmdzIGZyb20gJy4vTG9hblNjaGVkdWxlU2V0dGluZ3MnXG5pbXBvcnQgTG9hblNjaGVkdWxlSGVhZGVyIGZyb20gJy4vTG9hblNjaGVkdWxlSGVhZGVyJ1xuaW1wb3J0IExvYW5TY2hlZHVsZUNvbXB1dGUgZnJvbSAnLi9Mb2FuU2NoZWR1bGVDb21wdXRlJ1xuaW1wb3J0IGRlZmF1bHRDb25maWcgZnJvbSAnLi9jb25maWcnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvYW5TY2hlZHVsZSB7XG5cdHJlYWRvbmx5IGxvYW5TZXR0aW5nczogTG9hblNjaGVkdWxlU2V0dGluZ3Ncblx0cmVhZG9ubHkgeWVhcnM6IExvYW5TY2hlZHVsZVllYXJzXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvYW5TY2hlZHVsZSBpbXBsZW1lbnRzIElMb2FuU2NoZWR1bGUge1xuXHRyZWFkb25seSBsb2FuU2V0dGluZ3M6IExvYW5TY2hlZHVsZVNldHRpbmdzXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9hbkFtb3J0aXphdGlvbnM6IExvYW5TY2hlZHVsZUFtb3J0aXphdGlvbltdXG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBMb2FuU2NoZWR1bGVDb25maWdcblxuXHRjb25zdHJ1Y3Rvcihsb2FuU2V0dGluZ3M/OiBMb2FuU2NoZWR1bGVTZXR0aW5ncywgbG9hbkFtb3J0aXphdGlvbnM/OiBMb2FuU2NoZWR1bGVBbW9ydGl6YXRpb25bXSwgY29uZmlnPzogTG9hblNjaGVkdWxlQ29uZmlnKSB7XG5cdFx0dGhpcy5sb2FuU2V0dGluZ3MgPSBsb2FuU2V0dGluZ3Ncblx0XHR0aGlzLmxvYW5BbW9ydGl6YXRpb25zID0gbG9hbkFtb3J0aXphdGlvbnNcblx0XHR0aGlzLmNvbmZpZyA9IGRlZXBNZXJnZShjb25maWcgfHwge30sIGRlZmF1bHRDb25maWcpXG5cdH1cblxuXHRnZXQgeWVhcnMoKTogTG9hblNjaGVkdWxlWWVhcnMge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSxcblx0XHRcdHZhbHVlczogdGhpcy5nZXRZZWFycygpLFxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0SGVhZGVycygpOiBMb2FuU2NoZWR1bGVIZWFkZXJbXSB7XG5cdFx0Y29uc3QgeyB5ZWFyOiB5ZWFySGVhZGVyLCBiYWxhbmNlOiBiYWxhbmNlSGVhZGVyIH0gPSB0aGlzLmNvbmZpZy5oZWFkZXJzXG5cdFx0Y29uc3QgYW1vcnRpemF0aW9uSGVhZGVyczogTG9hblNjaGVkdWxlSGVhZGVyW10gPSB0aGlzLmxvYW5BbW9ydGl6YXRpb25zLm1hcCgoeyBsYWJlbCwgdHlwZSB9OiBMb2FuU2NoZWR1bGVIZWFkZXIpID0+ICh7XG5cdFx0XHRsYWJlbCxcblx0XHRcdHR5cGUsXG5cdFx0fSkpXG5cdFx0cmV0dXJuIFt5ZWFySGVhZGVyLCAuLi5hbW9ydGl6YXRpb25IZWFkZXJzLCBiYWxhbmNlSGVhZGVyXVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRZZWFycygpOiBudW1iZXJbXVtdIHtcblx0XHRjb25zdCB5ZWFyczogbnVtYmVyW11bXSA9IFtdXG5cdFx0Zm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMubG9hblNldHRpbmdzLnRlcm07IGkrKykge1xuXHRcdFx0eWVhcnMucHVzaCh0aGlzLm1hcFZhbHVlcyh0aGlzLmxvYW5BbW9ydGl6YXRpb25zLCBpKSlcblx0XHR9XG5cdFx0cmV0dXJuIHllYXJzXG5cdH1cblxuXHRwcml2YXRlIG1hcFZhbHVlcyhhbW9ydGl6YXRpb25zOiBMb2FuU2NoZWR1bGVBbW9ydGl6YXRpb25bXSwgaW5kZXg6IG51bWJlcik6IG51bWJlcltdIHtcblx0XHRjb25zdCBjdXJyZW50WWVhcjogbnVtYmVyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpXG5cdFx0bGV0IGJhbGFuY2U6IG51bWJlciA9IDBcblx0XHRjb25zdCByZXM6IG51bWJlcltdID0gYW1vcnRpemF0aW9ucy5yZWR1Y2UoXG5cdFx0XHQoYWNjOiBudW1iZXJbXSwgeyB2YWx1ZSwgcmF0ZSwgdHlwZSwgY29tcHV0ZSB9OiBMb2FuU2NoZWR1bGVBbW9ydGl6YXRpb24pID0+IHtcblx0XHRcdFx0ISFjb21wdXRlICYmICh2YWx1ZSA9IExvYW5TY2hlZHVsZS5nZXRDb21wdXRlZFZhbHVlKGNvbXB1dGUsIHRoaXMubG9hblNldHRpbmdzKSlcblx0XHRcdFx0ISFyYXRlICYmICh2YWx1ZSA9IExvYW5TY2hlZHVsZS5nZXREeW5hbWljVmFsdWUodmFsdWUsIHJhdGUsIGluZGV4KSlcblx0XHRcdFx0YmFsYW5jZSArPSB2YWx1ZSAqICh0eXBlID09PSBMb2FuU2NoZWR1bGVBbW9ydGl6YXRpb25UeXBlLkNSRURJVCA/IDEgOiAtMSlcblx0XHRcdFx0cmV0dXJuIFsuLi5hY2MsIHZhbHVlXVxuXHRcdFx0fSxcblx0XHRcdFtjdXJyZW50WWVhciArIGluZGV4XVxuXHRcdClcblx0XHRyZXMucHVzaChiYWxhbmNlKVxuXHRcdHJldHVybiByZXNcblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIGdldE1vbnRobHlQYXltZW50KGFtb3VudDogbnVtYmVyLCB0ZXJtOiBudW1iZXIsIGludGVyZXN0UmF0ZTogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRpZiAoIWFtb3VudCB8fCAhdGVybSB8fCAhaW50ZXJlc3RSYXRlKSByZXR1cm4gMFxuXHRcdGNvbnN0IHJhdGU6IG51bWJlciA9IGludGVyZXN0UmF0ZSAvIDEyMDBcblx0XHRjb25zdCBwdmlmOiBudW1iZXIgPSBNYXRoLnBvdygxICsgcmF0ZSwgdGVybSAqIDEyKVxuXHRcdHJldHVybiAocmF0ZSAvIChwdmlmIC0gMSkpICogKGFtb3VudCAqIHB2aWYpXG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBnZXRNb250aGx5SW5zdXJhbmNlKGFtb3VudDogbnVtYmVyLCBpbnN1cmFuY2VSYXRlOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdGlmICghYW1vdW50IHx8ICFpbnN1cmFuY2VSYXRlKSByZXR1cm4gMFxuXHRcdHJldHVybiAoYW1vdW50ICogaW5zdXJhbmNlUmF0ZSkgLyAxMDAgLyAxMlxuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgZ2V0RHluYW1pY1ZhbHVlKGJhc2VWYWx1ZTogbnVtYmVyLCByYXRlOiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuXHRcdGlmICghYmFzZVZhbHVlIHx8ICFyYXRlKSByZXR1cm4gMFxuXHRcdHJldHVybiBiYXNlVmFsdWUgKiBNYXRoLnBvdygxICsgcmF0ZSAvIDEwMCwgaW5kZXgpXG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBnZXRDb21wdXRlZFZhbHVlKGNvbXB1dGU6IHN0cmluZywgc2V0dGluZ3M6IExvYW5TY2hlZHVsZVNldHRpbmdzKTogbnVtYmVyIHtcblx0XHRpZiAoIXNldHRpbmdzKSByZXR1cm4gMFxuXHRcdGNvbnN0IHsgYW1vdW50LCB0ZXJtLCBpbnRlcmVzdFJhdGUsIGluc3VyYW5jZVJhdGUgfSA9IHNldHRpbmdzXG5cdFx0c3dpdGNoIChjb21wdXRlKSB7XG5cdFx0XHRjYXNlIExvYW5TY2hlZHVsZUNvbXB1dGUuUEFZTUVOVDpcblx0XHRcdFx0cmV0dXJuIExvYW5TY2hlZHVsZS5nZXRNb250aGx5UGF5bWVudChhbW91bnQsIHRlcm0sIGludGVyZXN0UmF0ZSlcblx0XHRcdGNhc2UgTG9hblNjaGVkdWxlQ29tcHV0ZS5JTlNVUkFOQ0U6XG5cdFx0XHRcdHJldHVybiBMb2FuU2NoZWR1bGUuZ2V0TW9udGhseUluc3VyYW5jZShhbW91bnQsIGluc3VyYW5jZVJhdGUpXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gMFxuXHRcdH1cblx0fVxufVxuIl0sIm5hbWVzIjpbImRlZXBNZXJnZSIsInNvdXJjZSIsInRhcmdldCIsImtleSIsIk9iamVjdCIsImtleXMiLCJhc3NpZ24iLCJMb2FuU2NoZWR1bGVBbW9ydGl6YXRpb25UeXBlIiwiTG9hblNjaGVkdWxlQ29tcHV0ZSIsImhlYWRlcnMiLCJ5ZWFyIiwibGFiZWwiLCJiYWxhbmNlIiwiTG9hblNjaGVkdWxlIiwiW29iamVjdCBPYmplY3RdIiwibG9hblNldHRpbmdzIiwibG9hbkFtb3J0aXphdGlvbnMiLCJjb25maWciLCJ0aGlzIiwiZGVmYXVsdENvbmZpZyIsInllYXJzIiwiZ2V0SGVhZGVycyIsInZhbHVlcyIsImdldFllYXJzIiwieWVhckhlYWRlciIsImJhbGFuY2VIZWFkZXIiLCJtYXAiLCJ0eXBlIiwiaSIsInRlcm0iLCJwdXNoIiwibWFwVmFsdWVzIiwiYW1vcnRpemF0aW9ucyIsImluZGV4IiwiY3VycmVudFllYXIiLCJEYXRlIiwiZ2V0RnVsbFllYXIiLCJyZXMiLCJyZWR1Y2UiLCJhY2MiLCJ2YWx1ZSIsInJhdGUiLCJjb21wdXRlIiwiZ2V0Q29tcHV0ZWRWYWx1ZSIsImdldER5bmFtaWNWYWx1ZSIsIkNSRURJVCIsImFtb3VudCIsImludGVyZXN0UmF0ZSIsInB2aWYiLCJNYXRoIiwicG93IiwiaW5zdXJhbmNlUmF0ZSIsImJhc2VWYWx1ZSIsInNldHRpbmdzIiwiUEFZTUVOVCIsImdldE1vbnRobHlQYXltZW50IiwiSU5TVVJBTkNFIiwiZ2V0TW9udGhseUluc3VyYW5jZSJdLCJtYXBwaW5ncyI6Im9FQUFBLE1BQU1BLEVBQVksQ0FBQ0MsRUFBZ0JDLEtBQ2xDLElBQUssTUFBTUMsS0FBT0MsT0FBT0MsS0FB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