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