{"version":3,"sources":["CurrentLoanDetails.js","NewLoanDetails.js","App.js","reportWebVitals.js","index.js"],"names":["CurrentLoanDetails","props","handleNumberUpdate","event","name","target","value","onUpdate","Number","handleFrequencyUpdate","Card","className","CardHeader","CardBody","Form","Row","form","Col","md","FormGroup","Label","for","Input","type","placeholder","bsSize","onChange","currentLoan","loanBalance","min","max","interestRate","step","termRemaining","repaymentFrequency","CardTitle","tag","regularFee","terminationFee","regularFeeFrequency","NewLoanDetails","newLoan","introductoryRate","introductoryPeriod","ongoingRate","applicationFee","otherSwitchingFees","PMT","rate","nper","pv","fv","result","term","Math","pow","FV","pmt","getVal","val","calculate","summary","chartData","html","pmtFreq","fee","feeFreq","feeTermination","feeApplication","feeSwitching","newFee","newFeeFreq","newIntroRate","newIntroNper","newRate","newNper","totalSwitchingFees","period","periodText","totalCost","newPv","newIntroPmt","newPmt","newTotalCost","recoverSwitchCosts","i","newPmtCurrent","newPvAfterIntroMaintain","newPmtCurrentAfterIntro","newNperHigher","undefined","num","den","log","NPER","repayYears","parseInt","toFixed","repayTerm","repayMonths","ceil","newTotalCostHigher","newPmtMaintain","cost","recoveredItem","replace","length","formatMoney","parseFloat","abs","timeSaved","String","prototype","toFloat","s","this","isNaN","decPlaces","currencySymbol","thouSeparator","decSeparator","n","sign","j","substr","slice","p","toString","App","handleCurrentLoanUpdate","state","map","x","cs","setState","handleNewLoanUpdate","Container","style","width","height","ResponsiveContainer","BarChart","data","margin","top","right","left","bottom","CartesianGrid","strokeDasharray","XAxis","dataKey","YAxis","Tooltip","Bar","fill","dangerouslySetInnerHTML","__html","Component","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"qbAGaA,EAAqB,SAACC,GAa/B,IAOMC,EAAqB,SAACC,GACxB,IAAIC,EAAOD,EAAME,OAAOD,KACpBE,EAAQH,EAAME,OAAOC,MAEzBL,EAAMM,SAASH,EAAMI,OAAOF,KAG1BG,EAAwB,SAACN,GAC3B,IAAIC,EAAOD,EAAME,OAAOD,KACpBE,EAAQH,EAAME,OAAOC,MAEzBL,EAAMM,SAASH,EAAME,IAGzB,OACI,eAACI,EAAA,EAAD,CAAMC,UAAU,uBAAhB,UACI,cAACC,EAAA,EAAD,UAAY,gDACZ,cAACC,EAAA,EAAD,UACI,eAACC,EAAA,EAAD,WACI,eAACC,EAAA,EAAD,CAAKC,MAAI,EAAT,UACI,cAACC,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,cAAX,2BAA8C,sBAAMV,UAAU,WAAhB,eAC9C,cAACW,EAAA,EAAD,CAAOlB,KAAK,cAAcmB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAoBI,MAAOL,EAAM0B,YAAYC,cAC1H,cAACN,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,cAAcE,MAAOL,EAAM0B,YAAYC,YAAaF,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,WAGhI,cAACb,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,eAAX,qCAAyD,sBAAMV,UAAU,WAAhB,eACzD,cAACW,EAAA,EAAD,CAAOlB,KAAK,eAAemB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAoBI,MAAOL,EAAM0B,YAAYI,eAC3H,cAACT,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,eAAeE,MAAOL,EAAM0B,YAAYI,aAAcL,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,GAAIE,KAAM,aAIhJ,eAACjB,EAAA,EAAD,CAAKC,MAAI,EAAT,UACI,cAACC,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,gBAAX,qCAA0D,sBAAMV,UAAU,WAAhB,eAC1D,cAACW,EAAA,EAAD,CAAOlB,KAAK,gBAAgBmB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAqBI,MAAOL,EAAM0B,YAAYM,gBAC7H,cAACX,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,gBAAgBE,MAAOL,EAAM0B,YAAYM,cAAeP,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,UAGpI,cAACb,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,qBAAX,kCAA4D,sBAAMV,UAAU,WAAhB,eAC5D,eAACW,EAAA,EAAD,CAAOC,KAAK,SAASnB,KAAK,qBAAqBsB,SAAUjB,EAAuBgB,OAAO,KAAKnB,MAAOL,EAAM0B,YAAYO,mBAArH,UACI,wBAAQ5B,MAAM,IAAd,oBACA,wBAASA,MAAM,KAAf,qBACA,wBAASA,MAAM,KAAf,yBACA,wBAASA,MAAM,KAAf,+BAKhB,cAAC6B,EAAA,EAAD,CAAWC,IAAI,KAAf,kBACA,eAACrB,EAAA,EAAD,CAAKC,MAAI,EAAT,UACI,cAACC,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,aAAX,0BACA,cAACC,EAAA,EAAD,CAAOlB,KAAK,aAAamB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAqBI,MAAOL,EAAM0B,YAAYU,aAC1H,cAACf,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,aAAaE,MAAOL,EAAM0B,YAAYU,WAAYX,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,WAG9H,cAACb,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,iBAAX,8BACA,cAACC,EAAA,EAAD,CAAOlB,KAAK,iBAAiBmB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAoBI,MAAOL,EAAM0B,YAAYW,iBAC7H,cAAChB,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,iBAAiBE,MAAOL,EAAM0B,YAAYW,eAAgBZ,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,WAGtI,cAACb,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,sBAAX,oCACA,eAACC,EAAA,EAAD,CAAOC,KAAK,SAASnB,KAAK,sBAAsBsB,SAAUjB,EAAuBgB,OAAO,KAAKnB,MAAOL,EAAM0B,YAAYY,oBAAtH,UACI,wBAAQjC,MAAM,IAAd,oBACA,wBAASA,MAAM,KAAf,qBACA,wBAASA,MAAM,KAAf,yBACA,wBAASA,MAAM,KAAf,wCClGvBkC,EAAiB,SAACvC,GAc3B,IAOMC,EAAqB,SAACC,GACxB,IAAIC,EAAOD,EAAME,OAAOD,KACpBE,EAAQH,EAAME,OAAOC,MAEzBL,EAAMM,SAASH,EAAMI,OAAOF,KAUhC,OACI,eAACI,EAAA,EAAD,CAAMC,UAAU,mBAAhB,UACI,cAACC,EAAA,EAAD,UAAY,4CACZ,cAACC,EAAA,EAAD,UACI,eAACC,EAAA,EAAD,WACI,eAACC,EAAA,EAAD,CAAKC,MAAI,EAAT,UACI,cAACC,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,mBAAX,yCACA,cAACC,EAAA,EAAD,CAAOlB,KAAK,mBAAmBmB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAoBI,MAAOL,EAAMwC,QAAQC,mBAC3H,cAACpB,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,mBAAmBE,MAAOL,EAAMwC,QAAQC,iBAAkBhB,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,GAAIE,KAAM,UAGhJ,cAACf,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,qBAAX,yCACA,cAACC,EAAA,EAAD,CAAOlB,KAAK,qBAAqBmB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAoBI,MAAOL,EAAMwC,QAAQE,qBAC7H,cAACrB,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,qBAAqBE,MAAOL,EAAMwC,QAAQE,mBAAoBjB,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,UAG1I,cAACb,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,cAAX,oCACA,cAACC,EAAA,EAAD,CAAOlB,KAAK,cAAcmB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAoBI,MAAOL,EAAMwC,QAAQG,cACtH,cAACtB,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,cAAcE,MAAOL,EAAMwC,QAAQG,YAAalB,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,GAAIE,KAAM,aAI1I,cAACG,EAAA,EAAD,CAAWC,IAAI,KAAf,kBACA,eAACrB,EAAA,EAAD,CAAKC,MAAI,EAAT,UACI,cAACC,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,iBAAX,kCACA,cAACC,EAAA,EAAD,CAAOlB,KAAK,iBAAiBmB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAoBI,MAAOL,EAAMwC,QAAQI,iBACzH,cAACvB,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,iBAAiBE,MAAOL,EAAMwC,QAAQI,eAAgBnB,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,WAGlI,cAACb,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,qBAAX,sCACA,cAACC,EAAA,EAAD,CAAOlB,KAAK,qBAAqBmB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAoBI,MAAOL,EAAMwC,QAAQK,qBAC7H,cAACxB,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,qBAAqBE,MAAOL,EAAMwC,QAAQK,mBAAoBpB,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,WAG1I,cAACb,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,aAAX,8BACA,cAACC,EAAA,EAAD,CAAOlB,KAAK,aAAamB,KAAK,SAASC,YAAY,GAAGC,OAAO,KAAKC,SAAUxB,EAAoBI,MAAOL,EAAMwC,QAAQJ,aACrH,cAACf,EAAA,EAAD,CAAOC,KAAK,QAAQnB,KAAK,aAAaE,MAAOL,EAAMwC,QAAQJ,WAAYX,SAAUxB,EAAoB2B,IAAK,EAAGC,IAAK,cAI9H,eAACf,EAAA,EAAD,CAAKC,MAAI,EAAT,UACI,cAACC,EAAA,EAAD,CAAKC,GAAI,EAAT,SACI,eAACC,EAAA,EAAD,WACI,cAACC,EAAA,EAAD,CAAOC,IAAI,sBAAX,sCACA,eAACC,EAAA,EAAD,CAAOC,KAAK,SAASnB,KAAK,sBAAsBsB,SA/D9C,SAACvB,GAC3B,IAAIC,EAAOD,EAAME,OAAOD,KACpBE,EAAQH,EAAME,OAAOC,MAEzBL,EAAMM,SAASH,EAAME,IA2DoFmB,OAAO,KAAKnB,MAAOL,EAAMwC,QAAQF,oBAAlH,UACI,wBAAQjC,MAAM,IAAd,oBACA,wBAASA,MAAM,KAAf,qBACA,wBAASA,MAAM,KAAf,yBACA,wBAASA,MAAM,KAAf,4BAIZ,cAACW,EAAA,EAAD,CAAKC,GAAI,IAGT,cAACD,EAAA,EAAD,CAAKC,GAAI,gB,8DC/EjC,SAAS6B,EAAIC,EAAMC,EAAMC,EAAIC,EAAI5B,GAC/B,IAAI6B,EACJ,GAAa,IAATJ,EACAI,GAAUF,EAAKC,GAAMF,MAClB,CACH,IAAII,EAAOC,KAAKC,IAAI,EAAIP,EAAMC,GAE1BG,EADS,IAAT7B,GACU4B,EAAKH,GAAQK,EAAO,GAAKH,EAAKF,GAAQ,EAAI,EAAIK,KAAU,EAAIL,GAE7DG,EAAKH,GAAQK,EAAO,GAAKH,EAAKF,GAAQ,EAAI,EAAIK,GAG/D,OAAQD,EAGV,SAASI,EAAGR,EAAMC,EAAMQ,EAAKP,EAAI3B,GAC/B,IAAI4B,EACJ,GAAa,IAATH,EACAG,EAAKD,EAAKO,EAAMR,MACb,CACH,IAAII,EAAOC,KAAKC,IAAI,EAAIP,EAAMC,GAE1BE,EADS,IAAT5B,EACK2B,EAAKG,EAAOI,GAAO,EAAIT,IAASK,EAAO,GAAOL,EAE9CE,EAAKG,EAAOI,GAAOJ,EAAO,GAAKL,EAG5C,OAAQG,EAWV,SAASO,EAAOC,GACd,OAAOnD,OAAOmD,GAkChB,SAASC,EAAUjC,EAAac,GAE9B,GAAgC,OAA5Bd,EAAYC,aACiB,MAA5BD,EAAYI,cACuB,OAAnCJ,EAAYO,oBACY,OAAxBO,EAAQG,YAEX,MAAO,CACLiB,QAAS,GACTC,UAAW,IAQf,IAqBIC,EArBAb,EAAKQ,EAAO/B,EAAYC,aACxBoB,EAAOU,EAAO/B,EAAYI,cAAc,IACxCkB,EAAOS,EAAO/B,EAAYM,eAC1B+B,EAAUN,EAAO/B,EAAYO,oBAC7B+B,EAAMP,EAAO/B,EAAYU,YACzB6B,EAAUR,EAAO/B,EAAYY,qBAC7B4B,EAAiBT,EAAO/B,EAAYW,gBAGpC8B,EAAiBV,EAAOjB,EAAQI,gBAChCwB,EAAeX,EAAOjB,EAAQK,oBAC9BwB,EAASZ,EAAOjB,EAAQJ,YACxBkC,EAAab,EAAOjB,EAAQF,qBAC5BiC,EAAed,EAAOjB,EAAQC,kBAAkB,IAChD+B,EAAef,EAAOjB,EAAQE,oBAC9B+B,EAAUhB,EAAOjB,EAAQG,aAAa,IACtC+B,EAAU1B,EAAOwB,EACjBG,EAAqBT,EAAiBC,EAAiBC,EAKvDQ,EAASb,EAAQc,aAAe,IAIhCrB,EAAMV,EAAIC,EAAKgB,EAASf,EAAKe,GAAUd,EAPlC,EACE,GAMmDe,EAAIC,EAASF,EACvEe,EAAYtB,EAAMR,EAAOe,EAIzBgB,EAAQ9B,EAAK0B,EAEbK,EAAclC,EAAIyB,EAAaR,EAASf,EAAKe,GAAUgB,EAdlD,EACE,GAasEV,EAAOC,EAAYP,EAEhGkB,EAASnC,EAAI2B,EAAQV,EAASW,EAAQX,GADpBR,EAAGgB,EAAaR,EAASS,EAAaT,EAASiB,EAAeX,EAAOC,EAAYP,GAAYgB,EAdxG,GADF,EACE,GAeyEV,EAAOC,EAAYP,EACnGmB,EAAgBF,EAAcR,EAAeT,EAAYkB,GAAUjC,EAAKwB,GAAgBT,EACxFoB,EAAqB,EACzB,GAAKX,EAAe,EAChB,IAAKY,EAAI,EAAGA,GAAKZ,EAAaT,EAASqB,IACnC,GAAMA,EAAE5B,EAAQ4B,EAAEJ,GAAgBL,EAAqB,CACnDQ,EAAqBC,EACrB,MAIZ,GAA4B,IAAvBD,EACD,IAAKC,EAAI,EAAGA,GAAKV,EAAQX,EAASqB,IAC9B,GAAMA,EAAE5B,EAAQ4B,EAAEH,GAAWN,EAAqB,CAAEQ,EAAqBX,EAAaT,EAAUqB,EAAG,MAIvGD,EADGL,EAAUI,EAAaP,GAAwB,EAC7B,WAEfA,EAAqB,EACC,IAAvBQ,EAAkD,oBAC3BA,EAAoB,IAAIP,EAE5B,MAG5B,IAAIS,EAAgBvC,EAAIyB,EAAaR,EAASf,EAAKe,GAAUgB,EA1CpD,EACE,GAyCwEV,EAAOC,EAAYP,EACjGsB,EAAgB7B,IAAQ6B,EAAgB7B,GAE7C,IAAI8B,EAA0B/B,EAAGgB,EAAaR,EAASS,EAAaT,EAASsB,EAAiBhB,EAAOC,EAAYP,GAAYgB,EA5ClH,GA6CPQ,EAA0BzC,EAAI2B,EAAQV,EAASf,EAAKe,GAAUuB,EA9CzD,EACE,GA6C+FjB,EAAOC,EAAYP,EACxHwB,EAA0B/B,IAAQ+B,EAA0B/B,GACjE,IAAIgC,EA/HN,SAAczC,EAAMS,EAAKP,EAAIC,EAAI5B,QAClBmE,IAATnE,IAAsBA,EAAO,GACjC,IAAIoE,EAAMlC,GAAO,EAAIT,EAAOzB,GAAQ4B,EAAKH,EACrC4C,EAAO1C,EAAKF,EAAOS,GAAO,EAAIT,EAAOzB,GACzC,OAAc,IAATyB,IAAwBG,EAAKD,GAAIO,EACxBH,KAAKuC,IAAIF,EAAMC,GAAOtC,KAAKuC,IAAI,EAAI7C,GA0H7B8C,CAAKpB,EAAQV,EAASwB,GAA0BD,EAhD3D,EACE,GAgDXE,GAAgChB,EAAeT,EAC/C,IAAI+B,EAAaC,SAASP,EAAcQ,QAAQ,GAAGjC,GAC/CkC,EAAYH,EAAa,SACzBI,EAAc7C,KAAK8C,KAAOX,EAAcQ,QAAQ,GAAGjC,EAAU,EAAI,IAChEmC,EAAc,IAAMD,EAAYA,EAAY,IAAMC,EAAc,WACjD,KAAhBA,IAAsBJ,GAAwB,EAAGI,EAAc,GACnE,IAAIE,EAAsBf,EAAgBb,EAAeT,EAAYwB,GAA2BC,EAAchB,EAAaT,GAEvHsC,EAAiB7C,EAChB6C,EAAkBpB,IAAWoB,EAAkBpB,IAOhDvD,EAAc,IAAgB,GAAK,GACnCc,EAAU,IAAY,GAAK,EAC/B,IAAI8D,EAAO,GAAIA,EAAK,GAAK,EAkBrB5E,EAAY,GAAK,EAAGc,EAAQ,GAAK,EACjC,IAAM,IAAI4C,EAAI,EAAGA,GAAKpC,EAAMoC,IAGA1D,EAAY0D,GAA/BA,GArGG,EAyBD,KA6EiB5B,EACxB9B,EAAY0D,GAAK1D,EAAY0D,GAAKrB,EAClCrC,EAAY0D,GAAK1D,EAAY0D,GAAK1D,EAAY0D,EAAE,GAGrB5C,EAAQ4C,GAA9BA,GAAKZ,EAA8BQ,EACpBC,EACpBzC,EAAQ4C,GAAK5C,EAAQ4C,GAAKrB,EAC1BvB,EAAQ4C,GAAK5C,EAAQ4C,GAAK5C,EAAQ4C,EAAE,GAGpCkB,EAAKlB,GAAK1D,EAAY0D,GAAK5C,EAAQ4C,GAI3CtB,EAAO,GAEP,IAAIyC,EAAgB,KAIlBA,EADKzB,EAAYI,EAAiB,GAAKC,EAAmBqB,QAAQ,UAAU,IAAIC,OAAS,EAC5E,4JAGmBtB,EAHnB,wBAMA,gDAMdrB,EAAI,4JAG4DmB,EAAOyB,YAAY,GAH/E,gBAGyF3C,EAAQc,aAHjG,qJAMuDC,EAAUI,EAAgB,EAAI,GAAK,OAN1F,iBAM8GJ,EAAUI,EAAgB,EAAI,QAAU,QANtJ,wEAQ6ByB,WAAWtD,KAAKuD,IAAI9B,EAAUI,IAAewB,YAAY,GARtF,4DASsCrD,KAAKuD,IAAI9B,EAAUI,IAAelC,EAAKe,IAAa2C,YAAY,GATtG,gBASgH3C,EAAQc,aATxH,0EAYK0B,EAZL,kCAiBL,IAAIM,EAAYF,WAAW3D,EAAOe,EAAUyB,GAAeQ,QAAQ,GA0BnE,OAxBKa,EAAY,GAAM/B,EAAUI,EAAgB,IAC7C2B,EAAYd,SAASc,GACrB/C,EAAI,UAAMA,EAAN,wJAGqDN,EAAIkD,YAAY,GAHrE,gBAG+E3C,EAAQc,aAHvF,uMAMoDC,EAAUI,EAAgB,EAAI,GAAK,OANvF,iBAM2GJ,EAAUI,EAAgB,EAAI,QAAU,QANnJ,wEAQ0ByB,WAAWtD,KAAKuD,IAAK9B,EAAUsB,IAAsBM,YAAY,GAR3F,4DASmCrD,KAAKuD,IAAI9B,EAAUsB,GAAqBZ,GAAmBkB,YAAY,GAAG,QAAQ3C,EAAQc,aAT7H,oKAa+D,UAb/D,uDAc4BgC,EAd5B,YAcyC9C,EAAQc,aAdjD,6DAsBD,CACLjB,QAASE,EACTD,UAAWyC,GA3OfQ,OAAOC,UAAUC,QAAU,WACzB,IAAIC,EAAIC,KAGR,OAFAD,EAAIA,EAAET,QAAQ,YAAa,KACtBW,MAAMF,IAAMA,EAAER,OAAS,KAAMQ,EAAI,GAC/BN,WAAWM,IAEpB1G,OAAOwG,UAAUL,YAAc,SAASU,EAAWC,EAAgBC,EAAeC,GAEhFH,EAAYD,MAAMC,EAAY/D,KAAKuD,IAAIQ,IAAc,EAAIA,EACzDC,OAAoC5B,IAAnB4B,EAA+B,IAAMA,EACtDE,OAAgC9B,IAAjB8B,EAA6B,IAAMA,EAClDD,OAAkC7B,IAAlB6B,EAA8B,IAAMA,EAEpD,IAAIE,EAAIN,KACJO,EAAOD,EAAI,EAAI,IAAM,GACrBpC,EAAIW,SAASyB,EAAInE,KAAKuD,KAAKY,GAAK,GAAGxB,QAAQoB,IAAc,GACzDM,GAAKA,EAAItC,EAAEqB,QAAU,EAAIiB,EAAI,EAAI,EAErC,OAAOD,EAAOJ,GAAkBK,EAAItC,EAAEuC,OAAO,EAAGD,GAAKJ,EAAgB,IAAMlC,EAAEuC,OAAOD,GAAGlB,QAAQ,iBAAkB,KAAOc,IAAkBF,EAAYG,EAAelE,KAAKuD,IAAIY,EAAIpC,GAAGY,QAAQoB,GAAWQ,MAAM,GAAK,KAErNrH,OAAOwG,UAAUlC,WAAa,WAC5B,IAAIgD,EAAIX,KAMR,OADAW,GADAA,GADAA,GADAA,GADAA,EAAIA,EAAEC,YACAtB,QAAQ,KAAM,SACdA,QAAQ,KAAM,cACdA,QAAQ,KAAM,UACdA,QAAQ,IAAK,SAyNd,IAAMuB,EAAb,kDAEE,WAAY/H,GAAQ,IAAD,uBACjB,cAAMA,IA0CRgI,wBAA0B,SAAC7H,EAAME,GAC/B,IAAIqB,EAAW,eAAO,EAAKuG,MAAMvG,aACjCA,EAAYvB,GAAQE,EAEpB,IAAI8C,EAASQ,EAAUjC,EAAa,EAAKuG,MAAMzF,SAC3CqB,EAAYV,EAAOU,UAAUqE,KAAI,SAACC,EAAE/C,GACtC,MAAO,CACLjF,KAAMiF,EACNgD,GAAID,MAIR,EAAKE,SAAS,CAAC3G,cAAakC,QAAST,EAAOS,QAASC,eAvDpC,EA0DnByE,oBAAsB,SAACnI,EAAME,GAC3B,IAAImC,EAAO,eAAO,EAAKyF,MAAMzF,SAC7BA,EAAQrC,GAAQE,EAEhB,IAAI8C,EAASQ,EAAU,EAAKsE,MAAMvG,YAAac,GAC3CqB,EAAYV,EAAOU,UAAUqE,KAAI,SAACC,EAAE/C,GACtC,MAAO,CACLjF,KAAMiF,EACNgD,GAAID,MAIR,EAAKE,SAAS,CAAC7F,UAASoB,QAAST,EAAOS,QAASC,eAnEjD,IAAInC,EAAc,CAChBC,YAAa,KACbG,aAAc,KACdE,cAAe,KACfC,mBAAoB,GAEpBG,WAAY,EACZC,eAAgB,EAChBC,oBAAqB,IAGnBE,EAAU,CACZC,iBAAkB,KAClBC,mBAAoB,EACpBC,YAAa,KAEbC,eAAgB,EAChBC,mBAAoB,EACpBT,WAAY,EACZE,oBAAqB,IAGnBa,EAASQ,EAAUjC,EAAac,GAChCqB,EAAYV,EAAOU,UAAUqE,KAAI,SAACC,EAAE/C,GACtC,MAAO,CACLjF,KAAMiF,EACNgD,GAAID,MA7BS,OAiCjB,EAAKF,MAAQ,CACXvG,YAAaA,EACbc,QAASA,EACToB,QAAST,EAAOS,QAChBC,UAAWA,GArCI,EAFrB,0CA2EE,WAEE,OACA,cAAC0E,EAAA,EAAD,CAAW7H,UAAU,MAArB,SACE,sBAAKA,UAAU,mBAAf,UACE,cAAC,EAAD,CAAoBJ,SAAU4G,KAAKc,wBAAyBtG,YAAawF,KAAKe,MAAMvG,cACpF,cAAC,EAAD,CAAgBpB,SAAU4G,KAAKoB,oBAAqB9F,QAAS0E,KAAKe,MAAMzF,UACvE0E,KAAKe,MAAMpE,UAAU4C,OAAS,GAC/B,eAAChG,EAAA,EAAD,CAAMC,UAAU,UAAhB,UACI,cAACC,EAAA,EAAD,UAAY,2CACZ,eAACC,EAAA,EAAD,WAEA,sBAAKF,UAAU,kBAAkB8H,MAAO,CAAEC,MAAO,OAAQC,OAAQ,KAAjE,UACE,qBAAKhI,UAAU,eAAf,yBACA,qBAAKA,UAAU,eAAf,mBACA,cAACiI,EAAA,EAAD,UACM,eAACC,EAAA,EAAD,CACAC,KAAM3B,KAAKe,MAAMpE,UACjBiF,OAAQ,CACNC,IAAK,EACLC,MAAO,GACPC,KAAM,GACNC,OAAQ,IANV,UASA,cAACC,EAAA,EAAD,CAAeC,gBAAgB,QAC/B,cAACC,EAAA,EAAD,CAAOC,QAAQ,SAGf,cAACC,EAAA,EAAD,IAGA,cAACC,EAAA,EAAD,IAEA,cAACC,EAAA,EAAD,CAAKH,QAAQ,KAAKI,KAAK,oBAK3B,qBAAKC,wBAAyB,CAACC,OAAQ1C,KAAKe,MAAMrE,0BAlHlE,GAAyBiG,aC3SVC,EAZS,SAAAC,GAClBA,GAAeA,aAAuBC,UACxC,8BAAqBC,MAAK,YAAkD,IAA/CC,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QAC3DJ,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAON,GACPO,EAAQP,OCDdQ,IAASC,OACP,cAAC,IAAMC,WAAP,UACE,cAAC,EAAD,MAEFC,SAASC,eAAe,SAM1Bb,M","file":"static/js/main.42ad8f60.chunk.js","sourcesContent":["import React from 'react';\r\nimport { Card, CardBody, CardHeader, Form, FormGroup, Label, Col, Input, CardTitle, Row } from 'reactstrap';\r\n\r\nexport const CurrentLoanDetails = (props) => {\r\n\r\n// Current loan\r\n// - Loan balance ($)\r\n// - Interest Rate (% p.a.)\r\n// - Term remaining (years)\r\n// - Repayment frequency (Weekly, Fortnightly, Monthly, Annually)\r\n\r\n// Fees\r\n// - Regular fee ($)\r\n// - Regular fee frequency (Weekly, Fortnightly, Monthly, Annually)\r\n// - Termination fee ($)\r\n\r\n const handleUpdate = (event) => {\r\n let name = event.target.name;\r\n let value = event.target.value;\r\n\r\n props.onUpdate(name, value);\r\n }\r\n\r\n const handleNumberUpdate = (event) => {\r\n let name = event.target.name;\r\n let value = event.target.value;\r\n\r\n props.onUpdate(name, Number(value));\r\n }\r\n\r\n const handleFrequencyUpdate = (event) => {\r\n let name = event.target.name;\r\n let value = event.target.value;\r\n\r\n props.onUpdate(name, value);\r\n }\r\n\r\n return (\r\n \r\n

Current loan

\r\n \r\n
\r\n \r\n \r\n \r\n *\r\n \r\n \r\n \r\n \r\n \r\n \r\n *\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n *\r\n \r\n \r\n \r\n \r\n \r\n \r\n *\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Fees\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n )\r\n\r\n\r\n\r\n}","import React from 'react';\r\nimport { Card, CardBody, CardHeader, Form, FormGroup, Label, Col, Input, CardTitle, Row } from 'reactstrap';\r\n\r\nexport const NewLoanDetails = (props) => {\r\n\r\n// New Loan\r\n// - Introductory rate: (% p.a.)\r\n// - Introductory period: (years)\r\n// - Ongoing rate: (% p.a.)\r\n// Fees\r\n// - Application fee: ($)\r\n// - Other switching fees: ($)\r\n// - Regular fee: ($)\r\n// - Regular fee frequency: (Weekly, Fortnightly, Monthly, Annually)\r\n\r\n\r\n\r\n const handleUpdate = (event) => {\r\n let name = event.target.name;\r\n let value = event.target.value;\r\n\r\n props.onUpdate(name, value);\r\n }\r\n\r\n const handleNumberUpdate = (event) => {\r\n let name = event.target.name;\r\n let value = event.target.value;\r\n\r\n props.onUpdate(name, Number(value));\r\n }\r\n\r\n const handleFrequencyUpdate = (event) => {\r\n let name = event.target.name;\r\n let value = event.target.value;\r\n\r\n props.onUpdate(name, value);\r\n }\r\n\r\n return (\r\n \r\n

New loan

\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Fees\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n
\r\n
\r\n
\r\n )\r\n\r\n\r\n\r\n}","import 'bootstrap/dist/css/bootstrap.min.css';\r\nimport './App.scss';\r\nimport './InputRange.scss';\r\nimport React, { Component } from 'react';\r\nimport { Container } from 'reactstrap';\r\nimport { CurrentLoanDetails } from './CurrentLoanDetails';\r\nimport { NewLoanDetails } from './NewLoanDetails';\r\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Label } from 'recharts';\r\nimport { Card, CardBody, CardHeader } from 'reactstrap';\r\n\r\n\r\n\r\n\r\n// New Loan\r\n// - Introductory rate: (% p.a.)\r\n// - Introductory period: (years)\r\n// - Ongoing rate: (% p.a.)\r\n// Fees\r\n// - Application fee: ($)\r\n// - Other switching fees: ($)\r\n// - Regular fee: ($)\r\n// - Regular fee frequency: (Weekly, Fortnightly, Monthly, Annually)\r\n\r\n\r\n\r\n// PMT - returns the payment amount for a loan based on an interested rate and a constant payment schedule\r\nfunction PMT(rate, nper, pv, fv, type) {\r\n var result;\r\n if (rate === 0) {\r\n result = (pv + fv) / nper;\r\n } else {\r\n var term = Math.pow(1 + rate, nper);\r\n if (type === 1) {\r\n result = (fv * rate / (term - 1) + pv * rate / (1 - 1 / term)) / (1 + rate);\r\n } else {\r\n result = fv * rate / (term - 1) + pv * rate / (1 - 1 / term);\r\n }\r\n }\r\n return -result;\r\n}\r\n// FV - returns the future value of an investment based on an interest rate and a constant payment schedule\r\nfunction FV(rate, nper, pmt, pv, type) {\r\n var fv;\r\n if (rate === 0) {\r\n fv = pv + pmt * nper;\r\n } else {\r\n var term = Math.pow(1 + rate, nper);\r\n if (type === 1) {\r\n fv = pv * term + pmt * (1 + rate) * (term - 1.0) / rate;\r\n } else {\r\n fv = pv * term + pmt * (term - 1) / rate;\r\n }\r\n }\r\n return -fv;\r\n}\r\n// NPER - returns the number of periods for an investment based on an interest rate and a constant payment schedule\r\nfunction NPER(rate, pmt, pv, fv, type) {\r\n if (type === undefined) { type = 0; }\r\n var num = pmt * (1 + rate * type) - fv * rate;\r\n var den = (pv * rate + pmt * (1 + rate * type));\r\n if ( rate === 0 ) { return -(fv + pv)/pmt; }\r\n else { return Math.log(num / den) / Math.log(1 + rate); }\r\n}\r\n\r\nfunction getVal(val){\r\n return Number(val);\r\n}\r\n\r\nString.prototype.toFloat = function() {\r\n var s = this;\r\n s = s.replace(/[^0-9-.]/g, '');\r\n if ( isNaN(s) || s.length < 1 ) { s = 0; }\r\n return parseFloat(s);\r\n};\r\nNumber.prototype.formatMoney = function(decPlaces, currencySymbol, thouSeparator, decSeparator) {\r\n // check the args and supply defaults:\r\n decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces;\r\n currencySymbol = currencySymbol === undefined ? \"$\" : currencySymbol;\r\n decSeparator = decSeparator === undefined ? \".\" : decSeparator;\r\n thouSeparator = thouSeparator === undefined ? \",\" : thouSeparator;\r\n\r\n var n = this,\r\n sign = n < 0 ? \"-\" : \"\",\r\n i = parseInt(n = Math.abs(+n || 0).toFixed(decPlaces)) + \"\",\r\n j = (j = i.length) > 3 ? j % 3 : 0;\r\n\r\n return sign + currencySymbol + (j ? i.substr(0, j) + thouSeparator : \"\") + i.substr(j).replace(/(\\d{3})(?=\\d)/g, \"$1\" + thouSeparator) + (decPlaces ? decSeparator + Math.abs(n - i).toFixed(decPlaces).slice(2) : \"\");\r\n};\r\nNumber.prototype.periodText = function() {\r\n var p = this;\r\n p = p.toString();\r\n p = p.replace('52', 'week');\r\n p = p.replace('26', 'fortnight');\r\n p = p.replace('12', 'month');\r\n p = p.replace('1', 'year');\r\n return p;\r\n};\r\n\r\n\r\nfunction calculate(currentLoan, newLoan) {\r\n\r\n if (currentLoan.loanBalance === null \r\n || currentLoan.interestRate == null \r\n || currentLoan.repaymentFrequency === null\r\n || newLoan.ongoingRate === null\r\n ) {\r\n return { \r\n summary: \"\",\r\n chartData: []\r\n };\r\n }\r\n\r\n\r\n\r\n\r\n // current loan vars\r\n var pv = getVal(currentLoan.loanBalance);\r\n var rate = getVal(currentLoan.interestRate)/100;\r\n var nper = getVal(currentLoan.termRemaining);\r\n var pmtFreq = getVal(currentLoan.repaymentFrequency);\r\n var fee = getVal(currentLoan.regularFee);\r\n var feeFreq = getVal(currentLoan.regularFeeFrequency);\r\n var feeTermination = getVal(currentLoan.terminationFee);\r\n var introNper = 0; // no introductory period for existing loan\r\n // new loan vars\r\n var feeApplication = getVal(newLoan.applicationFee);\r\n var feeSwitching = getVal(newLoan.otherSwitchingFees);\r\n var newFee = getVal(newLoan.regularFee);\r\n var newFeeFreq = getVal(newLoan.regularFeeFrequency);\r\n var newIntroRate = getVal(newLoan.introductoryRate)/100;\r\n var newIntroNper = getVal(newLoan.introductoryPeriod);\r\n var newRate = getVal(newLoan.ongoingRate)/100;\r\n var newNper = nper - newIntroNper;\r\n var totalSwitchingFees = feeTermination + feeApplication + feeSwitching;\r\n // generic vars\r\n var fv = 0;\r\n var type = 0;\r\n var html;\r\n var period = pmtFreq.periodText() + 's';\r\n var chartPmt = false; // set to true to chart data based on existing repayments\r\n\r\n //calculate current loan payment\r\n var pmt = PMT(rate/pmtFreq, nper*pmtFreq, -pv, fv, type) + ( (fee*feeFreq)/pmtFreq );\r\n var totalCost = pmt * nper * pmtFreq; // total cost including interest and fees\r\n // pmtFreq :: 1 year is 1, monthly is 12, weekly is 52, etc\r\n\r\n //calculate new loan payment\r\n var newPv = pv + totalSwitchingFees; // present value of new loan once fees are added\r\n var introPmt = null;\r\n var newIntroPmt = PMT(newIntroRate/pmtFreq, nper*pmtFreq, -newPv, fv, type) + ( (newFee*newFeeFreq)/pmtFreq ); // honeymoon payment amount\r\n var newPvAfterIntro = FV(newIntroRate/pmtFreq, newIntroNper*pmtFreq, newIntroPmt-( (newFee*newFeeFreq)/pmtFreq ), -newPv, type); //present value of loan after honeymoon period\r\n var newPmt = PMT(newRate/pmtFreq, newNper*pmtFreq, -newPvAfterIntro, fv, type) + ( (newFee*newFeeFreq)/pmtFreq ); // ongoing payment amount\r\n var newTotalCost = (newIntroPmt * newIntroNper * pmtFreq) + (newPmt * (nper-newIntroNper) * pmtFreq); // total cost including interest and fees\r\n var recoverSwitchCosts = 0;\r\n if ( newIntroNper > 0 ) {\r\n for (i = 1; i <= newIntroNper*pmtFreq; i++) {\r\n if ( (i*pmt) - (i*newIntroPmt) >= totalSwitchingFees ) {\r\n recoverSwitchCosts = i;\r\n break;\r\n }\r\n }\r\n }\r\n if ( recoverSwitchCosts === 0 ) {\r\n for (i = 1; i <= newNper*pmtFreq; i++) {\r\n if ( (i*pmt) - (i*newPmt) >= totalSwitchingFees ) { recoverSwitchCosts = newIntroNper*pmtFreq + i; break; }\r\n }\r\n }\r\n if ( ( totalCost-newTotalCost-totalSwitchingFees ) <= 0 ) {\r\n recoverSwitchCosts = 'negative';\r\n }\r\n else if ( totalSwitchingFees > 0 ) {\r\n if ( recoverSwitchCosts === 0 ) { recoverSwitchCosts = 'fee not recovered'; }\r\n else { recoverSwitchCosts = recoverSwitchCosts +' '+period; }\r\n }\r\n else { recoverSwitchCosts = 'N/A'; }\r\n\r\n // calculate new loan maintaining existing payment\r\n var newPmtCurrent = PMT(newIntroRate/pmtFreq, nper*pmtFreq, -newPv, fv, type) + ( (newFee*newFeeFreq)/pmtFreq ); // honeymoon payment amount\r\n if ( newPmtCurrent < pmt ) { newPmtCurrent = pmt; }\r\n //var newPvAfterIntroMaintain = FV(newIntroRate/pmtFreq, newIntroNper*pmtFreq, newPmtCurrent, -newPv, type); // future value of loan at the end of honeymoon period //20160210\r\n var newPvAfterIntroMaintain = FV(newIntroRate/pmtFreq, newIntroNper*pmtFreq, newPmtCurrent-( (newFee*newFeeFreq)/pmtFreq ), -newPv, type); // future value of loan at the end of honeymoon period\r\n var newPmtCurrentAfterIntro = PMT(newRate/pmtFreq, nper*pmtFreq, -newPvAfterIntroMaintain, fv, type) + ( (newFee*newFeeFreq)/pmtFreq ); // payment amount after honeymoon\r\n if ( newPmtCurrentAfterIntro < pmt ) { newPmtCurrentAfterIntro = pmt; }\r\n var newNperHigher = NPER(newRate/pmtFreq, newPmtCurrentAfterIntro, -newPvAfterIntroMaintain, fv, type); // how long will it take to pay off the loan after the honeymoon period\r\n newNperHigher = newNperHigher + newIntroNper * pmtFreq;\r\n var repayYears = parseInt(newNperHigher.toFixed(6)/pmtFreq);\r\n var repayTerm = repayYears + ' years';\r\n var repayMonths = Math.ceil( (newNperHigher.toFixed(6)/pmtFreq % 1)* 12 );\r\n if ( repayMonths > 0 ) { repayTerm = repayTerm + ' ' + repayMonths + ' months'; }\r\n if (repayMonths === 12) { repayYears = repayYears+1; repayMonths = 0; }\r\n var newTotalCostHigher = (newPmtCurrent * newIntroNper * pmtFreq) + (newPmtCurrentAfterIntro * (newNperHigher-newIntroNper*pmtFreq) ); // total cost including interest and fees\r\n\r\n var newPmtMaintain = pmt;\r\n if ( newPmtMaintain < newPmt ) { newPmtMaintain = newPmt; }\r\n\r\n\r\n var assumptions = '

Assumptions:

';\r\n\r\n // build chart array data\r\n var currentLoan = []; currentLoan[0] = 0;\r\n var newLoan = []; newLoan[0] = 0;\r\n var cost = []; cost[0] = 0;\r\n\r\n // calculate graph based on maintaining existing repayments\r\n if ( chartPmt ) {\r\n newPmt = newPmtMaintain;\r\n currentLoan[0] = pv; newLoan[0] = pv + feeTermination + feeApplication + feeSwitching;\r\n for ( var i = 1; i <= nper; i++ ){ // loop through each year\r\n\r\n currentLoan[i] = -FV(rate/pmtFreq, 1*pmtFreq, -pmt, currentLoan[i-1], type);\r\n\r\n if ( i <= newIntroNper ) { newLoan[i] = -FV(newIntroRate/pmtFreq, 1*pmtFreq, -newPmt, newLoan[i-1], type); }\r\n else { newLoan[i] = -FV(newRate/pmtFreq, 1*pmtFreq, -newPmt, newLoan[i-1], type); }\r\n\r\n //cost or savings\r\n cost[i] = currentLoan[i] - newLoan[i];\r\n }\r\n }\r\n else { // calculate graph based on new repayment amount\r\n currentLoan[0] = 0; newLoan[0] = 0; //feeTermination + feeApplication + feeSwitching; //20160210\r\n for ( var i = 1; i <= nper; i++ ){ // loop through each year\r\n\r\n // current loan\r\n if ( i <= introNper ) { currentLoan[i] = introPmt; }\r\n else { currentLoan[i] = pmt; }\r\n currentLoan[i] = currentLoan[i] * pmtFreq;\r\n currentLoan[i] = currentLoan[i] + currentLoan[i-1];\r\n\r\n // new loan\r\n if ( i <= newIntroNper ) { newLoan[i] = newIntroPmt; }\r\n else { newLoan[i] = newPmt; }\r\n newLoan[i] = newLoan[i] * pmtFreq;\r\n newLoan[i] = newLoan[i] + newLoan[i-1];\r\n\r\n //cost or savings\r\n cost[i] = currentLoan[i] - newLoan[i];\r\n }\r\n }\r\n\r\n html = '';\r\n\r\n var recoveredItem = null;\r\n\r\n\r\n if ( ( totalCost - newTotalCost ) > 0 && recoverSwitchCosts.replace(/[^0-9]/g,'').length > 0 ) {\r\n recoveredItem = `\r\n
\r\n
your switching costs will be recovered in
\r\n
${recoverSwitchCosts}
\r\n
`;\r\n } else {\r\n recoveredItem = `\r\n
\r\n\r\n
`; \r\n }\r\n\r\n html = `\r\n
\r\n

Minimum repayments

\r\n

By switching loans and making the minimum repayment - ${newPmt.formatMoney(0)} per ${pmtFreq.periodText()}:

\r\n
\r\n
\r\n
Over the life of the loan ${( (totalCost-newTotalCost) < 0 ? '' : 'you ' )} will ${( (totalCost-newTotalCost) < 0 ? 'cost ' : 'save ' )}
\r\n
\r\n
${parseFloat(Math.abs(totalCost-newTotalCost)).formatMoney(0)}
\r\n
(${( ( Math.abs(totalCost-newTotalCost)/(nper*pmtFreq) ) ).formatMoney(0)} per ${pmtFreq.periodText()})
\r\n
\r\n
\r\n ${recoveredItem}\r\n
\r\n
`;\r\n\r\n\r\n var timeSaved = parseFloat(nper * pmtFreq - newNperHigher).toFixed(6);\r\n // only this message if the new loan will save time\r\n if ( timeSaved > 0 && (totalCost-newTotalCost) > 0 ) {\r\n timeSaved = parseInt(timeSaved); // ignore the remainder\r\n html = `${html}\r\n
\r\n

Higher repayments

\r\n

By switching loans and making higher repayments - ${pmt.formatMoney(0)} per ${pmtFreq.periodText()}, the same minimum repayments as your current loan:

\r\n
\r\n
\r\n
Over the life of the loan ${( (totalCost-newTotalCost) < 0 ? '' : 'you ' )} will ${( (totalCost-newTotalCost) < 0 ? 'cost ' : 'save ' )}
\r\n
\r\n
${parseFloat(Math.abs( totalCost-newTotalCostHigher )).formatMoney(0)}
\r\n
(${( ( Math.abs(totalCost-newTotalCostHigher)/(newNperHigher) ) ).formatMoney(0)+' per '+pmtFreq.periodText()})
\r\n
\r\n
\r\n
\r\n
you will pay off your loan this much ${(1?'earlier':'later')}
\r\n
${timeSaved} ${pmtFreq.periodText()}s
\r\n
\r\n
\r\n
`;\r\n }\r\n\r\n //if ( (totalCost-newTotalCost - totalSwitchingFees) < 0 ) { $('#result span').addClass('negative'); }\r\n\r\n return { \r\n summary: html,\r\n chartData: cost\r\n };\r\n\r\n}\r\n\r\n\r\n\r\n\r\nexport class App extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n let currentLoan = {\r\n loanBalance: null,\r\n interestRate: null,\r\n termRemaining: null,\r\n repaymentFrequency: 12,\r\n\r\n regularFee: 0,\r\n terminationFee: 0,\r\n regularFeeFrequency: 12\r\n };\r\n\r\n let newLoan = {\r\n introductoryRate: null,\r\n introductoryPeriod: 0,\r\n ongoingRate: null,\r\n\r\n applicationFee: 0,\r\n otherSwitchingFees: 0,\r\n regularFee: 0,\r\n regularFeeFrequency: 12\r\n };\r\n\r\n let result = calculate(currentLoan, newLoan); \r\n let chartData = result.chartData.map((x,i) => {\r\n return {\r\n name: i,\r\n cs: x\r\n };\r\n });\r\n\r\n this.state = {\r\n currentLoan: currentLoan,\r\n newLoan: newLoan,\r\n summary: result.summary,\r\n chartData: chartData\r\n };\r\n\r\n }\r\n\r\n \r\n handleCurrentLoanUpdate = (name, value) => {\r\n var currentLoan = {...this.state.currentLoan}\r\n currentLoan[name] = value;\r\n\r\n let result = calculate(currentLoan, this.state.newLoan); \r\n let chartData = result.chartData.map((x,i) => {\r\n return {\r\n name: i,\r\n cs: x\r\n };\r\n });\r\n\r\n this.setState({currentLoan, summary: result.summary, chartData});\r\n };\r\n\r\n handleNewLoanUpdate = (name, value) => {\r\n var newLoan = {...this.state.newLoan}\r\n newLoan[name] = value;\r\n\r\n let result = calculate(this.state.currentLoan, newLoan); \r\n let chartData = result.chartData.map((x,i) => {\r\n return {\r\n name: i,\r\n cs: x\r\n };\r\n });\r\n\r\n this.setState({newLoan, summary: result.summary, chartData}); \r\n };\r\n\r\n render() {\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n {this.state.chartData.length > 0 && \r\n \r\n

Results

\r\n \r\n\r\n
\r\n
Cost/Saving
\r\n
Years
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n }\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport { App } from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}