var wasakredit = wasakredit || {}; wasakredit.KalkylatorData = function() { this.aterbetalningstid = 0.0; // Månader this.betalningstermin = 0; this.finansieratbelopp = 0.0; this.restvardebelopp = 0.0; this.forsakringsbelopp = 0.0; this.avtalstillagg = 0.0; // belopp this.paslag = 0.0; // belopp this.kickback = 0.0; // belopp this.laneskydd = false; /* Boolean. Anger om man vill ha låneskydd eller inte. Om kanalen inte tillåter låneskydd (styrs av parametersättning i backend systemen) så har detta fält ingen effekt. */ } wasakredit.KalkylatorResultat = function() { this.manadskostnad = 0.0; // belopp this.effektivranta = 0.0; // Ex 0.095 this.upplaggningsavgift = 0.0; // belopp this.administrativavgift = 0.0; // belopp. A.k.a aviavgift } wasakredit.Kalkylator = function() { // Direktlån; this.minbelopp = 30000.0000; // belopp this.maxbelopp = 400000.0000; // belopp this.startbelopp = 133333.33333333333333333333333; // belopp this.minaterbetalningstid = 12; // månader this.maxaterbetalningstid = 180; // månader this.startaterbetalningstid = 90; // månader this.minranta = 0.0355; // ex 0.095 this.maxranta = 0.1495; // ex 0.095 this.ranta = 0.0695; // ex 0.095 this.administrativavgift = 40.0000; // belopp this.upplaggningsavgift = 375; // belopp } /* Metod: berakna Inparameter: wasakredit.KalkylatorData Returnerar wasakredit.KalkylatorResultat */ wasakredit.Kalkylator.prototype.berakna = function(data) { var resultat = new wasakredit.KalkylatorResultat(); resultat.administrativavgift = this.administrativavgift; resultat.upplaggningsavgift = this.upplaggningsavgift; var underlag = { 'betalningstermin': data.betalningstermin || 1.0, 'aterbetalningstid': data.aterbetalningstid || 0.0, 'finansieratbelopp': data.finansieratbelopp || 0.0, 'restvardebelopp': 0.0, 'kickback': 0.0 }; underlag.manadskostnad = this._periodavgift(underlag); resultat.manadskostnad = underlag.manadskostnad; resultat.effektivranta = this._effektivranta(underlag); if (data.laneskydd) { resultat.manadskostnad += this._forsakringsbelopp(resultat.manadskostnad); } if (resultat.manadskostnad > 0) { resultat.manadskostnad += 0.0; } resultat.manadskostnad += data.avtalstillagg || 0.0; return resultat; }; /* Exponeras bara for testbarhet. */ wasakredit.Kalkylator.prototype._periodavgift = function(data) { var rate = 0.0695 / (12 / data.betalningstermin); var numberOfPeriods = data.aterbetalningstid / data.betalningstermin; var presentValue = -(data.finansieratbelopp + (data.kickback || 0)); var futureValue = (data.restvardebelopp || 0); var due = 0; // Efterskottsbetalning = 0, Förskottsbetalning = 1 return this._pmt(rate, numberOfPeriods, presentValue, futureValue, due); }; /* Exponeras bara for testbarhet. */ wasakredit.Kalkylator.prototype._forsakringsbelopp = function(manadskostnadinklusiveranta) { var totaltaviseratbelopp = manadskostnadinklusiveranta + 40.0000; return totaltaviseratbelopp * 0.069500000; }; /* Exponeras bara for testbarhet. */ wasakredit.Kalkylator.prototype._effektivranta = function(data) { var upplaggningsavgift = 375; var administrativavgift = 40.0000; var aterbetalningstid = data.aterbetalningstid || 0; var betalningstermin = data.betalningstermin || 0; var manadskostnad = data.manadskostnad || 0; var finansieratbelopp = data.finansieratbelopp || 0; var restvardebelopp = data.restvardebelopp || 0; var guess = 0.1; var numberOfPeriods = aterbetalningstid / betalningstermin; var payment = -(manadskostnad + administrativavgift); var presentValue = finansieratbelopp - upplaggningsavgift; var due = 0; // Efterskottsbetalning = 0, Förskottsbetalning = 1 var futureValue = -restvardebelopp; var dy = 12 / betalningstermin; var rate = this._rate(numberOfPeriods, payment, presentValue, futureValue, due, guess); var dx = 1 + (((rate * dy) * 100) / (100 * dy)); return Math.pow(dx, dy) - 1; }; /* Port av Microsoft.VisualBasic.Financial.LEvalRate (reverse engineerat m h a dotPeek). Exponeras bara for testbarhet. */ wasakredit.Kalkylator.prototype._lEvalRate = function(rate, numberOfPeriods, payment, presentValue, futureValue, due) { if (rate == 0.0) { return presentValue + payment * numberOfPeriods + futureValue; } var lEvalRate1 = Math.pow(rate + 1.0, numberOfPeriods); var lEvalRate2 = 0 == due ? 1.0 : 1.0 + rate; return presentValue * lEvalRate1 + payment * lEvalRate2 * (lEvalRate1 - 1.0) / rate + futureValue; }; /* Port av Microsoft.VisualBasic.Financial.Rate (reverse engineerat m h a dotPeek). Exponeras bara for testbarhet. */ wasakredit.Kalkylator.prototype._rate = function(numberOfPeriods, payment, presentValue, futureValue, due, guess) { if (numberOfPeriods <= 0.0) { throw 'numberOfPeriods must be greater than zero'; } futureValue = futureValue || 0.0; due = due || 0; guess = guess || 0.1; var rateUpperBoundary = guess; var lEvalRate1 = this._lEvalRate(rateUpperBoundary, numberOfPeriods, payment, presentValue, futureValue, due); var rateLowerBoundary = lEvalRate1 <= 0.0 ? rateUpperBoundary * 2.0 : rateUpperBoundary / 2.0; var lEvalRate2 = this._lEvalRate(rateLowerBoundary , numberOfPeriods, payment, presentValue, futureValue, due); var i = 0; do { if (lEvalRate2 == lEvalRate1) { rateUpperBoundary -= 1E-05; lEvalRate1 = this._lEvalRate(rateUpperBoundary, numberOfPeriods, payment, presentValue, futureValue, due); if (lEvalRate2 == lEvalRate1) { throw 'Inputs will cause division by zero.'; } } var temporaryRate = rateLowerBoundary - (rateLowerBoundary - rateUpperBoundary) * lEvalRate2 / (lEvalRate2 - lEvalRate1); var lEvalRate3 = this._lEvalRate(temporaryRate , numberOfPeriods, payment, presentValue, futureValue, due); if (Math.abs(lEvalRate3) < 1E-07) { return temporaryRate ; } lEvalRate1 = lEvalRate2; lEvalRate2 = lEvalRate3; rateUpperBoundary = rateLowerBoundary ; rateLowerBoundary = temporaryRate; i++; // i C# var det checked { ++num3; } } while (i <= 39) throw 'Cannot calculate rate'; }; /* Port av Microsoft.VisualBasic.Financial.Pmt (reverse engineerat m h a dotPeek). Exponeras bara for testbarhet. */ wasakredit.Kalkylator.prototype._pmt = function(rate, numberOfPeriods, presentValue, futureValue, due) { if (0 == numberOfPeriods) { throw 'numberOfPeriods'; } else { if (0 == rate) { return (-futureValue - presentValue) / numberOfPeriods; } var lEvalRate1 = 0 == due ? 1.0 : 1.0 + rate; var lEvalRate2 = Math.pow(rate + 1.0, numberOfPeriods); return (-futureValue - presentValue * lEvalRate2) / (lEvalRate1 * (lEvalRate2 - 1.0)) * rate; } };