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