Exemple #1
0
        private CalculatorResult ValidateInput(decimal mortgageLoan, double annualInterest, uint numberOfPayments)
        {
            var result = new CalculatorResult();

            if (mortgageLoan < 0)
            {
                result.Succeed = false;
                result.Error   = new CalculatorError()
                {
                    Code = MortgageCalculatorErrors.MortgageNotValid, Message = "Mortgage not valid"
                };
                this.log?.LogError($"{nameof(CalculateMontlyRateAsync)} Mortgage not valid", mortgageLoan);
            }
            else if (annualInterest < 0)
            {
                result.Succeed = false;
                result.Error   = new CalculatorError()
                {
                    Code = MortgageCalculatorErrors.AnnualInterestNotValid, Message = "Annual interest not valid"
                };
                this.log?.LogError($"{nameof(CalculateMontlyRateAsync)} Annual interest not valid", annualInterest);
            }

            return(result);
        }
Exemple #2
0
        public Task <CalculatorResult> CalculateMontlyRateAsync(decimal mortgageLoan, double annualInterest, uint numberOfPayments)
        {
            this.log?.LogTrace($"--> Enter {nameof(CalculateMontlyRateAsync)}", mortgageLoan, annualInterest,
                               numberOfPayments);
            CalculatorResult result = null;

            var sw = Stopwatch.StartNew();

            result = ValidateInput(mortgageLoan, annualInterest, numberOfPayments);

            if (result.Succeed)
            {
                double rate = 0;
                if (annualInterest == 0)
                {
                    rate = (double)mortgageLoan / numberOfPayments;
                }
                else
                {
                    var montlyInterest = annualInterest / 12;
                    var k = Math.Pow(1 + montlyInterest, numberOfPayments);
                    rate = (double)mortgageLoan * (montlyInterest * k / (k - 1));
                }

                result.Result = (decimal)Math.Round(rate, 2, MidpointRounding.AwayFromZero);
            }

            sw.Stop();

            this.log?.LogMetric($"{nameof (CalculateMontlyRateAsync)} Duration", sw.ElapsedMilliseconds);

            this.log?.LogTrace($"<-- Exit {nameof(CalculateMontlyRateAsync)}", mortgageLoan, annualInterest,
                               numberOfPayments, result);

            return(Task.FromResult(result));
        }