@wealthx/borrow-capacity-lib
Version:
Borrow capacity calculation library for WealthX
3 lines (2 loc) • 10.1 kB
JavaScript
;var n,e;function t(){return(t=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var o in t)({}).hasOwnProperty.call(t,o)&&(n[o]=t[o])}return n}).apply(null,arguments)}Object.defineProperty(exports,"__esModule",{value:!0}),(n=exports.AccountType||(exports.AccountType={})).Transaction="transaction",n.Savings="savings",n.CreditCard="credit-card",n.Mortgage="mortgage",n.Loan="loan",n.Investment="investment",n.Share="share",n.TermDeposit="term-deposit",n.Insurance="insurance",n.Other="other",n.Unknown="unknown",n.Superannuation="superannuation",(e=exports.PeriodType||(exports.PeriodType={})).Monthly="monthly",e.Weekly="weekly";var o=Object.values(exports.AccountType),a=[exports.AccountType.CreditCard,exports.AccountType.Mortgage,exports.AccountType.Loan],r=[exports.AccountType.Loan,exports.AccountType.Mortgage],c=o.filter((function(n){return!a.includes(n)})),i=o.filter((function(n){return n!==exports.AccountType.Superannuation})),l=[26e3,39e3,52e3,66e3,79e3,105e3,131e3,157e3,184e3,21e4,262e3,328e3,394e3,656e3],p=new Map([[exports.PeriodType.Weekly,new Map([[2,new Map([[0,[599,599,613,638,679,742,829,903,985,1034,1100,1216,1389,1403]],[1,[599,599,704,728,769,833,920,995,1077,1126,1192,1309,1482,1497]],[2,[599,599,769,794,835,897,984,1058,1140,1189,1255,1371,1543,1558]],[3,[599,599,769,859,900,962,1049,1123,1205,1254,1319,1436,1607,1622]]])],[1,new Map([[0,[311,326,341,366,407,470,557,631,714,762,828,945,1118,1133]],[1,[311,425,440,464,505,567,654,728,810,858,924,1040,1211,1226]],[2,[311,536,551,575,616,678,765,839,920,969,1034,1150,1321,1336]],[3,[311,536,662,687,727,789,876,949,1031,1079,1145,1260,1431,1446]]])]])],[exports.PeriodType.Monthly,new Map([[2,new Map([[0,[2394,2394,2453,2553,2715,2967,3316,3612,3942,4135,4399,4865,5555,5614]],[1,[2394,2394,2814,2914,3077,3330,3681,3978,4309,4503,4768,5236,5929,5988]],[2,[2394,2394,3077,3176,3338,3590,3938,4233,4562,4755,5018,5483,6171,6230]],[3,[2394,2394,3077,3436,3598,3849,4197,4493,4821,5014,5277,5742,6430,6489]]])],[1,new Map([[0,[1244,1305,1364,1464,1627,1879,2229,2525,2855,3049,3313,3780,4471,4530]],[1,[1244,1700,1758,1857,2019,2270,2617,2912,3239,3432,3695,4158,4844,4903]],[2,[1244,2144,2203,2302,2463,2714,3061,3355,3682,3874,4136,4600,5284,5343]],[3,[1244,2144,2648,2746,2908,3158,3504,3798,4124,4316,4578,5041,5725,5784]]])]])]]),u=[{min:0,max:18200,rate:0,baseTax:0},{min:18201,max:45e3,rate:.16,baseTax:0},{min:45001,max:135e3,rate:.3,baseTax:4288},{min:135001,max:19e4,rate:.37,baseTax:31288},{min:190001,max:Number.MAX_SAFE_INTEGER,rate:.45,baseTax:51638}],s=function(n){for(var e=[],t=0,o=u;t<o.length;t++){var a=o[t],r=a.min,c=a.max,i=a.rate,l=1-i-(n?.02:0),p=(r-1)*i-a.baseTax,s=Math.round(r*l+p),m=c===Number.MAX_SAFE_INTEGER?Number.MAX_SAFE_INTEGER:Math.round(c*l+p);e.push({min:s,max:m,gRatio:l,base:p})}return e},m=s(!0),h=s(!1);function d(n){var e=n.annualIncome,t=n.numberOfApplicants,o=n.period,a=n.bufferRate,r=void 0===a?.05:a,c=Math.min(Math.max(n.numberOfDependants,0),3),i=Math.min(Math.max(e,0),l[l.length-1]),u=p.get(o);if(!u)throw new Error("Invalid period type: "+o);var s=u.get(t);if(!s)throw new Error("Invalid number of applicants: "+t+". Must be 1 (single) or 2 (couple)");var m=s.get(c);if(!m)throw new Error("Invalid number of dependants: "+c);for(var h=0,d=l.length-1,y=-1;h<=d;){var A=Math.floor((h+d)/2);i<=l[A]?(y=A,d=A-1):h=A+1}if(-1===y)throw new Error("Something went wrong");var M=m[y];if(void 0===M)throw new Error("No HEM data available for income "+i+" with "+t+" applicants and "+c+" dependants");return M*(1+r)}function y(n){var e=n.netIncome,t=n.includeMedicareLevy,o=(void 0===t||t?m:h).find((function(n){return e>=n.min&&e<=n.max}));return o?Math.round((e-o.base)/o.gRatio):0}function A(n){return Math.max(n.propertiesEstimatedValue-n.mortgageLoan,0)}function M(n){return n.properties.reduce((function(n,e){return n+((null==e?void 0:e.estimate)||0)}),0)}function x(n){var e=n.propertyLinkedAccountIds,t=n.accounts.filter((function(n){return e.has(n.id)})).reduce((function(n,e){var t=Number(e.balance);return n+(t<0?t:0)}),0);return Math.abs(t)}function v(n){return n.reduce((function(n,e){var t;return((null==(t=e.accountIds)?void 0:t.split(","))||[]).forEach((function(e){e.trim()&&n.add(e.trim())})),n}),new Set)}exports.AUSTRALIAN_REVERSE_TAX_BRACKETS=m,exports.AUSTRALIAN_REVERSE_TAX_BRACKETS_WITHOUT_MEDICARE_LEVY=h,exports.AUSTRALIAN_TAX_BRACKETS=u,exports.DEFAULT_ASSESSMENT_BUFFER_RATE=.03,exports.DEFAULT_HEM_BUFFER_RATE=.05,exports.DEFAULT_INTEREST_RATE=.0524,exports.DEFAULT_LOAN_TERM=360,exports.DEFAULT_SHADED_RENTAL_INCOME_RATIO=.8,exports.DEFAULT_SURPLUS_AVAILABLE_FOR_LOAN_RATE=1,exports.HEM_DATA=p,exports.HEM_INCOME_BRACKETS=l,exports.MEDICARE_LEVY_RATE=.02,exports.accountTypes=o,exports.calculateBorrowCapacity=function(n){var e=n.monthlyIncome,t=void 0===e?0:e,o=n.monthlyExpense,a=void 0===o?0:o,r=n.interestRate,c=void 0===r?.0524:r,i=n.loanTerm,l=void 0===i?360:i,p=n.bufferRate,u=void 0===p?.03:p,s=n.surplusAvailableForLoanRate,m=void 0===s?1:s,h=n.numberOfApplicants,A=void 0===h?1:h,M=n.numberOfDependants,x=void 0===M?0:M,v=n.monthlyRentalIncome,f=void 0===v?0:v,E=d({annualIncome:y({netIncome:12*(t+f),includeMedicareLevy:!0}),numberOfApplicants:A,numberOfDependants:x,period:exports.PeriodType.Monthly}),T=Math.max(t+.8*f-(a<E?E:a),0)*m,I=(c+u)/12;return 0===I?T*l:T*(Math.pow(1+I,l)-1)/(I*Math.pow(1+I,l))},exports.calculateBuyingGoal=function(n){var e=n.equity,t=n.desiredLoanAmount;return Math.max(n.cashAvailable,0)+Math.max(e,0)+Math.max(t,0)},exports.calculateBuyingPower=function(n){var e=n.equity,t=n.maxLoanAmount;return Math.max(n.cashAvailable,0)+Math.max(e,0)+Math.max(t,0)},exports.calculateCashAvailable=function(n){var e=null==n?void 0:n.filter((function(n){var e,t=(null==(e=n.class)?void 0:e.type)||exports.AccountType.Unknown;return t!==exports.AccountType.Superannuation&&c.includes(t)}));return null==e?void 0:e.reduce((function(n,e){var t=e.balance,o=void 0===t?0:t;return n+(o>0?o:0)}),0)},exports.calculateEquity=A,exports.calculateEquityData=function(n){var e=n.properties,t=n.accounts,o=M({properties:e}),a=x({accounts:t,propertyLinkedAccountIds:v(e)});return{equity:A({propertiesEstimatedValue:o,mortgageLoan:a}),propertiesEstimatedValue:o,mortgageLoan:a}},exports.calculateExcessMonthlySurplus=function(n){return Math.max(n.totalIncome+n.totalExpense,0)},exports.calculateHEMExpense=d,exports.calculateLVR=function(n){var e=n.mortgageLoan,t=n.propertiesEstimatedValue;return t<=0?0:e>=t?100:e/t*100||0},exports.calculateLiability=function(n){var e=null==n?void 0:n.filter((function(n){var e;return a.includes((null==n||null==(e=n.class)?void 0:e.type)||exports.AccountType.Unknown)}));return null==e?void 0:e.reduce((function(n,e){var t=e.balance,o=void 0===t?0:t;return n+(o<0?o:0)}),0)},exports.calculateLoanRepayment=function(n){var e=n.principal,t=n.interestRate,o=n.loanTerm,a=void 0===o?360:o,r=(void 0===t?.0524:t)/12;return 0===r?e/a:e*(r*Math.pow(1+r,a))/(Math.pow(1+r,a)-1)},exports.calculateMortgageLoan=x,exports.calculatePropertiesEstimatedValue=M,exports.getLenderInfo=function(n){return n.filter((function(n){var e;return(null==(e=n.class)?void 0:e.type)===exports.AccountType.Mortgage})).reduce((function(n,e){var t;n.lenderNames.push(e.institutionName||"Unknown"),n.lenderShortNames.push(e.institutionShortName||null);var o=e.lendingRate||(null==(t=e.meta)||null==(t=t.lendingRates)||null==(t=t[0])?void 0:t.rate);return n.debtInterestRates.push(o?parseFloat(o):null),n}),{lenderNames:[],lenderShortNames:[],debtInterestRates:[]})},exports.getLinkedPropertyAccountIds=v,exports.grossToNet=function(n){var e=n.grossIncome,t=n.includeMedicareLevy,o=void 0===t||t;return e<=0?0:e-function(n){var e=Math.floor(n);if(e<=0)return 0;var t=u.find((function(n){return e>=n.min&&e<=n.max}));return t?t.baseTax+(e-t.min)*t.rate:0}(e)-(o?.02*e:0)},exports.liabilityAccountTypes=a,exports.loanAccountTypes=r,exports.netToGross=y,exports.nonLiabilityAccountTypes=c,exports.nonSuperannuationAccountTypes=i,exports.processScenarioHistoryData=function(n,e){var o={};return(n||[]).forEach((function(n){var a=n.memberId===e,r=null==n?void 0:n.incomeAndExpensesSummary;if(r){var c=r.avgExpenseByLastXMonths||{},i=r.avgRepaymentExpenseByLastXMonths||{};Object.keys(c).forEach((function(n){o[n]||(o[n]={month:n,mainApplicantMonthlyIncome:0,coApplicantMonthlyIncome:0,mainApplicantMonthlyRentalIncome:0,coApplicantMonthlyRentalIncome:0,monthlyExpense:0,monthlyDebtRepayment:0});var e=Math.abs(Number(c[n])||0),t=Number(i[n])||0;o[n].monthlyExpense+=e,o[n].monthlyDebtRepayment+=t}));var l=r.incomesByLastXMonths||{};Object.keys(l).forEach((function(n){var e;o[n]||(o[n]={month:n,mainApplicantMonthlyIncome:0,coApplicantMonthlyIncome:0,mainApplicantMonthlyRentalIncome:0,coApplicantMonthlyRentalIncome:0,monthlyExpense:0,monthlyDebtRepayment:0});var r=((null==(e=l[n])?void 0:e.regular)||[]).reduce((function(n,e){var o=t({},n);return o[e.isRentalIncome?a?"mainApplicantMonthlyRentalIncome":"coApplicantMonthlyRentalIncome":a?"mainApplicantMonthlyIncome":"coApplicantMonthlyIncome"]+=Number(e.avgAmount)||0,o}),{mainApplicantMonthlyIncome:0,coApplicantMonthlyIncome:0,mainApplicantMonthlyRentalIncome:0,coApplicantMonthlyRentalIncome:0});o[n].mainApplicantMonthlyIncome+=r.mainApplicantMonthlyIncome,o[n].coApplicantMonthlyIncome+=r.coApplicantMonthlyIncome,o[n].mainApplicantMonthlyRentalIncome+=r.mainApplicantMonthlyRentalIncome,o[n].coApplicantMonthlyRentalIncome+=r.coApplicantMonthlyRentalIncome}))}})),Object.values(o).map((function(n){return t({},n,{mainApplicantMonthlyIncome:Math.round(n.mainApplicantMonthlyIncome),coApplicantMonthlyIncome:Math.round(n.coApplicantMonthlyIncome),mainApplicantMonthlyRentalIncome:Math.round(n.mainApplicantMonthlyRentalIncome),coApplicantMonthlyRentalIncome:Math.round(n.coApplicantMonthlyRentalIncome),monthlyExpense:Math.round(n.monthlyExpense),monthlyDebtRepayment:Math.round(n.monthlyDebtRepayment)})})).sort((function(n,e){return n.month.localeCompare(e.month)}))};
//# sourceMappingURL=borrow-capacity-lib.cjs.production.min.js.map